首页 文章

在Altbeacon库的didEnterRegion方法中解析信标信息

提问于
浏览
1

我想在我的应用程序中使用didEnterRegion方法与RegionBootstrap或MonitorNotifier相关联 . 目前我正在使用RegionBootstrap,但MonitorNotifier可能更适合我的应用程序 .

特别是我将一个iBeacon解析器添加到beaconmanager,然后设置一个区域的“Id1”以查找我的iBeacon的UUID部分并将“Id2”和“Id3”设置为Null . 虽然它们在Region中设置为Null,但我希望能够在输入didEnterRegion方法时解析来自这些位置的信息 . 我正在使用“Id2”(主要)和“Id3”(次要)来提供信标的随机识别参数 .

然后,该信息以及来自UUID的一部分数据将在通知中发送给电话用户 . 测试时,我输入的是didEnterRegion方法,但提供的数据只是与“Id1”的设置区域匹配的数据 . 如果有人可以提供任何见解,我们将不胜感激!

我还希望每10秒钟为同一个iBeacon接收didEnterRegion方法,但是通过测试看来,一旦看到特定的iBeacon,didEnterRegion就不会再次进行后续调用 . 有什么方法可以清除iBeacon被捕获,以便后续捕获可能发生?

我正在尝试尽可能降低电池使用率,并且当使用onNonBeaconLEScan的scanRecord数据来解析信息时,即使将前景和背景时间“BetweenScanPeriod”设置为非常大的东西,我也注意到电池消耗很大 . 我真的只需要看到iBeacon进入该区域并提取信息,然后10秒后再次进行 .

Intended application flow -

  • 用户输入具有匹配UUID的信标区域(ID1)

  • 来自ID2和ID3的信标信息被解析并通过通知与ID1一起发送给用户

  • 10秒后用户收到另一个包含相同数据的通知

  • 重复直到人离开区域或iBeacon停止传输

1 回答

  • 0

    获取所需信息的最简单方法是在 didDetermineStateForRegion 回调中启用范围:

    public void didDetermineStateForRegion(int state, Region region) {
        beaconManager.startRangingBeaconsInRegion(region);
        beaconManager.addRangeNotifier(this);
    }
    
    public void didRangeBeaconsInRegion(Region region, List<Beacon> beacons) {
      for (Beacon beacon : beacons) {
         Identifier id2 = beacon.getId2();
         Identifier id3 = beacon.getId3();
         // Now do something with id2 and id3
      }
    }
    

    _1183522_回调将使用默认设置每1100毫秒进行一次,但是如果您希望在第一次访问BeaconManager时使用这样的行,则可以将其更改为10秒:

    beaconManager.setScanPeriod(10000l); 
    beaconManager.setBetweenScanPeriod(0l);
    

    在电池方面,如果你想每10秒获得一次扫描更新,你就会使用大量电池,因为这意味着要进行几乎不变的蓝牙扫描 . 在后台,您可能希望退出并每5分钟仅执行一次10秒扫描:

    beaconManager.setBackgroundScanPeriod(10000l); 
    beaconManager.setBackgroundBetweenScanPeriod(290000l); 
    BackgroundPowerSaver powerSaver = new BackgroundPowerSaver();
    

相关问题