Altbeacon - 以最短距离检测信标并暂停一点,然后继续扫描

时间:2015-06-27 12:38:04

标签: android ibeacon altbeacon

使用测距信标及其工作正常,理论上很好。我有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
                }

1 个答案:

答案 0 :(得分:3)

该算法看起来正确。我会更改扫描周期以使最近的信标更稳定,因为这会导致副作用,例如检测延迟。

我通常会做三件事来使最近的信标确定更稳定:

  1. 将最近的信标设为类变量,并将时间戳添加为类变量,以指示最近的信标何时更改。然后,您可以添加逻辑以拒绝更改最近的信标(如果它在最近n秒内已经更改)。

  2. 添加切换到另一个信标所需的最小百分比距离更改作为最近的信标。 (例如,拒绝改变最近的灯塔,除非另一个灯塔至少靠近10%。)

  3. 增加距离估算的平均周期。默认情况下它是20秒,但您可以增加它以获得更多的数据点并减少距离估计的噪音: RunningAverageRssiFilter.setSampleExpirationMilliseconds(30000l);

  4. 选项1和3的时间取决于您的使用案例。如果您在估算最近的信标时需要快速更改,则可能无法使这些时间变得非常大。

    最后,您还应该确保您的信标尽可能频繁地传输。 10 Hz传输速率为距离估计提供了10倍于1 Hz传输速率的RSSI样本,因此距离估计更加平滑。