首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Alt beacon lib不断触发用户从未离开信标区域的进入和退出区域方法

Alt beacon lib不断触发用户从未离开信标区域的进入和退出区域方法
EN

Stack Overflow用户
提问于 2018-01-14 03:06:50
回答 1查看 501关注 0票数 0

[###预期行为

只有当信标实际离开该区域时,lib才应该消防出口。

实际行为

lib在信标仍在范围内的情况下触发exit和enter region方法。这种情况每隔20秒发生一次,有时频率更高,而在5-7的所有android版本中频率较低

重现此行为的步骤

我在后台连续运行信标应用程序,一旦蓝牙打开搜索信标,信标固定在车内,并以1000s的间隔广播。当用户进入范围时,我必须开始骑行,当用户离开它时,我必须停止骑行,但问题是itt报告信标连续进入和退出,而用户从未离开信标区域。

我的代码片段

代码语言:javascript
复制
public class BackgroundBeaconScan extends Service implements BootstrapNotifier, BeaconConsumer {
 @Override
    public void onCreate() {
        super.onCreate();
        AppUtils.isBGServiceActive = true;
        //AppUtils.appTerminated = false;
        Log.e("Beacon", "Service Start");
        Log.e("Bfpk", " *** Beacon  Service is started *** ");
        LoggingOperations logger = new LoggingOperations();
        Thread.setDefaultUncaughtExceptionHandler(logger);
        mBeaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
        try {
            Log.e("BG", "iam in mBeaconManager to unbind it");
            mBeaconManager.unbind(this);
            mBeaconManager.removeAllRangeNotifiers();
            mBeaconManager.removeAllMonitorNotifiers();
            mBeaconManager.removeMonitoreNotifier(this);
        } catch (OutOfMemoryError e) {
            Log.e("BG", "iam in mBeaconManager to unbind it excep ");

        }
    mBeaconManager.getBeaconParsers().clear();
    //set Beacon Layout for Eddystone-UID packet


    mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
    //   rideBDD = new RideBDD(getApplicationContext());
    mBeaconManager.setForegroundScanPeriod(20001);

    mBeaconManager.setForegroundBetweenScanPeriod(50001);

    mBeaconManager.setBackgroundScanPeriod(20001);

    mBeaconManager.setBackgroundBetweenScanPeriod(50001);

    mBeaconManager.setBackgroundMode(true);

    mBeaconManager.setDebug(true);

    BeaconManager.setAndroidLScanningDisabled(true);

    notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

    namespace = DataHandler.getStringPreferences(AppConstants.UUID_NAME_SPACE);
    instanceID = DataHandler.getStringPreferences(AppConstants.UUID_INSTANCE_ID);
    Log.e("BG", "namespace :" + namespace);
    Log.e("BG", "instanceID :" + instanceID);
    Long currentTime = System.currentTimeMillis();
    String time = formateLongToOnlyDateForServer(currentTime);
    LoggingOperations.writeToFile(BackgroundBeaconScan.this,"UUID > " + time + " -- > " + namespace + " - " + instanceID);



    try {
        Log.e("BG", "iam in mBeaconManager.isBound");
        mBeaconManager.bind(this);
        Log.e("BG", "iam in mBeaconManager.bind");

    } catch (OutOfMemoryError e) {
        Log.e("BG", "iam in mBeaconManager.bindexce", e);

    }


}

我的服务连接

代码语言:javascript
复制
@Override
    public void onBeaconServiceConnect() {
        // String preiBeaconUUID = DataHandler.getStringPreferences(AppConstants.UUID);
        // postiBeaconUUID=AppUtils.addDashes(preiBeaconUUID);
        Region region;
        try {
            Log.e("BG", "iam in onBeaconServiceConnect");
            namespace = DataHandler.getStringPreferences(AppConstants.UUID_NAME_SPACE);

            instanceID = DataHandler.getStringPreferences(AppConstants.UUID_INSTANCE_ID);

            Identifier myBeaconNamespaceId = Identifier.parse(namespace);

            Identifier myBeaconInstanceId = Identifier.parse(instanceID);

            region = new Region("EdstUIDAdvertising", myBeaconNamespaceId, myBeaconInstanceId, null);

            mBeaconManager.addMonitorNotifier(this);
            Log.e("BG", "iam in startMonitoringBeaconsInRegion");

        } catch (Exception e) {
            Log.e("BG", "iam in startMonitoringBeaconsInRegionExce" + e);
            e.printStackTrace();
            namespace = DataHandler.getStringPreferences(AppConstants.UUID_NAME_SPACE);

            instanceID = DataHandler.getStringPreferences(AppConstants.UUID_INSTANCE_ID);

            Identifier myBeaconNamespaceId = Identifier.parse(namespace);

            /* Identifier myBeaconInstanceId = Identifier.parse(instanceID);*/
            region = new Region("EdstUIDAdvertising", myBeaconNamespaceId, null, null);
            mBeaconManager.addMonitorNotifier(this);
            Log.e("BG", "iam in startMonitoringBeaconsInRegion");

        }
        AppUtils.isBGServiceActive = true;
        try {
            mBeaconManager.startMonitoringBeaconsInRegion(region);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        mBeaconManager.addMonitorNotifier(new MonitorNotifier() {
            @Override
            public void didEnterRegion(Region region) {
                Log.e("Monitored", "entered"); this fires at the same time
                enterCount++;

}

  @Override
            public void didExitRegion(Region region) {
                Log.e("Monitored", "exited"); // this fires at the same time

}

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

            }
        });
}

这个

移动设备型号和操作系统版本

三星备注5 (7.0) s6 (6.0) s5 (5.0)每台设备

Android信标库版本

2.12.4 //请帮助我面对这个问题已经很久了

EN

回答 1

Stack Overflow用户

发布于 2018-01-14 03:21:19

这是由间歇性检测信标引起的常见问题。要知道,当很长一段时间没有检测到信标时,库才知道信标何时消失(退出区域)。当扫描周期结束时,如果在至少10秒内看不到以前看到的信标,库将触发区域退出事件。

建议:

  1. 将您的信标传输速率提高到10 Hz或更高。
  2. 如果您不能这样做(1),请将scanPeriod加长,直到问题消失。

示例代码中设置的自定义扫描周期可能会加剧您遇到的问题,该周期显示scanPeriod为5秒,后跟betweenScanPeriod为20秒。如果在5秒scanPeriod期间未能检测到附近的信标。

不清楚为什么在您配置的5秒扫描期间,有时无法检测到您的信标。这可能是因为它们只是不频繁地传输。一些信标仅每隔5秒左右发送一次广告数据包,以节省电池电量。如果是这样的话,它肯定会导致您所描述的问题。即使它们被设置为每秒传输一次,有时也可能由于无线电噪声而丢失一行中的5个数据包。

如果使用库的默认设置,则不太可能发生这种情况,因为扫描是在前台持续执行的(这使得在触发出口之前检测到信标的可能性更大),并在后台持续10秒。如果您不能或不想增加信标的广告速率,我建议您将scanPeriod / betweenScanPeriod设置调整为每30秒大于5秒。

为了库的正常运行,扫描周期必须至少是信标传输周期的5倍。这是因为并非所有的蓝牙数据包都会由于无线电噪声而被接收到。间隔是传输周期的5倍意味着在每个后台扫描周期上有5次机会接收包,这使得库不太可能错过一个包

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48243356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档