为什么无法发现特定的 BLE 外设服务?

Why can't a specific BLE peripheral service be discovered?

我正在使用以下代码进行扫描:

self.centralManager?.scanForPeripherals(withServices: serviceUUID, options: nil)

如果我用 nil 替换 serviceUUID 或将其定义为

let serviceUUID = [CBUUID(string:"1803")]

但不适用于

let serviceUUID = [CBUUID(string:"00001803-494c-4f47-4943-544543480000")]

用 Lightblue 仔细检查,但服务 UUID 似乎没有任何错别字。 Lightblue screenshot

我相信 0x1803 的 128 位 UUID 版本应该是 00001803-0000-1000-8000-00805F9B34FB。浅蓝色是在 "Advertisement Data (Service UUIDs)" 下向您显示此值还是在 00001803-494c-4f47-4943-544543480000 下向您显示此值?因为不管设备通过 GATT 响应的 actual 服务 UUID,scanForPeripherals 只会去 return 具有 [=16] 中指定服务 UUID 的设备=]广告数据.

我认为 Larme 已经给出了适当的解决方案,但我会将其表述为答案而不是评论,因为评论可能被忽略了。

您扫描在其广告数据中公开特定服务的外围设备。这意味着整个字符串 00001803-494c-4f47-4943-544543480000 必须是广告数据的一部分。如果没有找到设备,但如果它适用于 1803,那么设备似乎只有 1803 作为服务信息广播。

请检查设备的广告数据。如果他们只暴露了16位的UUID,你已经找到问题的原因了。

请记住,广告数据的长度限制为 31 个字节,每个项目的长度和数据类型声明进一步减少了这一长度。因此,仅广播 16 位 UUID 而不会为 128 位 UUID 浪费大部分有效负载是很常见的。