在 Android 中每 100 毫秒执行一次 BEACON 方法

Execute BEACON method every 100 milliseconds in Android

我尝试使用 Estimote 信标进行室内导航 android 应用。这是我用来获取 android 设备和信标之间距离的代码。此代码段大约每 1 秒运行一次。

我需要每 100 毫秒执行一次。

beaconManager.setRangingListener(new BeaconManager.RangingListener() {
  @Override public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) {
    runOnUiThread(new Runnable() {
      @Override public void run() {

        long time= System.currentTimeMillis();
        Log.i("###################### ", " #################");
        Log.i("Time Class ", " Time value in millisecinds "+time);

        toolbar.setSubtitle("Found beacons: " + beacons.size());
        ArrayList<Beacon> newBeacons = new ArrayList<>();

        for (int x=0; x<beacons.size();x++) {
          int major= beacons.get(x).getMajor();
          int minor = beacons.get(x).getMinor();

          if (major==3&&minor==3) {
            newBeacons.add(beacons.get(x));
            Dsi[0] = Utils.computeAccuracy(beacons.get(x));
          }
          else if (major==4&&minor==4) {
            newBeacons.add(beacons.get(x));
            Dsi[1] = Utils.computeAccuracy(beacons.get(x));
          }
          else if (major==2&&minor==2) {
            newBeacons.add(beacons.get(x));
            Dsi[2] = Utils.computeAccuracy(beacons.get(x));
          }
        }

        double[][] positions = new double[][] { { -3.4, 0.8}, { 0, 7.5 }, { 6.7, 6.7 } };
        double[] distances = new double[] { Dsi[0], Dsi[1], Dsi[2] };

        TrilaterationFunction trilaterationFunction = new TrilaterationFunction(positions, distances);
        LinearLeastSquaresSolver lSolver = new LinearLeastSquaresSolver(trilaterationFunction);
        NonLinearLeastSquaresSolver nlSolver = new NonLinearLeastSquaresSolver(trilaterationFunction, new LevenbergMarquardtOptimizer());

        double[] expectedPosition = new double[] { 3.3, 15.0 };
        RealVector x = lSolver.solve();
        Optimum optimum = nlSolver.solve();
        testResults(expectedPosition, 1, optimum, x);
        adapter.replaceWith(newBeacons);

        time= System.currentTimeMillis();
        Log.i("Time Class ", " Time value in millisecinds "+time);
        Log.i("###################### ", " #################");
      }
    });
  }
});

我该怎么做?

我得到了这个问题的答案。这里是Estimote Beacon用户和爱好者的答案和解释。

Estimote Android SDK 中有一个名为 setForegroundScanPeriod 的方法。此方法在 BeaconManager class 中实现。这可用于增加或减少扫描时间段。

这是方法定义

setForegroundScanPeriod(long scanPeriodMillis,long waitTimeMillis)

第一个参数为改变扫描周期,第二个参数为两个扫描周期之间的等待时间。所有参数的值都以毫秒为单位。示例如下。

setForegroundScanPeriod(200,5)

如果您这样调用,则代码段每 200 毫秒执行一次,时间间隔为 5 毫秒。

该方法的默认值为扫描时间段为1s,等待时间段为0s。 200ms是最小扫描时间,0ms是最小等待时间。 (如果你减少扫描周期扫描周期,你的Estimote Beacon的广播间隔应该减少。广播间隔应该小于扫描时间周期,并且最小广播间隔是100ms)

减少广播间隔对 Beacon 的电池寿命有负面影响,减少扫描时间周期对 Android 设备的电池寿命有负面影响。

这是我用来扫描信标的完整示例。

BeaconManager beaconManager = new BeaconManager(this);

beaconManager.setForegroundScanPeriod(200,0);

beaconManager.setRangingListener(new BeaconManager.RangingListener() {
  @Override public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) {
    runOnUiThread(new Runnable() {
      @Override public void run() {

        toolbar.setSubtitle("Found beacons: " + beacons.size());

        ArrayList<Beacon> newBeacons = new ArrayList<>();

        for (int x=0; x<beacons.size();x++) {
          int major= beacons.get(x).getMajor();
          int minor = beacons.get(x).getMinor();

          if (major==3&&minor==3) {
            newBeacons.add(beacons.get(x));
            Dsi[0] = Utils.computeAccuracy(beacons.get(x));
          }
          else if (major==4&&minor==4) {
            newBeacons.add(beacons.get(x));
            Dsi[1] = Utils.computeAccuracy(beacons.get(x));
          }
          else if (major==2&&minor==2) {
            newBeacons.add(beacons.get(x));
            Dsi[2] = Utils.computeAccuracy(beacons.get(x));
          }
        }

        adapter.replaceWith(newBeacons);
      }
    });
  }
});