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

iOS - How to discover unadvertised services on a BLE peripheral

我得到了这个 Nordic nRF52 BLE 外围设备,它没有宣传其服务。我可以连接到它,但无法在 iOS 上发现服务。因为我知道服务 UUID,所以我尝试将它们传递给 discoverServices 函数。但这不起作用。

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

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

在 Android 上发现未公布的服务工作得很好。

Core Bluetooth Programming Guide 开始,它应该基本上可以工作:

After you have established a connection to a peripheral, you can explore its data. The first step in exploring what a peripheral has to offer is discovering its available services. Because there are size restrictions on the amount of data a peripheral can advertise, you may discover that a peripheral has more services than what it advertises (in its advertising packets). You can discover all of the services that a peripheral offers by calling the peripheral’s discoverServices: method, like this: [peripheral discoverServices:nil];

有谁知道 SDK 的区别是什么,是否有可能像 Android 那样在 iOS 上发现未公开的服务?

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

感谢任何帮助,谢谢!

您无法发现非广告服务,因为非广告意味着无法访问、禁用等。

LighBlue 向您展示 UUID 这是真的,但它是 device UUID 而不是 service UUID 而这就是案件。

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

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

中可用

On Android discovering services works just fine.

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

Discovering all of a peripheral’s services and associated characteristics can negatively affect battery life and your app’s performance. Therefore, you should look for and discover only the services and associated characteristics your app needs.

因此,要获得 services UUID(因为这是我们使用 CoreBluetooth 执行扫描所需要的),您可以使用 Android 应用程序(一种 BLE 扫描仪)或阅读 services UUID 来自您设备的包装盒。

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

BLE 广告和服务发现

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

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

调试

解决问题的一些想法:

  1. iOS 缓存已发现的服务、特征和描述符,直到下一次电源循环(关闭并再次打开蓝牙或重新启动 iOS 设备)。如果您更改了固件中的底层服务等,但没有使用服务更改标志来指示更改,这可能会导致一些意外行为。因此,请确保相应地从外围设备发送服务更改标志。

  2. 尝试一些 NRF5 SDK 附带的示例并检查它们是否有效。如果示例有效(它们应该有效),则您的固件肯定有问题。

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

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

希望对您有所帮助。