使用测距信标及其工作正常,理论上很好。我有3个信标,以及一个简单的算法,可以在最短的距离内一次只检测一个信标,但是由于RSSI值的连续波动,我最终很频繁地检测到其他信标。好吧,如果我可以暂停'那将不会那么有害。检测之间多一点。我的onscan perdiod是,setForegroundBetweenScanPeriod(0l)
。现在的问题是,我应该增加setForegroundBetweenScanPeriod()
以实现“暂停”#39属性或使用某种计时器手动处理?算法是否正确,以检测最短距离的一个信标?这是我的代码
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
}
答案 0 :(得分:3)
该算法看起来正确。我会不更改扫描周期以使最近的信标更稳定,因为这会导致副作用,例如检测延迟。
我通常会做三件事来使最近的信标确定更稳定:
将最近的信标设为类变量,并将时间戳添加为类变量,以指示最近的信标何时更改。然后,您可以添加逻辑以拒绝更改最近的信标(如果它在最近n秒内已经更改)。
添加切换到另一个信标所需的最小百分比距离更改作为最近的信标。 (例如,拒绝改变最近的灯塔,除非另一个灯塔至少靠近10%。)
增加距离估算的平均周期。默认情况下它是20秒,但您可以增加它以获得更多的数据点并减少距离估计的噪音:
RunningAverageRssiFilter.setSampleExpirationMilliseconds(30000l);
选项1和3的时间取决于您的使用案例。如果您在估算最近的信标时需要快速更改,则可能无法使这些时间变得非常大。
最后,您还应该确保您的信标尽可能频繁地传输。 10 Hz传输速率为距离估计提供了10倍于1 Hz传输速率的RSSI样本,因此距离估计更加平滑。