【问题标题】:scanForPeripheralsWithServices on iOS not finding devices by service UUIDiOS 上的 scanForPeripheralsWithServices 未按服务 UUID 查找设备
【发布时间】:2015-09-29 03:18:58
【问题描述】:

我正在使用 scanForPeripheralsWithServices 按服务 UUID 扫描设备。当我使用一些标准的服务 UUID 值时,它有时会起作用。

当我尝试使用自定义服务 UUID 时,它通常找不到任何设备,但如果我将 nil 用于服务 UUID 列表,它会找到在我使用他们的服务 UUID 时找不到的相同设备。

发生了什么事?难道是因为设备的广告包只能广告它的部分服务?

【问题讨论】:

  • 外设通告的集合服务通常小于外设提供的服务。这是因为广告中的空间有限,因此宣传“主要”服务是有意义的。例如,心率设备可能会提供心率服务、设备信息服务和电池服务,但它只会宣传心率服务,因为这是其他设备会“感兴趣”的服务。一旦他们识别了设备并连接到它,他们就可以根据需要发现设备信息和电池服务
  • 这个应用程序是一个有用的测试工具 - itunes.apple.com/au/app/lightblue-explorer-bluetooth/… 如果它可以找到您的设备,那么您可能会怀疑您的代码。
  • 谢谢。我在想这可能是广告包的大小有限。我将试用该实用程序并查看它报告的内容。请发表您的评论作为答案,以便我将其标记为答案。

标签: ios bluetooth


【解决方案1】:

外围设备广告的服务集通常小于它提供的服务。这是因为广告中的空间有限,因此只宣传“主要”服务是有意义的。

来自Apple Core Bluetooth Programming Guide-

广告时可以使用的空间也有限制 数据。当您的应用程序处于前台时,它最多可以使用 28 个字节的 两者任意组合的初始广告数据中的空间 支持的广告数据密钥。如果这个空间用完了,还有 扫描响应中额外的 10 字节空间可以使用 仅用于本地名称。任何不适合的服务 UUID 分配的空间被添加到一个特殊的“溢出”区域;他们可以 仅由显式扫描它们的 iOS 设备发现。 当您的应用程序在后台时,不会宣传本地名称 并且所有服务 UUID 都放置在溢出区域中。

为了帮助您保持在这些空间限制范围内,请限制服务 您向那些识别您的主要服务的人宣传的 UUID。

例如,心率设备可能会提供心率服务、设备信息服务、电池服务等,但它只会宣传心率服务,因为这是其他设备会“感兴趣的服务” " 因为它将此设备与其他类别的设备区分开来。

一旦设备被识别并建立连接,如果需要,可以发现其他服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多