Ibeacon регионы закрытые наборы?

Мы пытаемся использовать библиотеку Altbeacon для решения следующего учебного случая: Мы хотим разместить несколько IBeacon в комнате или коридоре на расстоянии не более 3 метров между каждым из них, и мы хотим получить текущий ближайший Ibeacon на основе телефон пользователя, который сканирует маяки. Сначала мы попытались построить регионы только с одним маяком в каждом, задаваясь вопросом, что регион представляет собой закрытое множество, а это означает, что когда вы входите в регион, вы не можете одновременно находиться в другом регионе, а когда вы покидаете регион, вводишь в следующий ближайший и так. Но это не тот подход, который реализует библиотека. Мы хотим знать, есть ли в библиотеке Altbeacon какой-либо способ применить наш подход или нужно сделать какой-то патч, чтобы удовлетворить учебный пример, который я вам представляю.


person Jorge Revuelta    schedule 20.10.2014    source источник
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