iOS:scanForPeripheralsWithServices 无法找到设备,而 nRF Connect 应用程序能够找到它

Posted

技术标签:

【中文标题】iOS:scanForPeripheralsWithServices 无法找到设备,而 nRF Connect 应用程序能够找到它【英文标题】:iOS: scanForPeripheralsWithServices can't find device while nRF Connect app is able to find it 【发布时间】:2020-09-24 15:28:37 【问题描述】:

我有一个 BLE 外围设备在 Raspberry Pi 上运行,gobbledegook。

同时,我有一个 ios 应用程序作为 BLE 中心运行,它使用 nil 执行 scanForPeripheralsWithServices 以检测周围的所有设备。

我能够检测到一些设备,但不是在 Raspberry Pi 上运行的设备。 但是,在 iOS 上使用 nRF Connect 应用扫描时,我可以看到它。

这怎么可能? (我假设 nRF Connect 也在使用 Core Bluetooth...)

【问题讨论】:

【参考方案1】:

您可能正在做某事(例如使用 nRF Connect 应用程序)连接到设备,导致它停止广告。大多数 BLE 平台在连接后都会停止广告。

使用retrieveConnectedPeripherals(withServices:) 检测已连接的设备。您必须提供服务清单;无法检测当前连接的所有设备。

由于这是在 Pi 上,您还可以在该端验证系统当前是否真的在做广告,以及它是否有任何连接。核心蓝牙进行广泛的缓存,这可能会导致看起来正在发生的事情实际上是从缓存中出来的。我最近没有深入研究 nRF 应用程序来验证它对缓存的依赖程度。我还建议使用 LightBlue 进行测试,并同时使用多台设备进行测试(我通常在 iOS、android 和 Mac 上使用多个应用,偶尔还会使用 Ubertooth,以验证我所看到的是否属实)。

另请注意,一旦您从设备上看到过一次广告,在扫描期间您将不会再看到任何内容,除非您在扫描选项中将 CBCentralManagerScanOptionAllowDuplicatesKey 设置为 true。该标志在后台被忽略。在这种情况下,这可能不是问题,但经常使习惯于其他平台的人绊倒。同样,扫描特定服务而不是 nil 几乎总是更快、更可靠,除非您正在构建通用 BLE 扫描仪。 (同样,我怀疑这就是本案的问题。)

【讨论】:

谢谢罗伯。我在较新的 iPhone 上进行了另一次扫描,并且能够使用我的 Core Bluetooth 测试应用程序检测到我的 Rpi 外围设备。然后我连接到外围设备并能够接收特征通知。但从那以后,再次运行测试应用程序时,我无法再检测到外围设备(请注意,我正在使用 CBCentralManagerScanOptionAllowDuplicatesKey = YES。)关于 LightBlue:我什至无法看到列出的 Rpi 外围设备。至于 nRF 连接和缓存:奇怪的是,即使我的 Rpi 外围设备没有运行,它仍然会被列出。我现在一无所知... 我在 BLE 平台上全职工作,LightBlue 是我们的黄金标准。在应用程序或 Rpi 方面,您可能会做错很多事情。我经常在 Android 上编写小型测试应用程序,以从不同的方向进行检查。你需要确保你的广告是正确的。有很多规则。我对 GGK 一无所知,所以我无法告诉您它是否开箱即用,或者您是否需要仔细配置所有内容。我强烈建议您熟悉 BLE 规范:bluetooth.com/specifications/bluetooth-core-specification 在大多数情况下,您会花时间在 CSS,A 部分,第 1 节,它定义了所有不同的数据结构。不幸的是,学习曲线非常陡峭,BLE 与其他类型的网络不同。但继续挖掘。一旦你掌握了基础知识并了解了在哪里查看,它是可知的,并且实际上在规范中有很好的记录。

以上是关于iOS:scanForPeripheralsWithServices 无法找到设备,而 nRF Connect 应用程序能够找到它的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别