我是编程iBeacons的新手,并且想知道是否有人可以使用AltBeacon库(android-beacon-library-2.5.1)帮助我解决有关测距更新的问题。我有一些Radius网络的RadBeacon Dot信标,它们以10Hz的频率进行广告宣传。我只是尝试AltBeacon快速入门页面中的测距示例,如下所示:
public class RangingActivity extends Activity implements BeaconConsumer {
protected static final String TAG = "RangingActivity";
private BeaconManager beaconManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ranging);
beaconManager = BeaconManager.getInstanceForApplication(this);
// To detect proprietary beacons, you must add a line like below corresponding to your beacon
// type. Do a web search for "setBeaconLayout" to get the proper expression.
// beaconManager.getBeaconParsers().add(new BeaconParser().
// setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
beaconManager.bind(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
beaconManager.unbind(this);
}
@Override
public void onBeaconServiceConnect() {
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
Log.i(TAG, "The first beacon I see is about "+beacons.iterator().next().getDistance()+" meters away.");
}
}
});
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
} catch (RemoteException e) { }
}}
这一切都很简单,但测距仅通过 didRangeBeaconsInRegion 回调以1Hz的频率返回范围数据。我想知道如何更频繁地从库中获取范围数据,并且无法看到如何做到这一点。由于信标适用于10Hz,我理想地希望以此速率(或接近它)从它们中采样rssi值。可以将蓝牙扫描时间设置为相应的值,但回调仍然只发生在1 Hz。有谁知道这样做?
提前致谢,帕特里克
答案 0 :(得分:1)
如果您想将Android Beacon Library的默认扫描间隔更改为100毫秒,您可以使用以下代码执行此操作:
try {
beaconManager.setForegroundScanPeriod(100l); // 100 mS
beaconManager.setForegroundBetweenScanPeriod(0l); // 0ms
beaconManager.updateScanPeriods();
}
catch (RemoteException e) {
Log.e(TAG, "Cannot talk to service");
}
然而,在您这样做之前,请确保您理解一些概念:
如果将扫描间隔从默认值(1100毫秒)缩短到100毫秒,则会丢失大量数据包,因为如果在扫描停止并重新启动期间传输,则会丢失数据包。
虽然您会在较短的扫描间隔内更频繁地获得回调,但它会使用更多的CPU,并且由于上述问题,您通常会在回调中获得零信标。
使用以10 Hz通告的信标与使用1 Hz通告的信标的主要原因是不以获得更频繁的回调。 (例如,在iOS上,回调固定为1 Hz且不可更改。)10 Hz信标的主要原因是为更好的距离估计获得更多的测距统计样本。您必须使用的信号强度测量值越多,您获得的距离估算就越稳定和准确。
答案 1 :(得分:0)
RangedBeacon.setSampleExpirationMilliseconds(5000); // default is 20000
beaconManager.setForegroundScanPeriod(100l); // 100 mS
beaconManager.setForegroundBetweenScanPeriod(0l); // 0ms
try {
beaconManager.updateScanPeriods();
} catch (RemoteException e) {
e.printStackTrace();
}
这有助于我快速更新距离,但距离精度降低了