断开Core Bluetooth后,如何重新连接设备

时间:2012-11-08 09:49:55

标签: ios bluetooth core-bluetooth

在核心蓝牙中,连接到设备后,我关闭设备并断开设备连接。但是当我再次打开设备时,没有再次调用didDiscoverPeripheral。如何重新连接设备?

4 个答案:

答案 0 :(得分:14)

当您使用cancelPeripheralConnection断开设备时,将调用didDisconnectPeripheral委托方法。但是,从iOS 6.0开始,设备会保持连接大约40-50秒(或更长时间),因此在该时间范围内不会调用didDiscoverPeripheral。如果您想再次“发现”它,只需调用retrieveConnectedPeripherals方法即可获得didRetrieveConnectedPeripherals中的引用。

但是,最佳解决方案是保存设备的UUID并使用它重新连接retrievePeripherals方法。这将调用didRetrievePeripherals,您可以重新连接connectPeripheral。这是重新连接设备的最快方法,在这种情况下不需要扫描。

答案 1 :(得分:3)

使用scanForPeripheralsWithServices进行扫描时,通常只会通知您一次特定的设备地址。您可以通过指定选项CBCentralManagerScanOptionAllowDuplicatesKey来更改此值以报告重复项。或者,您可以让应用检测到其他设备使用超时断开连接,然后重新开始扫描。

答案 2 :(得分:2)

在CoreBluetooth中,所有管理都由应用层完成。 在您的情况下,我要做的是听取断开事件而不是同一事件,重新连接外围设备。 连接方法价格低廉,可确保在设备返回范围时重新连接设备。

请注意,如果明确断开设备连接,则会收到相同的disconnect事件,但您无需调用重新连接方法。

答案 3 :(得分:0)

@Andras给了我正确的道路,但是自从iOS7以来,他的答案就不完整了。

重新连接到以前的设备的最佳方法是使用retrievePeripherals(withIdentifiers:)方法。

此方法不调用委托,而是直接返回Peripheral的列表,与传入参数中的UUID的列表相对应。

if let peripheral = self.centralManager.retrievePeripherals(withIdentifiers: [uuid]).first {
    self.peripheral = peripheral // <-- super important
    self.centralManager.connect(peripheral, options: nil)
}

请检查上面代码的“超级重要”行:方法connect(_:option:)不会保留外围设备,如果您自己不这样做,则由于外围设备的连接永远不会发生任何回调对象将被摧毁。