2015-12-11 5 views
1

Я строю приложение, использующее библиотеку AltBeacon для поддержки Onyx Beacons (Beacon One) и Gimbal Beacons (Series 21)AltBeacon неустойчиво OnyxBeacons, езда на велосипеде через didEnterRegion и didExitRegion неоднократно

Мой тестовое устройство является Nexus 7 2013 с Android 4.4. 4 KitKat и маяк Оникс. Маяк просто сидит на расстоянии менее метра рядом с моим устройством, и я не двигаю его. Маяк обнаружен и переходит в didEnterRegion, а затем через минуту или около того он переходит в didExitRegion, тогда цикл повторяется.

Мы также протестировали это на другом устройстве (Samsung Phone) с использованием другого (Onyx) маяка. Тем не менее проблема возникает. Обратите внимание, что это происходит только на Onyx Beacons (Beacon One). Gimbal Beacons (Series 21) запускаются только один раз в диапазоне.

Я использую правильные строки анализатора маяка? Правильно ли я это реализую? У меня действительно нет идей, и я хотел поддержать оба маяка.

BaseApplication

public class BaseApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     startService(new Intent(this, BeaconMonitoringService.class)); 
    } 

} 

BeaconMonitoringService

public class BeaconMonitoringService extends Service implements BeaconConsumer{ 

    private Context context; 

    private BeaconService service; 
    private BeaconManager beaconManager; 
    private NotificationCompat.Builder notifBuilder; 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     context = getBaseContext(); 
     beaconManager = BeaconManager.getInstanceForApplication(this); 
     beaconManager.setBackgroundMode(true); 

     beaconManager.setBackgroundScanPeriod(1100l); 
     beaconManager.setBackgroundBetweenScanPeriod(15000l); 

     String[] beaconParsers = new String[] { "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24", "m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25", "m:2-3=0203,i:14-19l,d:10-13,p:9-9" }; 

     for(String beacon : beaconParsers){ 
      Log.i("BeaconService","layout: "+beacon); 
      beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(beacon));   
     } 
     beaconManager.bind(this); 
    } 

    @Override 
    public void onBeaconServiceConnect() { 
     beaconManager.setMonitorNotifier(new MonitorNotifier() { 

      private String log; 

      @Override 
      public void didEnterRegion(Region region) { 
       Beacon beacon = service.getBeacon(region.getId1().toString(), region.getId2().toString(), region.getId3().toString()); 
       log = "I just saw a beacon for the first time! "+region.getId1()+" "+region.getId2()+" "+region.getId3(); 
       Log.i("BeaconService", log); 
       sendNotification(beacon); 
      } 

      @Override 
      public void didExitRegion(Region region) { 
       Beacon beacon = service.getBeacon(region.getId1().toString(), region.getId2().toString(), region.getId3().toString()); 
       log = "I no longer see a beacon"; 
       Log.i("BeaconService", log); 
      } 

      @Override 
      public void didDetermineStateForRegion(int state, Region region) { 

      } 
     }); 

     List<BackendRegion> regionList = Util.getRegionList(); 
     for(BackendRegion region : regionList){ 
      ArrayList<Beacon> beaconList = region.getBeacons(); 
      for(Beacon beacon : beaconList){ 
       try { 
        String beaconString = region.getUuid().toLowerCase() + " " + beacon.getMajor() + " " + beacon.getMinor(); 
        service.addBeacon(beacon); 
        beaconManager.startMonitoringBeaconsInRegion(new Region(beacon.getIdentifier(), Identifier.parse(region.getUuid()),Identifier.parse(beacon.getMajor()),Identifier.parse(beacon.getMinor()))); 
       } catch (RemoteException e) { } 
      } 
     } 

    } 


    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onDestroy(){ 
     beaconManager.unbind(this); 
     super.onDestroy(); 
    } 

    private void sendNotification(Beacon beacon, InteractiveImage interactiveImage) { 
     this.notifBuilder = new NotificationCompat.Builder(this) 
       .setAutoCancel(true) 
       .setContentTitle("Sample Beacon") 
       .setContentText("A beacon was detected") 
       .setSmallIcon(R.drawable.ic_launcher); 

     Intent notifyIntent = new Intent(this, NotificationActivity.class); 
     notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 

     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notifyIntent, 0); 
     notifBuilder.setContentIntent(pendingIntent); 

     NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationManager.notify(Integer.parseInt(beacon.getId()), notifBuilder.build()); 

    } 

} 

Вход

12-11 15:45:24.103 I/BeaconService: I just saw a beacon for the first time! 20cae8a0-a9cf-11e3-a5e2-0800200c9a66 7 44512 
12-11 15:45:24.784 D/BluetoothAdapter: stopLeScan() 
12-11 15:45:39.698 D/BluetoothAdapter: startLeScan(): null 
12-11 15:45:39.709 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:45:40.830 D/BluetoothAdapter: stopLeScan() 
12-11 15:45:55.794 D/BluetoothAdapter: startLeScan(): null 
12-11 15:45:55.804 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:45:56.985 D/BluetoothAdapter: stopLeScan() 
12-11 15:46:11.920 D/BluetoothAdapter: startLeScan(): null 
12-11 15:46:11.950 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:46:13.091 D/BluetoothAdapter: stopLeScan() 
12-11 15:46:27.996 D/BluetoothAdapter: startLeScan(): null 
12-11 15:46:28.016 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:46:29.147 D/BluetoothAdapter: stopLeScan() 
12-11 15:46:29.227 I/BeaconService: I no longer see a beacon 
12-11 15:46:44.121 D/BluetoothAdapter: startLeScan(): null 
12-11 15:46:44.141 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:46:44.402 I/BeaconService: I just saw a beacon for the first time! 20cae8a0-a9cf-11e3-a5e2-0800200c9a66 7 44512 
12-11 15:46:45.282 D/BluetoothAdapter: stopLeScan() 
12-11 15:47:00.197 D/BluetoothAdapter: startLeScan(): null 
12-11 15:47:00.197 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:47:01.328 D/BluetoothAdapter: stopLeScan() 
12-11 15:47:16.343 D/BluetoothAdapter: startLeScan(): null 
12-11 15:47:16.363 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:47:17.514 D/BluetoothAdapter: stopLeScan() 
12-11 15:47:32.418 D/BluetoothAdapter: startLeScan(): null 
12-11 15:47:32.428 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:47:33.540 D/BluetoothAdapter: stopLeScan() 
12-11 15:47:48.494 D/BluetoothAdapter: startLeScan(): null 
12-11 15:47:48.504 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:47:49.635 D/BluetoothAdapter: stopLeScan() 
12-11 15:48:04.620 D/BluetoothAdapter: startLeScan(): null 
12-11 15:48:04.630 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:48:05.771 D/BluetoothAdapter: stopLeScan() 
12-11 15:48:20.706 D/BluetoothAdapter: startLeScan(): null 
12-11 15:48:20.706 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:48:21.827 D/BluetoothAdapter: stopLeScan() 
12-11 15:48:36.821 D/BluetoothAdapter: startLeScan(): null 
12-11 15:48:36.831 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:48:37.962 D/BluetoothAdapter: stopLeScan() 
12-11 15:48:52.917 D/BluetoothAdapter: startLeScan(): null 
12-11 15:48:52.927 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:48:54.058 D/BluetoothAdapter: stopLeScan() 
12-11 15:49:09.003 D/BluetoothAdapter: startLeScan(): null 
12-11 15:49:09.003 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
12-11 15:49:10.154 D/BluetoothAdapter: stopLeScan() 
12-11 15:49:10.214 I/BeaconService: I no longer see a beacon 

ответ

2

Несколько советы:

  • Проверьте реклама скорость Onyx Beacon One. Для достижения наилучших результатов маяки должны рекламироваться со стандартной частотой 10 Гц. Некоторые производители замедляют эту рекламную ставку, чтобы сэкономить время автономной работы. Если у вас есть маяк, который рекламируется с частотой 1 Гц или менее, он может периодически пропускаться с помощью маяковых сканеров. (Не 100% пакеты обнаруживаются из-за шум радиомодуля Bluetooth.)

  • Если вы обнаружили, что скорость рекламы 1 Гц или менее, увеличить скорость рекламы, если это возможно, и этот вопрос должен уйти.

  • Если вы не можете увеличить скорость рекламы радиомаяка, вы можете замедлить скорость сканирования в Android Beacon Library, чтобы дать ему больше времени, чтобы собрать пакеты радиомаяков. По умолчанию он использует цикл сканирования 1,1 секунды. Вы можете использовать строку кода, как показано ниже, чтобы замедлить ее до 5 секунд. Это будет работать более надежно с маяками, которые не рекламируются очень часто, но также даст вам более медленное время отклика на регионы/выходы. beaconManager.setForegroundScanPeriod(5000l);

+0

Должен ли я изменить 'setBackgroundScanPeriod' также? – bman

+0

Период фонового сканирования по умолчанию уже длиннее, но вы можете увеличить его до 60000l, чтобы быть уверенным, что вы обнаружите маяк. – davidgyoung

+0

Насколько я хочу принять это в качестве ответа, я попытался замедлить скорость сканирования, но проблема все еще сохраняется. – bman