RangedBeacon.setSampleExpirationMillisecond、setForegroundScanPeriod 和 setForegroundBetweenScanPeriod 之间的 AltBeacon 关联
AltBeacon correlation between RangedBeacon.setSampleExpirationMillisecond, setForegroundScanPeriod and setForegroundBetweenScanPeriod
我正在研究 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 秒才能听到我再次站在旁边的那个特定灯塔。
我知道我们设置的信标每 20 毫秒发出一次鸣叫,所以在那 700 毫秒内,我应该能看到它们。
我注意到,如果我将 setForegroundScanPeriod
提高到 5000(我希望扫描周期更长,以便我可以获得附近的信标),我得到的回调会更少。回调之间的延迟约为 10 秒。所以我认为较小的值意味着更快的回调。
我的问题:
为什么我没有得到回调中的所有信标(它们都以 20 毫秒的频率发出鸣叫)?回调是怎么调用的?当它有 足够 信息时,或者它有某种间隔?什么控制它?
setSampleExpirationMilliseconds
、setForegroundScanPeriod
、setForegroundScanPeriod
有关系吗?如何让它们协同工作?
我的应用程序要求我应该在一秒内听到附近的信标(3 英尺或更小),如何最好地设置参数以实现此目的?
感谢您阅读这么长的问题。感谢任何见解。
@davidgyoung 或许你能解释一下?
Android 信标库的设计目的不是为检测到的每个信标数据包提供回调,而是以某个配置的时间间隔为您提供定期回调,让您知道信标仍然存在。默认情况下,这个间隔在前台是1100ms,由
配置
setForegroundScanPeriod(1100l);
setForegroundBetweenScanPeriod(0l);
一旦扫描周期结束,扫描周期内检测到的信标列表将通过 didRangeBeaconsInRegion
回调以列表的形式返回。
您可以通过设置更短的扫描周期来获得更快的回调。每 500 毫秒获得一次回调,setForegroundScanPeriod(500l);
这样做的缺点是这会停止并重新启动 BLE 扫描在每个扫描周期结束时。 (对于某些 Android phone 型号来说,在单个扫描周期中每个唯一蓝牙 MAC 地址只能检测一个数据包,因此必须停止并重新启动。)但是无论何时停止并重新启动扫描,您将错过在那个确切时间传输的任何数据包——这类似于在数据包中间关闭蓝牙无线电。扫描周期越短,这会导致丢失数据包检测的百分比越高。
如果信标每 20 毫秒传输一次 - 扫描间隔为 500 毫秒,这对于您的用例来说可能没问题,您有足够的样本来确保检测到。
setSampleExpirationMilliseconds
参数在很大程度上与您要执行的操作无关。当使用默认 RunningAverageRssiFilter
时,它用于距离估计。此设置决定为距离估计目的平均 RSSI 测量的时间长度。默认情况下,它会保留 20 秒的 RSSI 样本,这会影响 Beacon
上 getDistance()
方法的结果。
我正在研究 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 秒才能听到我再次站在旁边的那个特定灯塔。
我知道我们设置的信标每 20 毫秒发出一次鸣叫,所以在那 700 毫秒内,我应该能看到它们。
我注意到,如果我将 setForegroundScanPeriod
提高到 5000(我希望扫描周期更长,以便我可以获得附近的信标),我得到的回调会更少。回调之间的延迟约为 10 秒。所以我认为较小的值意味着更快的回调。
我的问题:
为什么我没有得到回调中的所有信标(它们都以 20 毫秒的频率发出鸣叫)?回调是怎么调用的?当它有 足够 信息时,或者它有某种间隔?什么控制它?
setSampleExpirationMilliseconds
、setForegroundScanPeriod
、setForegroundScanPeriod
有关系吗?如何让它们协同工作?我的应用程序要求我应该在一秒内听到附近的信标(3 英尺或更小),如何最好地设置参数以实现此目的?
感谢您阅读这么长的问题。感谢任何见解。
@davidgyoung 或许你能解释一下?
Android 信标库的设计目的不是为检测到的每个信标数据包提供回调,而是以某个配置的时间间隔为您提供定期回调,让您知道信标仍然存在。默认情况下,这个间隔在前台是1100ms,由
配置setForegroundScanPeriod(1100l);
setForegroundBetweenScanPeriod(0l);
一旦扫描周期结束,扫描周期内检测到的信标列表将通过 didRangeBeaconsInRegion
回调以列表的形式返回。
您可以通过设置更短的扫描周期来获得更快的回调。每 500 毫秒获得一次回调,setForegroundScanPeriod(500l);
这样做的缺点是这会停止并重新启动 BLE 扫描在每个扫描周期结束时。 (对于某些 Android phone 型号来说,在单个扫描周期中每个唯一蓝牙 MAC 地址只能检测一个数据包,因此必须停止并重新启动。)但是无论何时停止并重新启动扫描,您将错过在那个确切时间传输的任何数据包——这类似于在数据包中间关闭蓝牙无线电。扫描周期越短,这会导致丢失数据包检测的百分比越高。
如果信标每 20 毫秒传输一次 - 扫描间隔为 500 毫秒,这对于您的用例来说可能没问题,您有足够的样本来确保检测到。
setSampleExpirationMilliseconds
参数在很大程度上与您要执行的操作无关。当使用默认 RunningAverageRssiFilter
时,它用于距离估计。此设置决定为距离估计目的平均 RSSI 测量的时间长度。默认情况下,它会保留 20 秒的 RSSI 样本,这会影响 Beacon
上 getDistance()
方法的结果。