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

Android AltBeacon getDistance()函数与信标定位距离估计,android,beacon,altbeacon,Android,Beacon,Altbeacon,大家好,我正在使用alt beacon库获取我的手机和各种信标之间的距离。 我注意到应用程序得到的结果比我从图书馆得到的结果要精确得多。因为我看到应用程序和库是由同一个人开发的,所以我认为结果是可以比较的,但事实绝对不是这样 有没有办法查看应用程序的源代码,或者更一般地了解如何使我的结果与应用程序得到的结果一样好 编辑在使用参考应用程序进行了一些测试(给出了正确的值)之后,我注意到在我的应用程序中,运行平均值不正确(我监测了信标的RSSI,该信标的RSSI始终在45到55之间,而平均值为64/6

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

有没有办法查看应用程序的源代码,或者更一般地了解如何使我的结果与应用程序得到的结果一样好

编辑在使用参考应用程序进行了一些测试(给出了正确的值)之后,我注意到在我的应用程序中,运行平均值不正确(我监测了信标的RSSI,该信标的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());
}
公共类MyBeacon扩展Beacon实现可序列化、可比较{
公共字符串地址;
公共区域;
公共双[]职位;
私有静态映射btToArea=newHashMap();
私有静态映射位置Map=newhashmap();
静止的{
btToArea.put(“DE:FD:0A:11:D8:80”,“开发办公室”);
btToArea.put(“D1:75:7B:58:54:D6”,“开发办公室”);
btToArea.put(“D6:81:6A:D5:09:40”,“中央办公室”);
btToArea.put(“F1:14:DC:C2:0C:08”,“中央办公室”);
btToArea.put(“FC:0D:4A:C1:CD:57”,“开发办公室”);
位置映射放置(“D6:81:6A:D5:09:40”,新双[]{9.9,3.9})//
位置映射放置(“FC:0D:4A:C1:CD:57”,新的双[]{0.0,0.0})//
位置映射放置(“D1:75:7B:58:54:D6”,新的双[]{0.0,2.5})//
位置映射放置(“F1:14:DC:C2:0C:08”,新的双[]{6.9,-1.0})//
位置映射放置(“DE:FD:0A:11:D8:80”,新的双[]{-0.4,2.5});
}
公共MyBeacon(信标){
超级(信标);
this.btAddress=beacon.getBluetoothAddress();
this.area=btToArea.getOrDefault(beacon.getBluetoothAddress(),“ERROR”);
this.position=positionsMap.get(beacon.getBluetoothAddress());
}
公共静态MyBeacon FromBeacon(信标信标){
if(positionsMap.containsKey(beacon.getBluetoothAddress()))
返回新的MyBeacon(信标);
返回null;
}
@凌驾
公共布尔等于(对象o){
如果(this==o)返回true;
如果(o==null | | getClass()!=o.getClass())返回false;
如果(!super.equals(o))返回false;
MyBeacon MyBeacon=(MyBeacon)o;
返回Objects.equals(btAddress,myBeacon.btAddress)&&
Objects.equals(面积,myBeacon.area)&&
array.equals(position,myBeacon.position);
}
@凌驾
公共int hashCode(){
int result=Objects.hash(super.hashCode(),btAddress,area);
result=31*result+Arrays.hashCode(位置);
返回结果;
}
@凌驾
公共整数比较对象(对象o){
返回(int)(((MyBeacon)o.getDistance()-this.getDistance());
}
}

我是否适当地扩展了课程?我的怀疑是对的还是我完全错了


此外,解析器是自定义的,如果这可能会影响它的话。

定位信标应用程序的源代码确实只使用了
信标#getDistance()
方法,因此不清楚为什么会出现差异。Play Store的最新版本使用了稍旧的库
org.altbeacon:android-beacon-library:2.16.2
,但变化不大


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

嗨,这正是我担心的,我会按照您的建议做的,谢谢!我用我的发现编辑了我的问题,我仍然很困惑到底发生了什么,我会重新测试你认为运行平均RSSI与RSSI读数不一致的情况。这是极不可能的,我怀疑真正的问题是别的。尝试设置beaconManager.setDebug(true);查看zlogCat的每个RSSI读数和运行平均值。您好,很抱歉过了一段时间后重新打开,但我再次开始操作这些设备,并注意到其中两个设备设置为具有相同的id,并且它们的运行平均值(以及相应的距离)“聚合”所以我想知道,也许跑步平均数与ID1有关,而不是与我最初认为的BT地址有关。这仍然让我困惑,因为定位应用程序看起来不受影响,而且两个信标显示的距离不同。一旦我的同事更改了ID,我将运行进一步的测试,但我想我会提前询问,以防毫无意义。您可以跟踪具有与MAC地址不同的相同标识符的信标