#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. Я отредактировал свой вопрос с моими выводами, я все еще очень смущен тем, что происходит