重新连接/恢复

时间:2017-12-08 09:32:47

标签: ios bluetooth-lowenergy core-bluetooth cbperipheral cbcentralmanager

在我的iOS应用程序中,我能够成功连接到BLE外围设备,发现服务并订阅特征,以便在特征值发生变化时通知应用程序。只要app在后台运行,所有这些都没有问题。

但是当状态恢复发生时会出现问题。在centralManager:willRestoreState:方法中,我可以使用retrieveConnectedPeripheralsWithServices:方法检索以前连接的外围设备。但是当我在检索到的外围设备上调用discoverServices:方法时,没有任何反应。永远不会调用peripheral:didDiscoverServices:方法。检索到的外围设备服务属性的值也为空。 iOS不会缓存服务和特征吗?

注意:我们的BLE外围设备最初宣传服务。当应用程序第一次启动时,它会从外围设备读取值并将用户特定数据写入特征。邮政写作,外围停止广告服务。但是固件工程师声称即使服务被外围设备停止,从状态恢复中检索的外围设备也应该具有缓存服务。这是真的吗?

1 个答案:

答案 0 :(得分:2)

您是否检查过通过retrieveConnectedPeripheralsWithServices:检索到的外围设备的连接状态? CoreBluetooth框架有一些你需要注意的怪癖,一个是retrieveConnectedPeripheralsWithServices:方法的行为:

当您通过上述方法获取外围设备时,它们可能只能连接到系统级(iOS),而不能连接到您的应用程序中(请参阅API文档中的“讨论”部分)。因此,您仍然需要在外围设备上调用connect才能正确使用它们。以下是API documentation

中的相应部分
  

连接的外围设备列表可以包括那些由其他应用程序连接的外围设备,这些外围设备需要先使用connectPeripheral:options:方法在本地连接才能使用。

关于服务的缓存:iOS缓存任何发现的服务和相应的特征。只有强制iOS更新缓存的方法:

  • BLE电源循环,例如,在设置应用中关闭和打开BLE或重新启动iOS设备
  • 从外围端通过GAP服务发送服务已更改通知(需要有效连接)

注意:您还可以通过Bluetooth Configuration Profile激活蓝牙堆栈中的日志消息。在调试BLE相关问题时,它们非常有用,特别是涉及自定义硬件时(即使日志使用起来有点麻烦)。