AltBeacon unstable for OnyxBeacons, cycling through didEnterRegion and didExitRegion repeatedly

你。 提交于 2019-12-08 07:06:25

问题


I am building an application using the AltBeacon library to support Onyx Beacons (Beacon One) and Gimbal Beacons (Series 21)

My test device is a Nexus 7 2013 with Android 4.4.4 KitKat and an Onyx Beacon. The beacon is just sitting less than a meter next to my device and I am not moving it. The beacon is detected and goes to didEnterRegion then after a minute or so it goes to didExitRegion then the cycle repeats.

We have also tested this on a different device (Samsung Phone) using a different (Onyx) beacon. Still the issue occurs. Note that this only happens on the Onyx Beacons (Beacon One). The Gimbal Beacons (Series 21) are only triggered once when in range.

Am I using the correct Beacon Parser strings? Am I implementing this correctly? I am really out of ideas and I wanted to support both beacons.

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());

    }

}

Log

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

回答1:


A few tips:

  • Check the advertising rate of the Onyx Beacon One. For best results, beacons should advertise at a standard 10Hz. Some manufacturers slow down this advertising rate to save battery life. If you have a beacon that is advertising at 1Hz or less often, it can start to be missed periodically by beacon scanners. (Not 100% of packets are detected due to bluetooth radio noise.)

  • If you find that the advertising rate is 1 Hz or less, increase the advertising rate if possible and the issue should go away.

  • If you cannot increase the advertising rate of the beacon, you can slow down the scan rate of the Android Beacon Library to give it more time to collect beacon packets. By default, it uses a scan cycle of 1.1 seconds. You can use a line of code like below to slow this down to 5 seconds. This will work more reliably with beacons that don't advertise very often, but will also give you slower response times to region entries/exits. beaconManager.setForegroundScanPeriod(5000l);



来源:https://stackoverflow.com/questions/34218739/altbeacon-unstable-for-onyxbeacons-cycling-through-didenterregion-and-didexitre

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!