AltBeacon getDistance() 函数与信标定位距离估计

Posted

技术标签:

【中文标题】AltBeacon getDistance() 函数与信标定位距离估计【英文标题】:AltBeacon getDistance() function vs beacon locate distance estimation 【发布时间】:2020-10-02 15:16:52 【问题描述】:

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

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

EDIT 在对参考应用程序进行一些测试后,给出了正确的值,我注意到在我的应用程序中 runningAverage 值不正确(我监控了始终介于两者之间的信标的 RSSI 45 和 55,而平均值为 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());

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

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

【问题讨论】:

我会重新测试您认为运行平均 RSSI 与 RSSI 读数不一致的情况。这是极不可能的,我怀疑真正的问题是别的。尝试设置 beaconManager.setDebug(true);并查看 zlogCat 的每个 RSSI 读数和运行平均值。 嗨,很抱歉在很长一段时间后重新打开它,但我又开始在设备上工作,并注意到其中一些设备设置为具有相同的 id,以及它们的运行平均值(以及相应的距离)“收敛”,所以我想知道运行平均值是否与 ID1 相关,而不是我最初认为的 BT 地址。这仍然让我感到困惑,因为定位应用程序看起来不受它的影响,并且两个信标显示的距离不同。一旦我的同事更改了 ID,我就会进行进一步的测试,但我想我会提前问一下,以防万一它没有意义 您可以使用this setting跟踪具有相同标识符的信标,因为MAC地址不同 【参考方案1】:

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

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

【讨论】:

嗨,这就是我担心的,我会按照你的建议做谢谢! 我用我的发现编辑了我的问题,我仍然对发生的事情感到困惑

以上是关于AltBeacon getDistance() 函数与信标定位距离估计的主要内容,如果未能解决你的问题,请参考以下文章

AltBeacon:didExitRegion 和 didEnterRegion 交替

altbeacon - 计算距离的常数

使用 AltBeacon 库以 CoreBluetooth 格式做广告

如何使用 android-beacon-library (altbeacon) 正确停止扫描信标

OnyxBeacon 的 AltBeacon 不稳定,反复循环通过 didEnterRegion 和 didExitRegion

altbeacon 参考应用程序和多个退出/进入调用