iOS - 如何在BLE外设上发现未经过广泛传播的服务

时间:2017-08-26 14:19:30

标签: ios bluetooth-lowenergy gatt

我有这款北欧nRF52 BLE外设,不会宣传其服务。我能够连接到它,但无法在iOS上发现服务。由于我知道服务UUID,我试图将它们传递给General Discoverable函数。但这不起作用。

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

在外设上,GAP广告标志设置为LightBlue。使用nRF ConnectTimeout interrogating the peripheral等应用,我会看到外围设备的名称和UUID,但没有服务。连接LightBlue应用程序后,几秒钟后会显示错误([peripheral discoverServices:nil];)。

在Android上发现未经修改的服务工作正常。

Core Bluetooth Programming Guide开始,它应该基本上起作用:

  

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

有没有人知道SDK中的差异是什么,以及是否有可能在iOS上发现未经过广告的未公开服务?

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

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:4)

这听起来更像是NRF52固件中的问题。我已经使用NRF51和NRF52系列多年了,它们肯定适用于iOS和Android设备。

BLE广告和服务发现

关于BLE广告和服务发现的一些一般信息:

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

<强>调试

解决问题的一些想法:

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

  2. 尝试使用NRF5 SDK附带的一些示例,并检查它们是否有效。如果示例有效(他们应该这样做),那么您的固件肯定存在问题。

  3. 确保在固件中正确处理GAP和GATT事件。 iOS和Android设备都不符合蓝牙4.0+标准。 Nordic Semiconductor已经在他们的SDK和SoftDevice中考虑了一些这些怪癖。你一定要检查GAP和GATT事件的日志(基本上是固件中的ble_evt_handler),并参考Nordic Devzone,其中大部分怪癖已经解决了。

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

  5. 希望有所帮助。

答案 1 :(得分:1)

您无法发现未公布的服务,因为未公开意味着无法访问,禁用等等。

LighBlue向您展示UUID这是真的,但它是设备UUID 而不是服务UUID ,就是这种情况。

要扫描外围设备,您可以使用CoreBluetooth CoreBluetooth是一个框架,它提供应用程序与配备BLE的设备进行通信所需的类。

您可以使用方法CoreBluetooth开始使用scanForPeripheralsWithServices:options:扫描外围设备。作为此方法的参数之一,您需要传递services UUIDs的数组 发现的服务将以方法centralManager:didDiscoverPeripheral:advertisementData:RSSI:提供。

  

在Android上发现服务工作得很好。

这是真的。 Android允许扫描您周围的所有可用服务。不幸的是iOS没有。为什么? Apple解释说:

  

发现所有外围设备的服务和相关特性会对电池寿命和应用程序性能产生负面影响。因此,您应该只查找并发现应用所需的服务和相关特征。

所以,要获得services UUID(因为我们需要使用CoreBluetooth执行扫描),您可以使用Android应用程序(BLE扫描程序),或者从框中读取services UUID你的设备。