Android测距频率上的Altbeacons

时间:2015-08-31 16:30:46

标签: android ibeacon altbeacon

我是编程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。有谁知道这样做?

提前致谢,帕特里克

2 个答案:

答案 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");
  }

然而,在您这样做之前,请确保您理解一些概念:

  1. 如果将扫描间隔从默认值(1100毫秒)缩短到100毫秒,则会丢失大量数据包,因为如果在扫描停止并重新启动期间传输,则会丢失数据包。

  2. 虽然您会在较短的扫描间隔内更频繁地获得回调,但它会使用更多的CPU,并且由于上述问题,您通常会在回调中获得零信标。

  3. 使用以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();
    }

这有助于我快速更新距离,但距离精度降低了