为什么无法发现特定的 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 浪费大部分有效负载是很常见的。
我正在使用以下代码进行扫描:
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 浪费大部分有效负载是很常见的。