Измерьте расстояние до iBeacon от устройства Android
Я работаю над приложением, которое должно измерять расстояние до iBeacon. Когда пользователь находится на расстоянии (1 метр), пользователь должен быть уведомлен.
На iOS работает нормально, но на Android я получаю различные результаты. Я использую Estimote Android SDK ( https://github.com/Estimote/Android-SDK) и Android 4.3.
Ниже приведены измерения от Nexus 4 и Nexus 5. iBeacon находится на расстоянии одного метра от телефона (измерения соответствуют большему количеству образцов):
Nexus 4:
08-25 11:39:04.788: : Major: 27485 Accuracy: 0.36351308115918884 Power: -74 Rssi: -67
08-25 11:39:05.880: : Major: 27485 Accuracy: 0.31923897946172497 Power: -74 Rssi: -66
08-25 11:39:06.911: : Major: 27485 Accuracy: 0.31923897946172497 Power: -74 Rssi: -66
08-25 11:39:07.962: : Major: 27485 Accuracy: 0.41856988869951295 Power: -74 Rssi: -68
08-25 11:39:09.003: : Major: 27485 Accuracy: 0.31923897946172497 Power: -74 Rssi: -66
Nexus 5:
08-25 11:35:31.443: : Major: 27485 Accuracy: 0.14058401218665711 Power: -74 Rssi: -61
08-25 11:35:32.483: : Major: 27485 Accuracy: 0.14058401218665711 Power: -74 Rssi: -61
08-25 11:35:33.513: : Major: 27485 Accuracy: 0.17333602268971005 Power: -74 Rssi: -62
08-25 11:35:34.553: : Major: 27485 Accuracy: 0.17333602268971005 Power: -74 Rssi: -62
08-25 11:35:35.593: : Major: 27485 Accuracy: 0.17333602268971005 Power: -74 Rssi: -62
Как уже отмечалось, ни один из них не приблизился к одному метру. Nexus 4 имеет ближайший результат с 0,42 метра. Точность взята с Utils.computeAccuracy в Estimote SDK.
Большая проблема в том, что разные устройства дают разные результаты. Большинство устройств, которые я пробовал (Nexus 4, Nexus 7, HTC One Mine), дает результаты, аналогичные Nexus 4. Однако Nexus 5 показывает, что он гораздо ближе, чем другие устройства.
Есть ли способ заставить все устройства давать (близкие) похожие результаты? Альтернативный способ узнать, как измеряют разные устройства (чтобы алгоритм мог компенсировать разные результаты)
Также кто-нибудь нашел способ повысить частоту дискретизации на Android Bluetooth LE?
Я действительно хотел бы предотвратить использование некоторой калибровки, когда пользователь запускает приложение.
Я должен использовать iBeacons (по требованию клиента), но другой библиотекой может быть вариант, если это поможет решить проблему.
2 ответа
Библиотека Android Beacon с открытым исходным кодом (преемник библиотеки, упомянутой @tar, содержит фильтр, который сохраняет среднее значение измерений RSSI в течение 20 секунд, отбрасывая верхние и нижние 10 процентов выборок. Это дает оценку расстояния, которая является достаточно стабильной, с компромиссом, что он отстает во времени, когда пользователь перемещается относительно маяка, тем не менее, это похоже на поведение оценок устройства iOS.
Другая проблема с устройствами Android состоит в том, что у каждой модели есть своя антенна Bluetooth с разным усилением. Это означает, что средний уровень принимаемого сигнала на двух разных моделях устройств в одной и той же позиции относительно маяка будет разным. Я могу подтвердить из своих испытаний, что Nexus 4 и Nexus 5 имеют очень разные коэффициенты усиления антенны.
Формула в библиотеке Android Beacon разработана для Nexus 5, но она с открытым исходным кодом, так что вы можете настроить код для любой модели устройства по вашему желанию. Чтобы создать новую формулу для другого устройства, необходимо выполнить несколько измерений RSSI в среднем за 60 секунд на различных расстояниях (0,5 м, 1 м, 2 м, 3 м,... 10 м, 12 м... 20 м), а затем выполнить расчет наилучшего соответствия,
В будущем планируется создать библиотеку с открытым исходным кодом, которая будет иметь другую формулу, встроенную для наиболее распространенных моделей устройств, и указать формулу расстояния, используемую на основе проверки устройства. Это большая работа, поэтому, если вы можете помочь волонтеру, пожалуйста, нажмите на мою фотографию, чтобы связаться со мной!
Ну, во-первых, расстояние - это оценка, и никакой SDK не даст вам последовательных ответов, потому что RSSI зависит от многих факторов, которые находятся вне его контроля. Если вам нужны материалы для чтения, Шейн Рассел опубликовал "Полутехнический анализ работы с iBeacons".
В Radius Networks раньше была библиотека с открытым исходным кодом для Android и iOS. Вы можете попросить их об этом приятно, хотя они сняли его в конце этого лета. Кроме того, они, кажется, сделали замену библиотеке AltBeacon, которая может удовлетворить ваши потребности. Кроме того, будучи GitHub... этот репозиторий по-прежнему содержит весь код, который он использовал, поэтому не стесняйтесь оглядываться назад и брать то, что вам нужно.
Что касается вашего беспокойства о том, что измерения так далеки от 1 метра, это может быть связано с некалиброванным сигналом. Посмотрите документацию для вашего оборудования, и вы почти наверняка найдете способ ввести значение калибровки. Это значение транслируется любому слушающему, чтобы эти устройства могли оценить расстояние.
Обратите внимание, что некоторые устройства iBeacon имеют настраиваемый уровень мощности, поэтому, если вы измените его, вам также потребуется откалибровать его.