RangedBeacon.setSampleExpirationMillisecond、setForegroundSca



我在玩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秒。所以我认为一个较小的值意味着更快的回调。

我的问题:

  1. 为什么我不在回调中得到所有的信标(它们都以20ms的频率啁啾)?回调是如何调用的?当它有足够的信息时,或者它有某种间隔?是什么控制着它?

  2. setSampleExpirationMillisecondssetForegroundScanPeriodsetForegroundScanPeriod之间有关系吗?如何使它们很好地协同工作?

  3. 我的应用程序要求我应该在不到一秒钟的时间内听到附近的信标(3英尺或更短),如何最好地设置参数来实现这一点?

谢谢你读这么长的问题。感谢您的真知灼见。

@大卫杨,也许你可以透露一些信息?

安卓信标库的设计目的不是为检测到的每个信标数据包提供回调,而是以一定的配置间隔为您提供定期回调,让您知道信标仍然存在。默认情况下,此间隔在前台为1100毫秒,由配置

setForegroundScanPeriod(1100l); 
setForegroundBetweenScanPeriod(0l);

一旦扫描周期结束,在扫描周期中检测到的信标的列表就通过didRangeBeaconsInRegion回调在列表中返回。

您可以通过设置较短的扫描周期来获得更快的回调为了每500ms获得一次回调,setForegroundScanPeriod(500l);这样做的缺点是在每个扫描周期结束时停止并重新启动BLE扫描。(对于某些在单个扫描周期内只能检测到每个唯一蓝牙MAC地址一个数据包的Android手机型号来说,停止和重新启动是必要的。扫描周期越短,这导致丢失数据包检测的百分比越高。

这可能适用于您的用例,前提是信标每20ms发送一次——扫描间隔为500ms,您有足够的样本来确保检测。

setSampleExpirationMilliseconds参数在很大程度上与您要做的事情无关。它用于在使用默认RunningAverageRssiFilter时估计距离。此设置决定用于距离估计目的的RSSI测量平均值的时间。默认情况下,它保留20秒的RSSI样本,这会影响getDistance()方法在Beacon上的结果。

相关内容

  • 没有找到相关文章

最新更新