断开SWIFT中的BLE外设

时间:2015-10-21 15:35:46

标签: ios swift bluetooth bluetooth-lowenergy core-bluetooth

我在Swift中断开BLE外设有一些问题。首先,我尝试仅使用cancelPeripheralConnection:函数。但是,如果我只调用此函数,则永远不会调用didDisconnectPeripheral函数。所以我尝试按照Apple's参考指南进行操作。有人说,你应该在断开连接之前删除每个通知。这真的有必要吗?是否有可能一步取消所有通知?我设置了很多通知,因此我必须搜索许多服务和特征才能重置它们。我想,这不是一个“做得好”的解决方案。

修改 好吧,我发现cancelPeripheralConnection效果非常好,如果我在我的BluetoothManager课程中调用它,其中包含CBCentralManagerCBPeripheralDelegate ...有没有办法断开与此功能之外的外围设备?

编辑4:

import UIKit

class ValueCollectionView: UICollectionViewController
{
    var valueCollectionViewCell: ValueCollectionViewCell = ValueCollectionViewCell()
    var bluetoothManager: BluetoothManager = BluetoothManager()

    override func viewDidLoad()
    {
        super.viewDidLoad()
        self.navigationItem.hidesBackButton = true
        let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "back:")
        self.navigationItem.leftBarButtonItem = newBackButton;
    }

    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
    }

    func back(sender: UIBarButtonItem)
    {
        bluetoothManager.disconnectPeripheral(selectedPeripheralIndex!)
        self.navigationController?.popViewControllerAnimated(true)
    }
//Some Collection View functions...
}

这是我disconnectPeripheral功能的实现(集成在BluetoothManager类中):

func disconnectPeripheral(peripheralIndex: Int)
{
    CBmanager.cancelPeripheralConnection(peripheralArray![peripheralIndex].peripheral)
}

但无论如何,如果我调用此函数,则不会调用didDisconnectPeripheral函数。当我将该功能放入BluetoothManager类时,例如在我发现最后一个特征后,一切正常。

编辑5:

class BluetoothManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate
{
    var CBmanager: CBCentralManager = CBCentralManager()

    override init()
    {
        super.init()
        self.CBmanager = CBCentralManager(delegate: self, queue: nil)
    }

    func connectPeripheral(peripheralIndex: Int)
    {
        CBmanager.connectPeripheral(peripheralArray![peripheralIndex].peripheral, options: nil)
    }

    func disconnectPeripheral(peripheralIndex: Int)
    {
        CBmanager.cancelPeripheralConnection(peripheralArray![peripheralIndex].peripheral)
    }

//The other CentralManager functions...

}

1 个答案:

答案 0 :(得分:6)

对于您的第一个疑问,是的,我们应该在从Apple Documentation中给出的原因断开与外围设备的连接之前取消注册已订阅的特征:

  

注意: cancelPeripheralConnection:方法是非阻止的,任何方法   CBPeripheral类命令仍在等待外围设备   你试图断开可能会或可能不会完成执行。因为   其他应用程序可能仍然连接到外围设备,取消了   本地连接不保证底层物理链路   立即断开连接。但是,从你的应用程序的角度来看,   外围设备被认为是断开连接,以及中央管理器对象   调用它的centralManager:didDisconnectPeripheral:error:方法   委托对象。

现在,回答你的另一个问题 -

  

有没有办法断开此功能以外的外围设备?

您需要将其与实例化的实例断开连接并开始连接。只要你可以在同一个对象上调用取消它就可以工作。

myCentralManager.cancelPeripheralConnection(peripheral)

在我的应用程序中,我不得不使用来自许多不同类的BLE功能,这使我编写了一个单例MyBLEManager,并且所有类都来到了这个单例中,用于所有与BLE相关的活动。这笔交易非常有用,只能帮助排除一个课程。你可以尝试一下。