- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
使用测距信标,从理论上讲,它工作正常。我有 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 的传输速率为距离估计提供的 RSSI 样本数量是 1 Hz 传输速率的 10 倍,因此距离估计更加平滑。
关于android - Altbeacon - 在最短距离检测信标并在继续扫描前稍作停顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31088853/
我是一名优秀的程序员,十分优秀!