2016-05-19 7 views
0

Я довольно новичок в разработке Android и Bluetooth LE. Я довольно много исследовал перед публикацией здесь. Я уверен, что я что-то делаю неправильно, и я не могу понять это.AltBeacon didEnterRegion()/didExitRegion не работает должным образом с PiBeacon. Методы случайным образом называются

Я хочу, чтобы мое приложение для Android выполняло некоторый код, когда он попадает в заданный диапазон определенного маяка (RaspberryPi с Bluetooth-ключом).

Это команда я использую на RPi начать испускать:

sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39 
    F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8 00 

я редактировал BeaconLayout обнаружить iBeacons:

beaconManager.getBeaconParsers().add(new BeaconParser(). 
      setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 

Помимо таможенной области, код от Документация AltBeacon.

Region region1 = new Region("RaspberryPi", Identifier.parse("E20A39F4-73F5-4BC4-A12F-17D1AD07A961"), null, null); 

beaconManager.setMonitorNotifier(new MonitorNotifier() { 
     @Override 
     public void didEnterRegion(Region region) { 
      Log.i(TAG, "I just saw a beacon for the first time!"); 
     } 

     @Override 
     public void didExitRegion(Region region) { 
      Log.i(TAG, "I no longer see a beacon"); 
     } 

     @Override 
     public void didDetermineStateForRegion(int state, Region region) { 
      Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+ state); 
     } 
    }); 

try { 
    beaconManager.startMonitoringBeaconsInRegion(region1); 
} catch (RemoteException e) {  } 

Теперь вот часть журнала, который я получаю. В течение этого времени маяк не покидал регион. для тех немногих звонков, которые происходят случайно, когда я запустить приложение Кроме этого, методы никогда не дозвонились снова:

05-19 23:18:52.487 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 
05-19 23:18:53.952 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 
05-19 23:18:55.195 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 
05-19 23:18:56.570 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 
05-19 23:18:57.742 31204-31219/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 
05-19 23:18:57.782 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 0 
05-19 23:18:57.782 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I no longer see a beacon 
05-19 23:18:57.790 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 0 
05-19 23:18:57.790 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I no longer see a beacon 
05-19 23:18:57.790 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 0 
05-19 23:18:57.790 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I no longer see a beacon 
05-19 23:18:58.933 31204-31219/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 
05-19 23:19:00.098 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 
05-19 23:19:01.287 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 
05-19 23:19:01.537 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 1 
05-19 23:19:01.537 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I just saw a beacon for the first time! 
05-19 23:19:01.538 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 1 
05-19 23:19:01.538 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I just saw a beacon for the first time! 
05-19 23:19:01.539 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 1 
05-19 23:19:01.539 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I just saw a beacon for the first time! 
05-19 23:19:02.629 31204-31219/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 

Я предполагаю, что это имеет какое-то отношение скорости передачи в Raspberry Pi, но я был не в состоянии изменить это к чему-то, что работает.

+0

Обратите внимание, что 'didDetermineStateForRegion',' 'didEnterRegion' и didExitRegion' обратные вызовы только дозвонились, когда начинается радиомаяка или перестает быть обнаруженным. Если вы ожидаете регулярных обратных вызовов во время видимости маяка, вы должны использовать API ранжирования, которые будут называть 'didRangeBeaconsInRegion' примерно раз в секунду. – davidgyoung

ответ

0

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

Журналы показывают, что у вас был отказ от обнаружения маяковых сигналов, вызвавший событие выхода в 05-19 23 : 18: 57,782, затем еще одно событие в 05-19 23: 19: 01.537. Хотя этот период времени выглядит довольно коротким (около 4 секунд), выпад должен быть значительно длиннее этого. По умолчанию Android Beacon Library не отправит событие выхода из региона, пока не увидит, что маяк соответствует определению региона в течение 10 секунд. Это означает, что был на 14 секунд, когда ваше устройство Android не увидело передачи от малины Pi.

Это нормально для некоторых передач от маяка, которые не могут быть приняты устройством Android. На близком расстоянии, возможно, 80% пакетов принимаются правильно, а остальные теряются из-за радиошумов, коллизий, проблем с каналами или других низкоуровневых коэффициентов Bluetooth. Если вам действительно не повезло, вы можете пропустить несколько передач подряд. Но пропускать более двух-трех передач подряд должно быть крайне редко.

Это означает, что одна из двух вещей не так:

  • Вашего Raspberry Pi не реклама очень часто (возможно, только один раз каждые 5 секунд, что бы вызвать некоторую область выход, если вы пропустили два пакета в ряд).

  • На вашем Android-устройстве отсутствует большое количество пакетов. Иногда это может быть вызвано помехами WiFi/Bluetooth на устройствах с известными помехами, такими как Nexus 7, Nexus 4, Moto G и Moto X.

Чтобы выяснить, какой именно попробовать следующее:

  1. Выключайте Wi-Fi на вашем Android устройстве. Решает ли это проблему?

  2. Увеличьте скорость передачи малины Pi BlueZ. Вы можете увидеть, как это сделать в моем ответе here.

+0

Я использую Nexus 5 на 6.0.1 для тестирования. Пытался отключить WiFi, ничего не изменилось, даже на этот раз не появился один вызов метода. Кроме того, после публикации здесь я нашел точный ответ, но я не совсем уверен, какую частоту использовать для интервалов min/max. Я использовал рекомендованные вами команды (вторая команда с A0 00 A0 00). Еще ничего. Я попытался использовать приложение Locate, чтобы увидеть, появляется ли маяк, но нет. С другой стороны, когда я использую приложение Beacon Scanner (другое приложение из playStore), появляется маяк. Просто добавлена ​​информация о синтаксическом разборе в приложении «Локация», она также появляется там. –

+0

Когда вы говорите «Все еще ничего», вы имеете в виду, что по-прежнему вы получаете прерывистые события выхода? – davidgyoung

+0

Что я имел в виду, так это то, что он не вызывал метод надежно, у меня есть еще один набор вызовов, аналогичный тому, который был в первом сообщении, а также никакого вызова во второй раз, когда я пытался. С другой стороны, я попробовал приложение на Galaxy s4, работающем на леденец, и он работал безупречно. Поэтому я предполагаю, что есть ошибка в зефире или какие-то другие разрешения необходимы. Я не уверен, что мне нужно искать. –

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

  • Нет связанных вопросов^_^