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能够直接连接,跳过发现过程。但是将外围设备缓存后,需要配对一次。有没有办法手动设置缓存?
感谢任何帮助,谢谢!
这听起来更像是NRF52上固件的问题。我使用NRF51和NRF52系列已有数年了,它们肯定可以在iOS和Android设备上使用。
BLE广告和服务发现
有关BLE广告和服务发现的一些常规信息:
BLE广告包的大小非常有限(准确地说是31个字节,不包括溢出区域)。这意味着您无法宣传外围设备支持的所有服务,并且该空间也可能与其他信息(外观,名称,制造商数据等)共享。您甚至根本不需要广告任何服务,甚至可以广告您的外围设备不支持的服务。无论发现的服务是什么,服务发现均有效。
调试
解决问题的一些建议:
一旦发现服务,特征和描述符,iOS会对其进行缓存,直到下一个电源循环(关闭并重新打开蓝牙或重新启动iOS设备)为止。如果您已更改固件中的基础服务等,但未使用“服务已更改标志”来指示更改,则可能导致某些意外行为。因此,请确保相应地从外围设备发送“服务已更改”标志。
尝试使用NRF5 SDK随附的一些示例,并检查它们是否有效。如果这些示例正常工作(它们应该这样做),则固件肯定存在问题。
确保在固件中正确处理了GAP和GATT事件。iOS和Android设备均不100%兼容Bluetooth 4.0+标准。Nordic Semiconductor已经在其SDK和SoftDevice中考虑了其中的一些问题。您绝对应该检查一下GAP和GATT事件的日志(基本上是固件中的ble_evt_handler),并参考Nordic Devzone中已解决了大多数怪癖的地方。
检查在固件中读写服务和特征元数据的权限。我有一个类似的问题,我不小心将我的特征的读取权限设置为no access。
希望能有所帮助。
| 归档时间: |
|
| 查看次数: |
1903 次 |
| 最近记录: |