Функция AltBeacon getDistance () против оценки расстояния обнаружения маяка

#android #beacon #altbeacon

#Android #маяк #altbeacon

Вопрос:

Привет всем, я использую библиотеку alt beacon, чтобы определить расстояние между моим телефоном и различными маяками. Я заметил, что результаты, полученные приложением Locate Beacon, намного точнее, чем то, что я получаю из библиотеки. Поскольку я увидел, что приложение и библиотека были разработаны одними и теми же людьми, я думал, что результаты будут сопоставимы, но это определенно не так.

Есть ли какой-нибудь способ просмотреть исходный код приложения или, в более общем плане, понять, как сделать мои результаты такими же хорошими, как и то, что получает приложение?

РЕДАКТИРОВАТЬ после некоторого тестирования с помощью справочного приложения, которое выдает правильные значения, я заметил, что в моем приложении значение 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) amp;amp;
            Objects.equals(area, myBeacon.area) amp;amp;
            Arrays.equals(position, myBeacon.position);
}

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

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

}

Правильно ли я расширяю класс? Правильно ли я подозреваю или я полностью отключен?

Также анализатор является пользовательским, если это может повлиять на него

Комментарии:

1. Я бы повторно протестировал случай, когда вы считаете, что текущий средний RSSI не соответствует показаниям RSSI. Это маловероятно, и я подозреваю, что реальная проблема заключается в чем-то другом. Попробуйте установить BeaconManager.setDebug (true); и посмотрите на zlogCat для каждого чтения RSSI и текущего среднего.

2. Привет, извините, что через некоторое время я снова открываю это, но я снова начал работать с устройствами и заметил, что для нескольких из них установлен одинаковый идентификатор, а их среднее значение (и, следовательно, расстояние) «сходится», поэтому мне было интересно, может быть, среднее значение привязано к ID1вместо адреса BT, как я изначально предполагал. Это по-прежнему сбивает меня с толку, потому что приложение Locate выглядит так, как будто на него это не влияет, и два маяка показывают разные расстояния. Как только мой коллега изменит идентификаторы, я проведу дальнейшие тесты, но я подумал, что спрошу заранее на всякий случай, если это бессмысленно

3. С помощью этого параметра вы можете отслеживать маяки с тем же идентификатором, который отличается от MAC-адреса

Ответ №1:

Исходный код приложения Locate Beacon действительно просто использует этот Beacon#getDistance() метод, поэтому неясно, почему вы видите различия. Последняя версия в Play Store использует немного более старую версию библиотеки org.altbeacon:android-beacon-library:2.16.2 , но там мало что изменилось.

Я написал Locate Beacon, поэтому могу заверить вас, что в оценках расстояний нет ничего секретного относительно того, что вы получаете в библиотеке с открытым исходным кодом — у нее просто более причудливый пользовательский интерфейс. Вы можете попробовать протестировать справочное приложение библиотеки, чтобы узнать, какие оценки расстояния оно вам дает. Это может устранить любые тонкие проблемы с кодированием в вашем собственном приложении.

Комментарии:

1. Привет, это то, чего я боялся, я сделаю так, как вы предложили, спасибо!

2. Я отредактировал свой вопрос с моими выводами, я все еще очень смущен тем, что происходит