我正在玩AltBeacon和这些参数。我的目标是拥有最快(尽可能快)的回调didRangeBeaconsInRegion()
。
我了解测距使用移动平均值来计算距离并进行回调。我对距离不感兴趣,但对rssi不感兴趣。话虽如此,如果rssi改变1就可以了。
在当前代码中,我目前使用:
RangedBeacon.setSampleExpirationMilliseconds(1000);
try
{
mBeaconManager.setForegroundScanPeriod(700l);
mBeaconManager.setForegroundBetweenScanPeriod(0l);
mBeaconManager.updateScanPeriods();
}
catch(RemoteException ex)
{
...
}
我的应用程序一直处于前台状态。在Nexus 5X上运行。
我注意到setSampleExpirationMilliseconds()的值越小,我得到
didRangeBeaconsInRegion()
回调的频率就越高,这很好。 setForegroundBetweenScanPeriod
设置为0,这意味着服务始终一直扫描。在我的场地中,我部署了大约30个信标。通过上面的代码设置,每次获得不同的信标集时,我每秒都会收到回调。
问题是,即使我站在信标旁边,也不会每隔1秒钟或更短的时间听到信标。当我收到回调时,通常用于其他遥远的信标。有时候,我要花30秒钟才能听到我再次站在旁边的那个特定信标。
我知道我们每20ms设置一次chi声的信标,因此在700ms内,我应该看到它们。
我注意到,如果将
setForegroundScanPeriod
提高到5000(我希望扫描周期更长,这样我就可以得到附近的信标),那么我得到的回调就更少了。回调之间的延迟约为10秒。因此,我认为较小的值表示更快的回调。我的问题:
为什么我没有在回调中获得所有信标(它们都在20ms时发出chi声)?回调如何调用?什么时候有足够的信息,或者有某种间隔?是什么控制的?
setSampleExpirationMilliseconds
,setForegroundScanPeriod
和setForegroundScanPeriod
之间有任何关系吗?如何使它们协同工作?我的应用程序要求我应该在不到一秒钟的时间内听到附近的信标(3英尺或更短),如何最好地设置参数来实现这一目标?
感谢您阅读这么长的问题。赞赏任何见解。
@davidgyoung也许您可以阐明一些想法?
最佳答案
Android Beacon库并非旨在为您检测到的每个信标数据包提供回调,而是以一定的配置间隔为您提供常规回调,以使您知道信标仍然存在。默认情况下,此间隔在前台为1100毫秒,由
setForegroundScanPeriod(1100l);
setForegroundBetweenScanPeriod(0l);
扫描周期结束后,通过
didRangeBeaconsInRegion
回调将在扫描周期中检测到的信标列表返回到列表中。通过设置较短的扫描时间,您可以获得更快的回调。要每500毫秒获取一次回调,
setForegroundScanPeriod(500l);
的缺点是,它将在每个扫描周期结束时停止并重新启动BLE扫描。 (对于某些Android手机型号来说,必须停止和重新启动,因为在一个扫描周期中每个唯一的蓝牙MAC地址只能检测到一个数据包。)但是,每当您停止并重新开始扫描时,您都会错过在该确切时间传输的所有数据包。 -类似于关闭数据包中间的蓝牙无线电。这会导致丢失的数据包检测百分比更高,扫描周期越短。如果您的用例每20毫秒发送一次信标-扫描间隔为500毫秒,那么您有很多样本可以确保检测到,这对于您的用例可能是可以的。
setSampleExpirationMilliseconds
参数在很大程度上与您要执行的操作无关。使用默认的RunningAverageRssiFilter
时,它用于距离估计。此设置决定用于距离估计目的的RSSI测量结果的平均时间。默认情况下,它保留20秒的RSSI样本值,这会影响getDistance()
上Beacon
方法的结果。关于android - RangedBeacon.setSampleExpirationMillisecond,setForegroundScanPeriod和setForegroundBetweenScanPeriod之间的AltBeacon相关性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37063466/