#android #altbeacon
#Android #altbeacon
Вопрос:
Это моя деятельность :
public class MyActivity extends Activity implements BeaconConsumer, RangeNotifier {
private BeaconManager mBeaconManager;
@Override
public void onResume() {
super.onResume();
mBeaconManager = BeaconManager.getInstanceForApplication(this.getApplicationContext());
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout(BeaconParser.EDDYSTONE_TLM_LAYOUT));
mBeaconManager.setBackgroundBetweenScanPeriod(0);
mBeaconManager.setBackgroundScanPeriod(1100);
try {
mBeaconManager.updateScanPeriods();
} catch (RemoteException e) {
e.printStackTrace();
}
mBeaconManager.bind(this);
}
public void onBeaconServiceConnect() {
Region region = new Region("all-beacons-region", null, null, null);
try {
mBeaconManager.startRangingBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
mBeaconManager.addRangeNotifier(this);
}
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
Log.e("beacon size" , beacons.size() "");
for (Beacon beacon : beacons) {
// This is a Eddystone-UID frame
Identifier namespaceId = beacon.getId1();
Identifier instanceId = beacon.getId2();
Log.e("Beacon ", beacon.getBluetoothName() " id: " namespaceId
" id2: " instanceId
" id3 " beacon.getId3());
// Do we have telemetry data?
if (beacon.getExtraDataFields().size() > 0) {
long telemetryVersion = beacon.getExtraDataFields().get(0);
long batteryMilliVolts = beacon.getExtraDataFields().get(1);
long pduCount = beacon.getExtraDataFields().get(3);
long uptime = beacon.getExtraDataFields().get(4);
}
}
}
@Override
public void onPause() {
super.onPause();
mBeaconManager.unbind(this);
}
}
И didRangeBeaconsInRegion иногда выдает мне массив маяков = 0. Почему? Иногда мне приходится ждать 3-4 секунды, чтобы получить массив размером не 0.
иногда мне приходится немного подождать, чтобы получить непустую плату becons, и я не знаю, почему это происходит и что я делаю не так
Ответ №1:
Несколько баллов:
- Не 100% переданных маяков принимаются. Причины пропущенных обнаружений включают радиошум и столкновения. Как правило, 80-90% передач принимаются с близкого расстояния (меньше на больших расстояниях) и меньше со слабыми приемниками.
- Хотя 80 процентов может показаться высоким показателем успеха, закон средних значений означает, что иногда будут длительные периоды, когда вы не получаете обнаружения. Это похоже на подбрасывание монеты и получение орлов 10 раз подряд. Это случается.
- Разные маяки рекламируются с разной скоростью. Apple рекомендует передатчик с частотой 10 Гц, но многие производители маяков снижают частоту до 1 Гц или меньше, чтобы сэкономить время автономной работы. К сожалению, нечастая передача приведет к более частым проблемам, подобным описанным здесь. Если вы можете, настройте свой маяк на скорость передачи 10 Гц. Если вы не знаете скорость передачи вашего маяка, вы можете использовать мое приложение BeaconScope для анализа вашего маяка и подсчета полученных PPS (пакетов в секунду). Примечание: показатель PPS в этом приложении всегда будет немного меньше фактического показателя рекламы, потому что некоторые пакеты теряются при получении, как описано выше.
- Разные телефоны сканируют с помощью разных «окон сканирования», особенно в фоновом режиме. Телефоны Samsung, например, время от времени переключаются на сканирование с низким энергопотреблением в фоновом режиме, которое выполняется в течение 0,5 секунды каждые 10 секунд в фоновом режиме, даже если приложение сообщило ему о необходимости постоянного сканирования. Другие OEM-производители имеют аналогичные оптимизации. Это уменьшает частоту обнаружений, потому что приемник должен быть включен, когда передатчик маяка отправляет свою рекламу.