如何使用Android ALT Beacon库唯一识别iBeacon?

时间:2015-06-18 08:06:02

标签: ibeacon altbeacon android-ibeacon

我已经将我的iphone 4s变为iBeacon,并且能够使用我的Glaxy S4,5.01中的Locate Beacon应用程序检测到这一点,我还使用beacon reference library通过修改this question找到的布局来检测到这一点。它显示了来自库文件的设备日志中的检测信标,如下所示,

onScanResult() - ScanResult {mDevice = 6C:64:80:68:86:59,mScanRecord = ScanRecord [mAdvertiseFlags = 26,mServiceUuids = null,mManufacturerSpecificData = {76 = [2,21,-96,-54] ,104,-88,101,-76,75,30,-66,-91,73,-91,-114,-5,-124,29,0,0,0,0,-59]}, mServiceData = {},mTxPowerLevel = -2147483648,mDeviceName = null],mRssi = -46,mTimestampNanos = 162979288294680}

我的设备名称始终为空,也无法获取uuid,我无法在我的应用程序中获取,任何人都可以帮助我如何在我的应用程序中获取信标信息?

另外,我如何唯一地识别信标?

这是我到目前为止所做的,下载了一个ALT信标库,然后是ALT信标库参考,添加了库依赖,并在Ranging Activity类中编写了以下代码,

将onCreate方法修改为

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ranging);
    beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().add(new BeaconParser().
              setBeaconLayout("m:0-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));  // iBeacons
    beaconManager.bind(this);

}

并通过BeaconConsumer实现此功能,并将其方法添加为

@Override
public void onBeaconServiceConnect() {
    // TODO Auto-generated method stub
    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) {  e.printStackTrace();  }
}

如果我没有运行代码,

beaconManager.getBeaconParsers().add(new BeaconParser().
              setBeaconLayout("m:0-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));  // iBeacons

然后,如前所述添加此语句获取异常时,它可以正常工作。

2 个答案:

答案 0 :(得分:1)

最后我能够识别我的问题,我的灯塔解析器错了

beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:0-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 

我正在使用这个,而我正确的结果,检测到我的ibeacon是由这个解析器

beaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));

答案 1 :(得分:0)

当您真正想要使用信标测距时,听起来您正在使用信标监控。监控用于告诉您何时首先检测到具有共享标识符部分(或根本没有任何信标)的一组信标中的任何一个。但它并没有告诉你视野中信标的确切标识符。

为了读取在给定时间可见的信标的标识符,您应该使用测距API。这些API每秒为您提供一次代码回调,其中列出了与您定义的Region匹配的所有可见信标。

@Override 
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
     for (Beacon beacon: beacons) {
        Log.i(TAG, "I see a beacon with identifiers: "+beacon.getId1()+" "+beacon.getId2()+" "+beacon.getId3());        
     }
}

有关如何进行设置的更多详细信息,请参阅Ranging Example Code on this page