在 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);
}
});
}
});
我尝试使用 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);
}
});
}
});