2014-10-20 2 views
0

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

+0

Я не знаю библиотеку Altbeacon, но если это похоже на другие библиотеки маяков, вы должны располагать маяки, а не контролировать области, чтобы найти ближайший маяк. –

+0

С помощью этой библиотеки вы можете выбирать диапазоны маяков внутри определенной области, где вы можете найти ближайший внутри области (предположим, что есть два или более). Мы хотим сделать приложение для входа в только ближайший регион, и при входе в один мы не оставим его до тех пор, пока другой регион не приблизится к нам. –

+0

«Регионы» существуют только на Android на уровне кода, предоставляемого вашим приложением, включая эту библиотеку. Что касается Android, то содержимое пакета BLE - это произвольные данные, и ваши варианты открыты. Однако, если вы хотите быть совместимым с iOS, вам нужно использовать как можно меньше регионов, так как существуют ограниченные ограничения на то, как много вы можете искать сразу. –

ответ

0

Самый простой путь для достижения этой цели является диапазон для всех маяков с использованием одного региона, а также начать в диапазоне:

@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   
} 

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

Смежные вопросы