【问题标题】:Why can't a specific BLE peripheral service be discovered?为什么无法发现特定的 BLE 外围服务?
【发布时间】:2017-01-19 21:38:32
【问题描述】:

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

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

如果我将serviceUUID 替换为nil 或将其定义为,这很好用(我的tableview 填充了BLE 设备)

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

但它不适用于

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

使用 Lightblue 进行了双重检查,但服务 UUID 似乎没有任何拼写错误。 Lightblue screenshot

【问题讨论】:

  • 你可以扫描寻找servicesUUID,它已经被设备广播了,也就是说必须在外设的advertisingData中找到。如果没有,就找不到了。但是设备通常不会广播所有的 UUID,它们通常会广播一两个细节(例如,要知道它们来自那家公司,或者提供的设备类型,例如它们具有血压服务的类型,等)
  • 试试let serviceUUID = [CBUUID(string:"00001803-494C-4F47-4943-544543480000")],大写字母?我不记得它是否区分大小写。或者只是在选项中使用nil,将广告数据记录在didDiscoverPeripheral: 中并在此处复制粘贴找到的值。
  • 感谢 Larme,尝试了大写和相同的结果,不区分大小写。我会尝试你的建议并从那里开始工作。

标签: ios swift bluetooth-lowenergy core-bluetooth


【解决方案1】:

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

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

请检查设备的广告数据。如果他们只公开 16 位 UUID,那么您已经找到了问题的原因。

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

【讨论】:

  • 谢谢 Nebr - 我在广告服务的原始问题中添加了从 Lightblue 截取的屏幕截图链接;整个字符串被广播。
  • 如果我正确理解屏幕截图,“Service UUIDs”项只包含字符串“1803”。这就是根据参数 serviceUUID 检查的项目。这就是为什么 1803 可以工作,但完整的 128 位 UUID 不能工作的原因。
  • 我非常专注于查看所有这些 128 位 UUID,以至于我确实不认为服务 UUID 1803 是要查找的“那个”UUID,我正在查看(完整的 128 位) UUID 位于广告数据部分下方 - 非常感谢 Nebr!
【解决方案2】:

我相信 0x1803 的 128 位 UUID 版本将是 00001803-0000-1000-8000-00805F9B34FB。 Light Blue 是在“广告数据(服务 UUID)”下向您显示此值还是向您显示 00001803-494c-4f47-4943-544543480000?因为无论设备通过 GATT 响应的实际服务 UUID 是什么,scanForPeripherals 只会返回具有广告数据中指定服务 UUID 的设备。 p>

【讨论】:

  • 是的,Lightblue 正在显示准确的服务 UUID;我在原始帖子中添加了一个屏幕截图的链接。 PS:我尝试了您对 128 位版本的建议,但没有得到采纳。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多