安卓信标库 - 搜索时间长.



>更新:我仍然需要建议,因为启动时间仍然很慢,但与 10 分钟相比减少到大约 2 秒。

据我了解, 默认信标搜索时间约为每 1.1 该库一次.然而, 尽管将我的信标广播频率设置为 10Hz (I-Beacon( 和 'didDetermineStateForRegion' 报告检测到信标进入范围, 大约需要 1 分钟为"didEnter/ExitRegion" 和"范围通知器"给我一个信号在范围内的警报/给我一个范围内的信标列表.在它开始向我发出信标进入范围的警报后, 响应很棒, 不到 0.5 打开/关闭的信标的秒.

该问题的可能原因和解决方案是什么?我正在尝试创建一个 I-Beacon 考勤应用程序. 非常感谢.

*我还尝试了其他帖子给出的建议,例如关闭 Wifi 以尽量减少干扰。

克莱门特

在后台检测信标所需的时间在很大程度上取决于手机在低功耗模式下的扫描方式, 结合信标发射器的广告速率.

安卓设备通常会在屏幕关闭时将BLE扫描置于低功耗模式。 Android Beacon Library 在使用 BackgroundPowerSaver 时会明确执行此操作,并且操作系统会在较新的 Android 版本上强制执行此操作。

低功耗模式意味着BLE芯片在扫描开启时被命令使用占空比。 在开源Android上,这设置为5120毫秒的间隔,只有512毫秒的主动扫描窗口 - 占空比为10%。 与持续扫描相比,这可节省约 90% 的电池电量,但它会延迟检测。

private static final int SCAN_MODE_LOW_POWER_WINDOW_MS = 512;
private static final int SCAN_MODE_LOW_POWER_INTERVAL_MS = 5120;
private static final int SCAN_MODE_BALANCED_WINDOW_MS = 1024;
private static final int SCAN_MODE_BALANCED_INTERVAL_MS = 4096;
private static final int SCAN_MODE_LOW_LATENCY_WINDOW_MS = 4096;
private static final int SCAN_MODE_LOW_LATENCY_INTERVAL_MS = 4096;

在 AOSP 上看到这里

这就是发射器的广告速率锥体所在。 如果发射器以 10Hz 播发,则每秒应该有大约 10 个数据包需要检测。 这些是随机间隔的,但平均每 100 毫秒一个。 因此,您通常可以在 450 毫秒的活动扫描窗口内检测到 4 个数据包。 在实践中,您几乎从未检测到由于无线电空间中的噪声和碰撞而丢失的许多东西。 在近距离下,典型的接收率为80%。 在更远的范围内,接收速率进一步下降。

在这种情况下,如果在一个扫描间隔内检测到数据包,操作系统将在不到 5 秒的时间内收到回调。 如果由于某种原因在第一个扫描窗口中未检测到数据包,但在第二个扫描窗口中检测到数据包,则回调将在 9 秒内出现。

缩短此时间意味着将扫描间隔更改为更小。 在Android上,您只能通过将扫描模式更改为高功率来执行此操作,因为窗口大小由操作系统固定。 这通常意味着打开屏幕。

以上数字适用于开源Android(例如Pixel手机(。 一些制造商(秘密地(自定义这些设置。 我的测试表明,大多数装有Android 6+的三星设备将扫描间隔设置为10秒,活动扫描持续时间未知。 这意味着即使在最佳条件下,三星设备也会为您提供您所描述的结果。其他制造商可能会有所不同。 没有源代码,就不可能为您的制造商获得价值 - 唯一的选择是像您所做的那样进行实验。

最后,不要将Android Beacon Library的scanPeriod和Between ScanPeriod与上述扫描窗口/间隔混淆。 虽然两者具有相似的目标和效果,但操作系统扫描窗口不可配置,通常在较低级别强制执行,通常由较新设备上的蓝牙芯片本身执行。

最新更新