使用低功耗蓝牙,您可以指定扫描窗口(扫描多长时间)和间隔(扫描之间等待多长时间)。
每 100 毫秒扫描 10 毫秒或每 10 秒扫描 1 秒之间会有什么区别吗?在这种情况下,似乎两个设备找到彼此的机会(同时打开它们的无线电)应该相等?
是否有一个简单的公式可以根据允许连接的最大时间计算正确的窗口/间隔?
使用低功耗蓝牙,您可以指定扫描窗口(扫描多长时间)和间隔(扫描之间等待多长时间)。
每 100 毫秒扫描 10 毫秒或每 10 秒扫描 1 秒之间会有什么区别吗?在这种情况下,似乎两个设备找到彼此的机会(同时打开它们的无线电)应该相等?
是否有一个简单的公式可以根据允许连接的最大时间计算正确的窗口/间隔?
其他答案中遗漏了另一个方面。根据核心 BLE 规范,在每个 scanInterval 期间只查看一个广告通道,并在每个间隔内轮换到 3 个通道中的下一个。因此,如果该频道上存在射频干扰,即使您的 scanWindow 等于 scanInterval 以进行连续扫描,您也可能看不到设备。
进行广告的 BLE 外围设备通常会在每个广告瞬间期间非常快速地依次通过所有三个广告通道。因此,最好的中央设备扫描算法将具有更短的窗口和间隔,以便顺序检查每个广告渠道。Apple 显然在 iOS 中使用 30 ms scanWindow 和 40 ms scanInterval,应用程序处于前台模式。这意味着每个广告频道将每 40 毫秒检查一次。根据 BLE 核心规范:
每个广告事件由一个或多个在使用的广告通道索引上发送的广告 PDU 组成。在每个使用的广告通道索引(参见第 4.4.2.1 节)上发送一个广告 PDU 后,广告事件应关闭,或者广告商可以提前关闭广告事件以适应其他功能。
另一个非常重要的方面是让Peripheral 设备设置一个与 Central 设备上的 scanInterval 相比相对优质的广告间隔。这就是 Apple 指定特定广告间隔的原因。如果您选择 100 ms 的 scanInterval 和较小的 scanWindow,例如 80 ms 并且广告间隔为 1000 ms(1 秒),那么您可能会很不走运并且总是在 Central 设备的 20 ms 期间进行广告在每个 scanInterval 期间都没有扫描。实际上,BLE 核心规范在广播间隔中添加了一个随机的 0-10 毫秒,这有助于防止完全死锁,但它确实做得更多,以避免多个设备在几乎完全相同的时间进行广播,从而永远相互干扰。
对于在低占空比模式下使用的所有非定向广告事件或可连接定向广告事件,对于每个广告事件,两个连续广告事件开始之间的时间 (T_advEvent) 计算如下:
T_advEvent = advInterval + advDelay
advInterval 应为 0.625 ms 的整数倍,范围为 20 ms 至 10.24 s。如果广告事件类型是可扫描无向事件类型或不可连接无向事件类型,则 advInterval 不得小于 100 ms。如果广告事件类型是可连接的无向事件类型或用于低占空比模式的可连接的有向事件类型,则 advInterval 可以是 20 ms 或更大。 advDelay 是一个伪随机值,范围为 0 ms 到 10 ms,由链路层为每个广告事件生成。
想想有两个彼此接近的频率,以及如何获得它们差异的拍频。这基本上就是在 scanInterval 和广告间隔之间可能发生的事情。Apple 在这方面的设置做得不错,因此遵循他们的标准不仅适用于 iOS,而且适用于 Android。Apple 的 30 ms scanWindow 和 40 ms scanInterval 的前台模式意味着对于 1022.5 ms 的基本广告间隔,您在大约 3/4 时间的 1 秒内看到设备,并且始终在 2 秒内,假设没有 RF 干扰遮挡广告数据包. 在具有 30 ms scanWindow 和 300 ms scanInterval 的后台模式下,中位时间变为 5 秒,通常的最大值变为 19 秒,尽管随机移位的运气非常糟糕,它可能会更长一些。
https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf
苹果推荐的外设广告间隔为 152.5、211.25、318.75、417.5、546.25、760、852.5、1022.5、1285 ms。
根据蓝牙 4.0 核心规范,对于不同类型的广告数据包,“广告事件”的时间段如下所示:
ADV_IND:一般可连接和可扫描的广告包的时间周期范围从20 ms到10.24s,步长为0.625ms。
ADV_DIRECT_IND:定向广告包的时间周期小于或等于 3.75 ms。这种广告事件只能连续发生1.28s。这是为了建立快速连接(如果有设备监听)。
ADV_NONCONN_IND:不可连接和不可扫描的广告包的时间周期范围从 100 ms 到 10.24s,步长为 0.625ms。
ADV_SCAN_IND:可扫描广告包的时间周期范围从 100 ms 到 10.24s,步长为 0.625ms。
因此,除非您知道要扫描的设备类型,否则最好的方法是连续扫描大约 11(最大)秒,以查看周围是否有任何广告设备。执行此操作的频率取决于可用的电池电量或电量。
希望这可以帮助。
我发现@EarthLord 的回答具有误导性,因此我想分享我的回答:
我认为您误解了该特定情况下的间隔和窗口。窗口指定设备侦听广告并可选地请求扫描记录的时间。间隔定义了连续窗口之间的时间。
在蓝牙核心规范 4.0 中它说
scanWindow 和 scanInterval 参数应小于或等于 10.24 s。scanWindow 应小于或等于 scanInterval。如果主机将 scanWindow 和 scanInterval 参数设置为相同的值,则链路层应该连续扫描。
这意味着将两者都设置为 5 帧,您将连续进行扫描。但是,如果您进行主动扫描(这意味着您请求扫描响应),您不应该这样做。任何电池驱动的外围设备都会很快被吸出。
而是定义一个适用于您的应用程序的间隔,并设置一个小于它的扫描窗口。
但是我认为这没有一些默认值。