【发布时间】:2020-08-17 04:32:17
【问题描述】:
Apple 在 iOS 上用于后台 GATT 服务广告的专有技术如何工作?
根据 Apple 的文档,当使用 CoreBluetooth 实现 BLE 外设的 iOS 应用程序在后台时,服务 UUID 不再广告,而是放在一个特殊的“溢出区域”:
CBAdvertisementDataServiceUUIDsKey 键的值中包含的任何不适合分配空间的服务 UUID 都会进入一个特殊的“溢出”区域。这些服务只能由显式扫描它们的 iOS 设备发现。 当您的应用程序在后台时,不会公布本地名称,并且所有服务 UUID 都在溢出区域中。 -- developer.apple.com
但是这个“溢出区域”是什么?它是如何工作的?
I set up a bluetooth sniffer and captured the BLE data exchange,但未能找到此服务 UUID 的任何通信。前台的第二台 iOS 设备反复成功地发现后台 iOS 设备上的服务广告,但the packet capture 从未记录过服务 UUID。
那么这是如何工作的呢?
如果我能弄清楚它是如何工作的,我想尝试对 Android 设备进行编程以使用相同的进程。
【问题讨论】:
-
你读过github.com/crownstone/bluenet-ios-basic-localization/blob/…吗?制造商数据似乎包含服务集的小指纹/哈希,因此可以对其进行缓存。 iOS 中心没有对外围设备进行服务发现吗?你应该改用 nRF 嗅探器,它可以很容易地与 wireshark 一起使用,并且通常会捕获任何通道上的连接请求,因为当它在 37 上看到一个 adv 数据包时,它会切换到 ch 38,然后切换到 ch 39,然后再返回。
-
我没有看过那篇文章。迷人!它说专有制造商广告包含位图哈希,其中任何位置的 1 表示正在广告服务 UUIDS 子集的任何一个。如果为真,则表明所宣传的服务 uuid 从未真正被 iOS 知道或检查过。如果设置了所需服务 UUID 的位,则中心会收到发现回调,即使广告来自 iPhone 广告不同的服务 UUID,该服务 UUID 由于哈希冲突而碰巧也使用该位。我会做一些测试来确认。谢谢,埃米尔!
标签: ios bluetooth-lowenergy core-bluetooth bluetooth-gatt