首页 > 解决方案 > AltBeacon getDistance() 函数与信标定位距离估计

问题描述

大家好,我正在使用 alt beacon 库来获取手机和各种信标之间的距离。我注意到 App Locate Beacon获得的结果比我从图书馆获得的结果要精确得多。因为我看到应用程序和库是由同一个人开发的,所以我认为结果是可以比较的,但事实并非如此。

有什么方法可以查看应用程序的源代码或更一般地了解如何使我的结果与应用程序获得的结果一样好?

在使用参考应用程序进行一些测试后进行编辑,给出正确的值,我注意到在我的应用程序中,runningAverage 值不正确(我监控了始终在 45 到 55 之间的信标的 RSSI,而平均值显示为 64 /65)。我觉得我搞砸了通过扩展类来计算运行平均值的方式

这是我的课

public class MyBeacon extends Beacon implements Serializable, Comparable {
public String btAddress;
public String area;
public double[] position;

private static Map<String, String> btToArea = new HashMap<>();
private static Map<String, double[]> positionsMap = new HashMap<>();

static {
    btToArea.put("DE:FD:0A:11:D8:80", "DEV OFFICE");
    btToArea.put("D1:75:7B:58:54:D6", "DEV OFFICE");
    btToArea.put("D6:81:6A:D5:09:40", "CENTRAL OFFICE");
    btToArea.put("F1:14:DC:C2:0C:08", "CENTRAL OFFICE");
    btToArea.put("FC:0D:4A:C1:CD:57", "DEV OFFICE");

    positionsMap.put("D6:81:6A:D5:09:40", new double[]{9.9, 3.9}); //
    positionsMap.put("FC:0D:4A:C1:CD:57", new double[]{0.0, 0.0}); //
    positionsMap.put("D1:75:7B:58:54:D6", new double[]{0.0, 2.5}); //
    positionsMap.put("F1:14:DC:C2:0C:08", new double[]{6.9, -1.0}); //
    positionsMap.put("DE:FD:0A:11:D8:80", new double[]{-0.4, 2.5});
}

public MyBeacon(Beacon beacon){
    super(beacon);
    this.btAddress = beacon.getBluetoothAddress();
    this.area = btToArea.getOrDefault(beacon.getBluetoothAddress(), "ERROR");
    this.position = positionsMap.get(beacon.getBluetoothAddress());
}

public static MyBeacon FromBeacon(Beacon beacon){
    if (positionsMap.containsKey(beacon.getBluetoothAddress()))
        return new MyBeacon(beacon);

    return null;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    if (!super.equals(o)) return false;
    MyBeacon myBeacon = (MyBeacon) o;
    return Objects.equals(btAddress, myBeacon.btAddress) &&
            Objects.equals(area, myBeacon.area) &&
            Arrays.equals(position, myBeacon.position);
}

@Override
public int hashCode() {
    int result = Objects.hash(super.hashCode(), btAddress, area);
    result = 31 * result + Arrays.hashCode(position);
    return result;
}

@Override
public int compareTo(Object o) {
    return (int) (((MyBeacon) o).getDistance() - this.getDistance());
}

}

我是否正确扩展课程?我的怀疑是对的还是完全不对?

如果这可能会影响它,解析器也是自定义的

标签: androidbeaconaltbeacon

解决方案


Locate Beacon 应用程序的源代码确实只是使用了该Beacon#getDistance()方法,因此不清楚为什么您会看到差异。Play Store 中的最新版本使用了稍旧版本的库org.altbeacon:android-beacon-library:2.16.2,但那里并没​​有太大变化。

我写了 Locate Beacon,所以我可以向你保证,相对于你在开源库中获得的距离估计没有什么秘密——它只是有一个更漂亮的 UI。您可以尝试使用图书馆的参考应用程序进行测试,看看它为您提供了什么样的距离估计。这可能会消除您自己的应用程序中的任何细微编码问题。


推荐阅读