【问题标题】:CoreBluetooth peripheral service becomes empty while reconnecting/restoringCoreBluetooth 外围服务在重新连接/恢复时变为空
【发布时间】:2018-05-22 12:31:12
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    • BLE 电源循环,例如,在“设置”应用中关闭和打开 BLE 或重新启动您的 iOS 设备
    • 通过 GAP 服务从外围设备发送 Services Changed 通知(需要活动连接)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-14
      • 2019-05-31
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多