我在玩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鸣叫一次,所以在这700ms的时间里,我应该能看到它们。
我注意到,如果我将setForegroundScanPeriod
提高到5000(我希望扫描周期更长,这样我就可以获得附近的信标),我会收到更少的回调。回调之间的延迟约为10秒。所以我认为一个较小的值意味着更快的回调。
我的问题:
为什么我不在回调中得到所有的信标(它们都以20ms的频率啁啾)?回调是如何调用的?当它有足够的信息时,或者它有某种间隔?是什么控制着它?
setSampleExpirationMilliseconds
、setForegroundScanPeriod
和setForegroundScanPeriod
之间有关系吗?如何使它们很好地协同工作?我的应用程序要求我应该在不到一秒钟的时间内听到附近的信标(3英尺或更短),如何最好地设置参数来实现这一点?
谢谢你读这么长的问题。感谢您的真知灼见。
@大卫杨,也许你可以透露一些信息?
安卓信标库的设计目的不是为检测到的每个信标数据包提供回调,而是以一定的配置间隔为您提供定期回调,让您知道信标仍然存在。默认情况下,此间隔在前台为1100毫秒,由配置
setForegroundScanPeriod(1100l);
setForegroundBetweenScanPeriod(0l);
一旦扫描周期结束,在扫描周期中检测到的信标的列表就通过didRangeBeaconsInRegion
回调在列表中返回。
您可以通过设置较短的扫描周期来获得更快的回调为了每500ms获得一次回调,setForegroundScanPeriod(500l);
这样做的缺点是在每个扫描周期结束时停止并重新启动BLE扫描。(对于某些在单个扫描周期内只能检测到每个唯一蓝牙MAC地址一个数据包的Android手机型号来说,停止和重新启动是必要的。扫描周期越短,这导致丢失数据包检测的百分比越高。
这可能适用于您的用例,前提是信标每20ms发送一次——扫描间隔为500ms,您有足够的样本来确保检测。
setSampleExpirationMilliseconds
参数在很大程度上与您要做的事情无关。它用于在使用默认RunningAverageRssiFilter
时估计距离。此设置决定用于距离估计目的的RSSI测量平均值的时间。默认情况下,它保留20秒的RSSI样本,这会影响getDistance()
方法在Beacon
上的结果。