BLE 设备在不扫描时是不是会读取广告数据包? (自动连接)

Posted

技术标签:

【中文标题】BLE 设备在不扫描时是不是会读取广告数据包? (自动连接)【英文标题】:Does a BLE device reads advertising packets when not scanning? (autoconnect)BLE 设备在不扫描时是否会读取广告数据包? (自动连接) 【发布时间】:2016-09-21 09:46:05 【问题描述】:

我在某些地方读到,广告包被发送到距离范围内的每个人。但是,其他设备应该扫描以接收它们还是无论如何都会接收它?

问题: 假设我正在 5 或 6 个 BLE 设备之间建立一个微微网。在某些时候,我在奴隶和一位主人之间建立了一些联系。然后,如果其中一个设备被移除/关闭几天,我希望它在打开后立即重新连接回网络。

我阅读了有关自动连接功能的信息,但似乎当您将其设置为 true 时,设备会创建一个后台扫描,这实际上比手动扫描慢(在频率上)。这使我得出结论,要使自动连接正常工作,再次打开的设备需要再次做广告,对吗?因此,如果自动连接真的在后台运行缓慢的扫描,那么在我看来,除非您以某种方式进行扫描,否则您永远无法立即接收到 adv 数据包。这有意义吗?

如果是这样,有什么办法可以解决吗?我的意思是,立即检测到返回范围的设备?

【问题讨论】:

【参考方案1】:

没有什么是“即时的”。您正在谈论具有延迟、超时、重传、干扰等的无线电协议。总是有延迟。重要的是您认为您的应用程序可以接受的内容。

无线电收发器一次在一个给定频道上接收、休眠或发送。发送和接收意味着功耗。

当 Central 空闲(根本不处理任何连接)时,它所要做的就是扫描。它可以全职完成(即使规范说这应该是占空比)。您可以期望在第一次传输时实际收到来自对等外围设备的广告数据包。

当 Central 维护与多个外围设备的连接时,它的收发器时间在所有要维护的连接之间共享。背景扫描被认为是低优先级,并且会占用一些剩余的收发器时间。然后,广告外设可能会在 Central 未侦听时发送其 ADV 数据包。

统计魔法来了:

规范说两个广告事件之间的间隔必须增加一个(伪)随机延迟。这可确保 Central(扫描仪)和 Peripheral(广告商)能够在某个时间点互相看到对方。如果没有这种随机延迟,它们的时间分配可能会变得和谐,但会出现异相,并且它们可能永远不会互相看到。

根据 Central 和 Peripheral 上使用的参数(advInterval、advDelay、scanWindow、scanInterval)和无线电链路质量,您可以计算在给定时间后能够到达节点的概率。这留给读者作为练习...... :)

最后,您应该问自己的问题看起来像“在 95% 的情况下,我的外围设备在 300 毫秒后重新连接到我的中心是否可以接受”?

【讨论】:

感谢您的解释。是的,其实我说的瞬间有点夸张了。关键是因为我在某处读到此背景扫描(当 autoConnect = 1 时)的间隔约为 1 秒。这对我来说太长了,但 300 毫秒就可以了。是否可以增加自动连接扫描频率(给它更高的优先级)? 这取决于您的设备及其实现。规范定义的扫描周期是“推荐值”。您的制造商固件/堆栈可能会或可能不会强制执行限制。 我明白了。扫描时我也在考虑这种不匹配的可能性。我可以将广告商设置为连续做广告,这样主人就不会在其时间窗口上看到广告。然而,最小的广告间隔似乎是 20 毫秒。您是否认为这也取决于设备/堆栈,或者我可能无法低于 20 毫秒? 对于重新连接到已知设备,有一个“高占空比定向广告”(请参阅​​ 6.B.4.4.2.4.2),其中外围设备必须使用小于 3.75 毫秒的间隔,但这可能持续不超过 1.28 秒。然后设备应回退到低占空比的非定向广告。

以上是关于BLE 设备在不扫描时是不是会读取广告数据包? (自动连接)的主要内容,如果未能解决你的问题,请参考以下文章

BLE 扫描记录 - 未获取所有广告数据(服务数据)

使用基于广告服务 UUID 的扫描过滤器扫描 BLE 外围设备

BLE 4.0 广告本地名称完整是不是有最小设备名称长度?

BLE 5 外围设备未在支持 BLE 5 的 Android 手机和 iPhone 上得到扫描

如何从 C++ 代码扫描和连接广告 BLE 设备?

使用 bluez 5.43 和 DBus 从 BLE 传感器读取广告数据包的正确方法是啥