android-Altbeacon-在最短的距离处检测到信标,并在继续扫描之前暂停一会儿
作者:互联网
从理论上讲,使用测距信标及其工作正常.我有3个信标,并且有一个简单的算法可以在最短距离内一次仅检测到一个信标,但是由于RSSI值的持续波动,我最终非常频繁地检测到另一个信标.好吧,如果我可以在检测之间多“暂停”一下,那将不会那么有害.我的之间扫描期间为setForegroundBetweenScanPeriod(0l).现在的问题是,我应该增加setForegroundBetweenScanPeriod()来实现该“暂停”属性还是使用某种计时器手动处理它?该算法是否正确以检测距离最短的一个信标?这是我的代码
protected void onCreate(Bundle savedInstanceState) {
...
beaconManager.setForegroundScanPeriod(1100l);
beaconManager.setForegroundBetweenScanPeriod(0l);
beaconManager.bind(this);
...
}
@Override
public void onBeaconServiceConnect(){
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
//find the beacon with shortest distance
int idx = -1; //when no beacon is there
double min = Double.MAX_VALUE;
for (int i = 0; i < beaconArray.length; i++) {
double d = ((Beacon) beaconArray[i]).getDistance();
if (d < min) {
min = d;
idx = i; //1st beacon in the array
}
}
if (count == 0 && idx != -1) {
//show the data associated with the beacon
}
解决方法:
该算法看起来正确.我不会更改扫描周期以使最接近的信标更加稳定,因为这将导致诸如检测延迟的副作用.
我通常会做三件事以使最接近的信标确定更加稳定:
>将最近的信标设为类变量,并添加时间戳作为类变量,以指示最近的信标何时更改.然后,您可以添加逻辑以拒绝最近的信标(如果在最近的n秒内已更改).
>添加切换到另一个信标作为最接近的信标所需的最小距离变化百分比. (例如,除非另外一个信标至少接近10%,否则请拒绝更改最近的信标.)
>增加距离估计的平均时间.默认情况下为20秒,但是您可以增加它以获取更多数据点并减少距离估算中的噪声:
RunningAverageRssiFilter.setSampleExpirationMilliseconds(30000l);
选项1和3的时间取决于您的用例.如果在估计最接近的信标时需要快速更改,则可能无法使这些时间变大.
最后,您还应该确保信标尽可能频繁地传输. 10 Hz的传输速率比1 Hz的传输速率提供了10倍的RSSI样本用于距离估计,因此距离估计更平滑.
标签:ibeacon,altbeacon,android 来源: https://codeday.me/bug/20191120/2041335.html