Мы пытаемся использовать библиотеку Altbeacon для решения следующего учебного случая: Мы хотим разместить несколько IBeacon в комнате или коридоре на расстоянии не более 3 метров между каждым из них, и мы хотим получить текущий ближайший Ibeacon на основе телефон пользователя, который сканирует маяки. Сначала мы попытались построить регионы только с одним маяком в каждом, задаваясь вопросом, что регион представляет собой закрытое множество, а это означает, что когда вы входите в регион, вы не можете одновременно находиться в другом регионе, а когда вы покидаете регион, вводишь в следующий ближайший и так. Но это не тот подход, который реализует библиотека. Мы хотим знать, есть ли в библиотеке Altbeacon какой-либо способ применить наш подход или нужно сделать какой-то патч, чтобы удовлетворить учебный пример, который я вам представляю.
Ibeacon регионы закрытые наборы?
comment
Я не знаю библиотеку Altbeacon, но если она похожа на другие библиотеки маяков, вы должны ранжировать маяки, а не регионы мониторинга, чтобы найти ближайший маяк.
- person Jerome Diaz   schedule 20.10.2014
comment
С помощью этой библиотеки вы можете только ранжировать маяки внутри определенного региона, где вы можете найти ближайший внутри региона (предположим, что их два или более). Мы хотим, чтобы приложение входило только в ближайший регион, и при входе в один мы не выходим из него, пока не появится другой регион ближе к нам.
- person Jorge Revuelta   schedule 20.10.2014
comment
Регионы существуют только на Android на уровне кода, предоставленного вашим приложением, включая эту библиотеку. Что касается Android, содержимое пакета BLE является произвольными данными, и ваши варианты открыты. Однако, если вы хотите быть совместимым с iOS, вам нужно использовать как можно меньше регионов, так как существуют жесткие ограничения на то, сколько вы можете искать за один раз.
- person Chris Stratton   schedule 21.10.2014
Ответы (1)
Самый простой способ достичь этой цели — использовать диапазон для всех маяков, используя один регион, и начать ранжирование:
@Override
public void onBeaconServiceConnect() {
try {
// Set up a region that matches all of your beacons. You may want to replace the first
// null with a UUID that all your beacons share.
Region allBeaconsRegion = new Region("all beacons", null, null, null);
beaconManager.startRangingBeaconsInRegion(mAllBeaconsRegion);
beaconManager.setRangeNotifier(this);
} catch (RemoteException e) {
Log.e(TAG, "Cannot connect to beacon service");
}
}
Обратите внимание: если вы используете пользовательский класс приложения с RegionBootstrap
, вы можете поместить приведенный выше код внутри метода didEnterRegion
, а не внутри метода onBeaconServiceConnect
.
Как только вы начнете ранжирование, вы будете получать обратный вызов один раз в секунду со списком всех видимых маяков. Вы можете добавить код, чтобы определить, какой из них ближе всего:
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region arg1) {
Beacon closestBeacon = null;
for (Beacon beacon : beacons) {
if (closestBeacon == null) {
closestBeacon = beacon;
}
else {
if (closestBeacon.getDistance() > beacon.getDistance()) {
closestBeacon = beacon;
}
}
}
// Do Something with closestBeacon here
}
Имейте в виду, что ближайший маяк может меняться из-за радиопомех, поэтому вам, вероятно, потребуется добавить дополнительную логику для защиты от слишком частого переключения ближайшего маяка.
person
davidgyoung
schedule
20.10.2014