iOS-如何在BLE外设上发现未发布的服务

jim*_*jim 2 ios bluetooth-lowenergy gatt

我得到了这个不公布其服务的Nordic nRF52 BLE外围设备。我可以连接到它,但是无法在iOS上发现服务。由于我知道服务UUID,因此我尝试将它们传递给discoverServices函数。但这是行不通的。

大约30秒后,它终于断开连接。

在外围设备上,GAP广告标记设置为General Discoverable。使用LightBlue或之类的应用程序,nRF Connect我看到外围设备的名称和UUID,但没有任何服务。与LightBlue应用程序连接时,几秒钟后显示错误(Timeout interrogating the peripheral)。

在Android上,发现未发布的服务就可以了。

从《核心蓝牙编程指南》开始,它基本上应该可以工作:

建立与外围设备的连接后,您可以浏览其数据。探索外围设备必须提供的第一步是发现其可用的服务。由于外围设备可以发布的数据量受到大小限制,因此您可能会发现外围设备提供的服务多于其发布的(在其广告包中)所提供的服务。您可以通过调用外围设备的discoverServices:方法来发现外围设备提供的所有服务,如下所示:[peripheral discoverServices:nil];

有谁知道SDK的区别是什么,以及是否有可能像Android一样在iOS上发现未发布的服务?

我了解到,缓存外设时,iOS能够直接连接,跳过发现过程。但是将外围设备缓存后,需要配对一次。有没有办法手动设置缓存?

感谢任何帮助,谢谢!

Jen*_*der 5

这听起来更像是NRF52上固件的问题。我使用NRF51和NRF52系列已有数年了,它们肯定可以在iOS和Android设备上使用。

BLE广告和服务发现

有关BLE广告和服务发现的一些常规信息:

BLE广告包的大小非常有限(准确地说是31个字节,不包括溢出区域)。这意味着您无法宣传外围设备支持的所有服务,并且该空间也可能与其他信息(外观,名称,制造商数据等)共享。您甚至根本不需要广告任何服务,甚至可以广告您的外围设备不支持的服务。无论发现的服务是什么,服务发现均有效。

调试

解决问题的一些建议:

  1. 一旦发现服务,特征和描述符,iOS会对其进行缓存,直到下一个电源循环(关闭并重新打开蓝牙或重新启动iOS设备)为止。如果您已更改固件中的基础服务等,但未使用“服务已更改标志”来指示更改,则可能导致某些意外行为。因此,请确保相应地从外围设备发送“服务已更改”标志。

  2. 尝试使用NRF5 SDK随附的一些示例,并检查它们是否有效。如果这些示例正常工作(它们应该这样做),则固件肯定存在问题。

  3. 确保在固件中正确处理了GAP和GATT事件。iOS和Android设备均不100%兼容Bluetooth 4.0+标准。Nordic Semiconductor已经在其SDK和SoftDevice中考虑了其中的一些问题。您绝对应该检查一下GAP和GATT事件的日志(基本上是固件中的ble_evt_handler),并参考Nordic Devzone中已解决了大多数怪癖的地方。

  4. 检查在固件中读写服务和特征元数据的权限。我有一个类似的问题,我不小心将我的特征的读取权限设置为no access

希望能有所帮助。

  • 解决了!问题是固件没有响应BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST和BLE_GATTS_EVT_SYS_ATTR_MISSING。这导致CoreBluetooth超时,从而关闭了连接。非常感谢你的帮助。 (3认同)