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

正如iOS文档所述,当使用BLE作为外围设备的iOS应用程序移至后台模式时,不会公布本地名称,并且所有服务UUID都将放置在溢出区域中。 该文档指出它们只能由iOS设备发现。

我的整体问题是如何在较低的层面上发生这种情况。 使用非iOS蓝牙数据包嗅探器,当我处于前台和后台模式时,我检查了我的iOS外围应用程序中的广告数据结构。 前台模式中的广告数据结构看起来是预期的,类似于来自非iOS设备的其他广告数据,例如我来自Android设备的那些。

当iOS应用程序为后台模式时,此结构会更改,并且服务UUID不明显。 我没有看到任何暗示“溢出”区域的东西。

如果UUID不是广告数据包的一部分,iOS中央设备如何发现处于后台模式的外围设备?

根据Apple文档,有一个所谓的溢出区域。 有关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 00 00 00 00 00 00 00 00 00 D3

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

每个UUID都在此范围内进行一次热编码。 这将导致碰撞。 您会注意到,如果您通过一部iPhone发送1001并通过另一部iPhone扫描3333 ,您将收到广告,就像发送UUID 3333

请注意,有很多关于此的废话。 它只是一个常规的无向BLE数据包。 这不是扫描响应。 在后台运行时我每隔0.2秒就可靠地获得BLE数据包。

在此处输入图像描述

时间在x轴上(几天)。 消息之间的间隔绘制在y轴上。 您会看到有时间隔是0.2秒的倍数。 但是,您还会看到这是在三个iPhone之间共享的(一个广播1000 ,一个广播FFFF ,一个广播3333在后台)。 这意味着这是接收消息的笔记本电脑中的工件。 iPhone可能比这更强大。 在整个周末,电池电量下降了25% ,这很可能与BLE广播以外的其他事情有关。