BLE: iOS后台应用程序UUID广告

7
正如iOS文档所述,当使用BLE作为外围设备的iOS应用程序移动到后台模式时,本地名称不会被广告,并且所有服务UUID都被放置在溢出区域。文档指出,它们只能被iOS设备发现。
我的总体问题是,在更低的级别上,这究竟是如何发生的。使用非iOS蓝牙数据包嗅探器,我检查了我的iOS外围应用程序在前台和后台模式下的广告数据结构。前台模式下的广告数据结构看起来与预期相同,类似于来自Android设备的其他广告数据。
当iOS应用程序处于后台模式时,此结构会发生变化,并且服务UUID不明显。我没有看到任何暗示“溢出”区域的内容。
如果UUID不是广告数据包的一部分,iOS中央设备如何发现处于后台模式的外围设备?

这里有一些信息 - http://stackoverflow.com/questions/21284226/ios-peripheral-device-in-background 我的猜测是,当iOS检测到苹果特定的制造商数据广告时,它会启动与设备的连接以检索广告服务UUIDs。 - Paulw11
我的经验一直都是使用中央模式,但我对你在文档中提到的scanForPeripheralsWithServices:options方法中作为选项指定的CBCentralManagerScanOptionSolicitedServiceUUIDsKey键很好奇,想知道这是否是用于在该模式下传递服务UUID以发现外围设备的方式。 - Marcus Adams
谢谢你们两位的帮助。如果扫描设备(中央)是非iOS设备,我仍然无法解决这个问题。根据我在其他帖子中阅读到的内容,我了解到如果中央是iOS设备,则会调用didDiscoverPeripheral两次,第二次包含扫描响应。在外围设备方面,有没有我可以实现以检测这两个事件的委托/回调函数? - cnbecom
你好,我也遇到了同样的问题。我正在使用树莓派来嗅探蓝牙数据包。由于应用程序在后台进行广告推送,因此树莓派无法识别哪个设备发出了接收到的BLE数据包。你有关于这个问题的任何信息或解决方法吗? - prasad1250
CBCentralManagerScanOptionSolicitedServiceUUIDsKey对于想要查找一组外围设备的人非常有用。在这里,您可以提供作为数组发布的服务uuid,然后在调用scanForPeripheralsWithServices时将该数组提供,并将CBCentralManagerScanOptionSolicitedServiceUUIDsKey设置为true。通过这种方式,当发现发布我们在上面数组中提到的任何uuid之一的外围设备时,iOS会通知您的应用程序。希望这有所帮助! - prasad1250
1个回答

7

苹果文档介绍,存在所谓的溢出区域。有关Core Bluetooth概念的更多信息可以在此存档页面中找到。

我已经嗅探了空气中的数据包。您可以在github上阅读详细信息。iOS所做的是广播自定义包,并使用特定位表示UUID。例如,UUID 3333由在BLE包中上升的位表示。

04 3E 24 02 01 00 01 8C 91 A0 AD 8F 40 18 02 01 1A 14 FF 4C 00 01 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 D3

在这里,你可以看到02被零包围(在D3之前的8位RSSI值)。

每个UUID都被编码为此范围内的一位。这将导致冲突。如果您通过一个iPhone发送1001并通过另一个iPhone扫描3333,则会收到广告,就好像发送了UUID 3333一样。

请注意,有很多关于此的胡言乱语。这只是一个普通的未定向BLE数据包。它不是扫描响应。在后台运行时,我已经可靠地每0.2秒得到BLE数据包。

enter image description here

时间在x轴上(持续数天)。 消息之间的间隔在y轴上绘制。您可以看到,有时间隔是0.2秒的倍数。但是,您还会发现,这是在三个iPhone之间共享的(一个广播1000,一个广播FFFF,另一个后台广播3333)。这意味着这是笔记本电脑接收消息的一个副产品。iPhone可能比这更强大。整个周末电池下降约为25%,这很可能与BLE广播无关。

重要的是在这里添加,你的博客文章 @annevanRosum从iOS 12开始,这些数据是SCAN_RSP数据包的一部分。我可以通过nrf sniffer和Wireshark确认这一点。 有趣的是,ADV_IND(广告)数据包包含8个字节的制造商特定部分的数据,这些数据似乎是随机的,我找不到任何关联/反向工程它们的方法。我也不知道现在是否会因为蓝牙5.0而在未来的iOS版本中发生任何变化。 https://developer.apple.com/videos/play/wwdc2017/712/ - Andreas Papageorgiou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接