【问题标题】:Altbeacon library: eddystone beacon going out of region (apparently) for no reasonAltbeacon 库:eddystone 信标(显然)无缘无故离开区域
【发布时间】:2017-04-25 01:36:01
【问题描述】:

我有一个在移动时以 10Hz 传输的信标(eddystone UID、eddystone TLM 和 iBeacon),当移动停止时,它会继续传输 1 分钟然后停止。 我的目标是检测信标何时停止移动,因此我使用了以下代码,这实际上是 altbeacon 网页上提供的具有自定义时间的基本示例:

public class BeaconReaderActivity extends Activity implements BeaconConsumer, MonitorNotifier, RangeNotifier {

    private BeaconManager beaconManager;
    private Region beaconRegion;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_beacon_reader);

        beaconManager = BeaconManager.getInstanceForApplication(this);
        beaconManager.getBeaconParsers().add(new BeaconParser()
            .setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
        beaconManager.getBeaconParsers().add(new BeaconParser()
            .setBeaconLayout(BeaconParser.EDDYSTONE_TLM_LAYOUT));
        beaconManager.setRegionStatePeristenceEnabled(false);

        beaconManager.setForegroundScanPeriod(101L);
        beaconManager.setForegroundBetweenScanPeriod(0L);
        beaconManager.setBackgroundScanPeriod(101L);
        beaconManager.setBackgroundBetweenScanPeriod(0L);

        beaconRegion = new Region(
            "beacon-region",
            null,
            Identifier.parse(INSTANCE_ID),
            null);

        beaconManager.bind(this);
    }

    @Override
    public void onBeaconServiceConnect() {
        beaconManager.addMonitorNotifier(this);
        try {
           beaconManager.startMonitoringBeaconsInRegion(beaconRegion);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void didEnterRegion(Region region) {
        beaconManager.addRangeNotifier(this);
        try {
            beaconManager.startRangingBeaconsInRegion(beaconRegion);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void didExitRegion(Region region) {
        try {
            beaconManager.stopRangingBeaconsInRegion(beaconRegion);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void didDetermineStateForRegion(int i, Region region) {
        switch (i) {
            case 0:
                Log.e("BEACON MANAGER", "Beacon out of region");
                break;
            case 1:
                Log.e("BEACON MANAGER", "Beacon entered in region");
                break;
        }
    }

    @Override
    public void didRangeBeaconsInRegion(final Collection<Beacon> beacons, Region region) {
        Log.e("BEACON MANAGER", "Frame received");
    }
}

不幸的是,我遇到了两种问题:

  1. 有时信标需要很长时间才能进入该地区;
  2. 信标经常从区域退出,似乎是无缘无故的,虽然与接收到的最后一帧的间隔远低于 10 秒(退出区域周期仍然是默认值);在logcat下面:

    04-24 11:46:04.669 8254-10315/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:04.838 8254-10316/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:04.983 8254-10317/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:05.199 8254-10323/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:05.375 8254-10324/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:05.527 8254-10325/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:05.697 8254-10328/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:05.884 8254-10332/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:06.028 8254-10333/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:06.179 8254-10334/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:06.380 8254-10340/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:06.536 8254-10341/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:06.688 8254-10342/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:06.862 8254-10348/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:06.999 8254-10350/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
    04-24 11:46:07.204 8254-10351/com.applications.r08y.beaconreader E/BEACON MANAGER: Beacon out of region
    

谁能解释一下为什么会这样?我可以做些什么来使软件更健壮吗?

谢谢

--- 编辑---

这里是添加 setDebug(True) 后的 logcat

04-24 15:04:12.045 17067-17082/com.applications.r08y.beaconreader I/art: Debugger is active
04-24 15:04:12.187 17067-17067/com.applications.r08y.beaconreader I/System.out: Debugger has connected
04-24 15:04:12.187 17067-17067/com.applications.r08y.beaconreader I/System.out: waiting for debugger to settle...

...等待调试解决

04-24 15:04:14.790 17067-17067/com.applications.r08y.beaconreader I/System.out: waiting for debugger to settle...
04-24 15:04:14.990 17067-17067/com.applications.r08y.beaconreader I/System.out: debugger has settled (1379)
04-24 15:04:15.077 17067-17067/com.applications.r08y.beaconreader I/InstantRun: starting instant run server: is main process
04-24 15:04:15.245 17067-17067/com.applications.r08y.beaconreader I/BeaconService: beaconService version 2.9 is starting up
04-24 15:04:15.247 17067-17067/com.applications.r08y.beaconreader W/BluetoothCrashResolver: Can't read macs from BluetoothCrashResolverState.txt
04-24 15:04:15.253 17067-17067/com.applications.r08y.beaconreader I/CycledLeScanner: This Android 5.0.  We are using new scanning APIs
04-24 15:04:15.261 17067-17067/com.applications.r08y.beaconreader W/ModelSpecificDistanceCalculator: App has no android.permission.INTERNET permission.  Cannot check for distance model updates
04-24 15:04:15.284 17067-17067/com.applications.r08y.beaconreader W/ModelSpecificDistanceCalculator: Cannot find match for this device.  Using default
04-24 15:04:15.284 17067-17067/com.applications.r08y.beaconreader W/ModelSpecificDistanceCalculator: Cannot find match for this device.  Using default
04-24 15:04:15.288 17067-17067/com.applications.r08y.beaconreader I/BeaconService: binding
04-24 15:04:15.313 17067-17169/com.applications.r08y.beaconreader I/OpenGLRenderer: Initialized EGL, version 1.4
04-24 15:04:15.333 17067-17067/com.applications.r08y.beaconreader E/BEACON MANAGER: Beacon out of region
04-24 15:04:15.353 17067-17169/com.applications.r08y.beaconreader E/libEGL: cache file failed CRC check
04-24 15:04:15.433 17067-17067/com.applications.r08y.beaconreader I/BeaconService: start monitoring received
04-24 15:04:15.443 17067-17067/com.applications.r08y.beaconreader I/CycledLeScanner: Adjusted scanStopTime to be 101
04-24 15:04:38.403 17067-17087/com.applications.r08y.beaconreader I/art: Background partial concurrent mark sweep GC freed 5309(314KB) AllocSpace objects, 1(20KB) LOS objects, 39% free, 1695KB/2MB, paused 10.900ms total 41.600ms
04-24 15:04:44.222 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={} ,callback=org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c
04-24 15:04:44.235 17067-17067/com.applications.r08y.beaconreader E/BluetoothLeScanner: application registeration exception
                                                                                    android.os.DeadObjectException
                                                                                        at android.os.BinderProxy.transactNative(Native Method)
                                                                                        at android.os.BinderProxy.transact(Binder.java:504)
                                                                                        at android.bluetooth.IBluetoothGatt$Stub$Proxy.registerClient(IBluetoothGatt.java:851)
                                                                                        at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper.startRegisteration(BluetoothLeScanner.java:245)
                                                                                        at android.bluetooth.le.BluetoothLeScanner.startScan(BluetoothLeScanner.java:137)
                                                                                        at android.bluetooth.le.BluetoothLeScanner.startScan(BluetoothLeScanner.java:106)
                                                                                        at org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop.startScan(CycledLeScannerForLollipop.java:187)
                                                                                        at org.altbeacon.beacon.service.scanner.CycledLeScanner.scanLeDevice(CycledLeScanner.java:190)
                                                                                        at org.altbeacon.beacon.service.scanner.CycledLeScanner.finishScanCycle(CycledLeScanner.java:266)
                                                                                        at org.altbeacon.beacon.service.scanner.CycledLeScanner.scheduleScanCycleStop(CycledLeScanner.java:239)
                                                                                        at org.altbeacon.beacon.service.scanner.CycledLeScanner$1.run(CycledLeScanner.java:235)
                                                                                        at android.os.Handler.handleCallback(Handler.java:815)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                                        at android.os.Looper.loop(Looper.java:194)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:5546)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)
04-24 15:04:44.236 17067-17067/com.applications.r08y.beaconreader E/CycledLeScannerForLollipop: Scan Failed
04-24 15:04:44.236 17067-17067/com.applications.r08y.beaconreader E/CycledLeScannerForLollipop: Scan Failed
04-24 15:04:44.339 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={} ,callback=org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c
04-24 15:04:44.342 17067-17067/com.applications.r08y.beaconreader E/BluetoothLeScanner: application registeration exception
                                                                                    android.os.DeadObjectException
                                                                                        at android.os.BinderProxy.transactNative(Native Method)
                                                                                        at android.os.BinderProxy.transact(Binder.java:504)
                                                                                        at android.bluetooth.IBluetoothGatt$Stub$Proxy.registerClient(IBluetoothGatt.java:851)
                                                                                        at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper.startRegisteration(BluetoothLeScanner.java:245)
                                                                                        at android.bluetooth.le.BluetoothLeScanner.startScan(BluetoothLeScanner.java:137)
                                                                                        at android.bluetooth.le.BluetoothLeScanner.startScan(BluetoothLeScanner.java:106)
                                                                                        at org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop.startScan(CycledLeScannerForLollipop.java:187)
                                                                                        at org.altbeacon.beacon.service.scanner.CycledLeScanner.scanLeDevice(CycledLeScanner.java:190)
                                                                                        at org.altbeacon.beacon.service.scanner.CycledLeScanner.finishScanCycle(CycledLeScanner.java:266)
                                                                                        at org.altbeacon.beacon.service.scanner.CycledLeScanner.scheduleScanCycleStop(CycledLeScanner.java:239)
                                                                                        at org.altbeacon.beacon.service.scanner.CycledLeScanner$1.run(CycledLeScanner.java:235)
                                                                                        at android.os.Handler.handleCallback(Handler.java:815)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                                        at android.os.Looper.loop(Looper.java:194)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:5546)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)
04-24 15:04:44.343 17067-17067/com.applications.r08y.beaconreader E/CycledLeScannerForLollipop: Scan Failed
04-24 15:04:44.343 17067-17067/com.applications.r08y.beaconreader E/CycledLeScannerForLollipop: Scan Failed
04-24 15:04:44.447 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={} ,callback=org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c
04-24 15:04:44.457 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@2aa317e2}

...扫描尝试...

04-24 15:05:33.076 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@286a8874} ,callback=org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c
04-24 15:05:33.083 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@28a7a19d}
04-24 15:05:33.152 17067-18004/com.applications.r08y.beaconreader E/BEACON MANAGER: Beacon entered in region
04-24 15:05:33.152 17067-17067/com.applications.r08y.beaconreader I/BeaconService: start ranging received
04-24 15:05:33.189 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@28a7a19d} ,callback=org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c
04-24 15:05:33.195 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@30139a5b}

...大约每 100 毫秒接收帧

04-24 15:05:43.093 17067-18175/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 15:05:43.207 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@13604c34} ,callback=org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c
04-24 15:05:43.223 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@6cff7a0}
04-24 15:05:43.231 17067-18176/com.applications.r08y.beaconreader E/BEACON MANAGER: Beacon out of region
04-24 15:05:43.232 17067-17067/com.applications.r08y.beaconreader I/BeaconService: stop ranging received
04-24 15:05:43.236 17067-18176/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 15:05:43.328 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@6cff7a0} ,callback=org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c
04-24 15:05:43.340 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@3ccedcc}

...扫描

04-24 15:05:45.558 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@214d61fc} ,callback=org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c
04-24 15:05:45.590 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@6b5b085}
04-24 15:05:45.684 17067-18203/com.applications.r08y.beaconreader E/BEACON MANAGER: Beacon entered in region
04-24 15:05:45.684 17067-17067/com.applications.r08y.beaconreader I/BeaconService: start ranging received
04-24 15:05:45.695 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@6b5b085} ,callback=org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c
04-24 15:05:45.700 17067-17067/com.applications.r08y.beaconreader I/BluetoothLeScanner: startRegisteration: mLeScanClients={org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop$2@3b05192c=android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper@192100e7}

--- 编辑 2 --- 扫描时间为 501L 的 logcat

04-24 19:25:35.423 19998-21049/com.applications.r08y.beaconreader E/BEACON MANAGER: Beacon entered in region
04-24 19:25:35.679 19998-21055/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:36.206 19998-21061/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:36.735 19998-21067/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:37.257 19998-21073/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:37.781 19998-21079/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:38.343 19998-21087/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:38.931 19998-21095/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:39.766 19998-21102/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:40.341 19998-21108/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:40.940 19998-21114/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:41.514 19998-21120/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:42.053 19998-21126/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:42.648 19998-21137/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:43.182 19998-21142/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:43.740 19998-21148/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:44.309 19998-21158/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:44.861 19998-21166/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:45.421 19998-21172/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:25:46.032 19998-21178/com.applications.r08y.beaconreader E/BEACON MANAGER: Beacon out of region
04-24 19:25:46.043 19998-21178/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:00.424 19998-21314/com.applications.r08y.beaconreader E/BEACON MANAGER: Beacon entered in region
04-24 19:26:00.685 19998-21319/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:01.264 19998-21325/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:01.836 19998-21331/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:02.387 19998-21335/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:02.950 19998-21342/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:03.513 19998-21347/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:04.067 19998-21353/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:04.672 19998-21362/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:05.215 19998-21366/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:05.805 19998-21373/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:06.387 19998-21380/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:06.936 19998-21385/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:07.515 19998-21392/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:08.103 19998-21400/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:08.714 19998-21406/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:09.320 19998-21411/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:09.874 19998-21413/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:10.498 19998-21419/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received
04-24 19:26:11.081 19998-21424/com.applications.r08y.beaconreader E/BEACON MANAGER: Beacon out of region
04-24 19:26:11.123 19998-21424/com.applications.r08y.beaconreader E/BEACON MANAGER: Frame received

【问题讨论】:

  • 我想知道应用程序是否正在重新启动,可能是由于操作系统因内存压力而终止它,这可能导致退出 .setRegionStatePeristenceEnabled(false)。你能用 .setDebug(true) 捕获类似的日志吗?
  • 感谢@davidgyoung,我编辑了我的帖子,在setDebug(true)之后添加了logcat
  • @davidgyoung 我相信你会注意到从区域退出后立即收到的帧(我在帖子中忘了提到),这看起来很奇怪。
  • 抱歉,我之前没有注意到这一点,但我看到无论是否检测到任何信标,应用都会记录Log.e("BEACON MANAGER", "Frame received");。了解didRangeBeaconsInRegion 方法在扫描周期结束时(每 101 毫秒或 501 毫秒)调用,无论是否检测到信标。您必须查看beacons.size() 以查看是否实际检测到任何内容。也许您真的很长时间没有检测到信标,这就是您退出的原因。
  • 你是对的,我傻了!!!我没有做任何检查,我只是让应用程序记录收到的帧天气或没有“真正”收到帧。

标签: android altbeacon eddystone


【解决方案1】:

您获得不可靠检测的部分原因是配置的 101 毫秒的短扫描周期。

为什么? Android 信标库将在每个扫描周期结束时停止 BLE 扫描,然后重新启动它。这样做是因为一些较旧的 Android 设备无法检测到多个相同的信标广告,除非扫描已停止然后重新开始。大多数较新的设备不会以这种方式运行。但是,无论何时停止并重新启动扫描,都会有一段短暂的时间(因设备而异)可能不会检测到任何数据包。在大约 100 毫秒的扫描周期内,将有很大一部分时间不会检测到数据包。

此问题的部分解决方案已在 [ad-hoc build here](https://github.com/AltBeacon/android-beacon-library/releases/tag/2.9.2-mpb2) 中可用的未发布版本的库中实现。此版本将检测是否在单个扫描周期中检测到两个相同的数据包,如果是,它将不再在每个扫描周期结束时停止扫描。

上述更改可能会解决您设备的问题,但是,即使使用此版本的库,您仍需要一个至少足够长的扫描周期,以便在一个周期内捕获两个数据包:>以 10Hz 传输的信标需要 200 毫秒。 如果您愿意,可以从较长的扫描周期开始以允许进行此检测,然后在收到 didEnterRegion 回调后,将扫描周期更改为更短的值。

【讨论】:

  • 我尝试将扫描时间设置为 501L,但结果相同(请参阅编辑 2)。还有一个关于 2.9.2 版的问题,这个库是只检测到 2 个相同的数据包还是“多个相同的数据包”?换句话说,如果我将扫描时间设置为一小时,我会在一小时内获得所有数据包的信标吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2011-02-27
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多