我如何使用 android ALT Beacon 库唯一标识一个 iBeacon?
How can i uniquely identify an iBeacon using android ALT Beacon library?
我已将我的 iphone 4s 设为 iBeacon,并且能够使用我的 Glaxy S4, 5.01 中的 Locate Beacon 应用程序检测到这一点,我还使用 beacon reference library by modifying its layout found from 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 class, [=15] 中编写了以下代码=]
将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
那么当添加这个语句时它工作正常,如前所述。
当你真的想使用信标测距时,听起来你正在使用信标监控。监控用于告诉您何时首次检测到具有共享标识符部分(或任何信标)的一组信标中的任何一个。但它不会告诉您视图中信标的确切标识符。
为了读取在给定时间可见的信标标识符,您应该使用 Ranging API。这些 API 每秒为您的代码提供一次回调,其中包含与您定义的区域匹配的所有可见信标的列表。
@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。
终于我能够确定我的问题了,我的信标解析器是错误的
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"));
我已将我的 iphone 4s 设为 iBeacon,并且能够使用我的 Glaxy S4, 5.01 中的 Locate Beacon 应用程序检测到这一点,我还使用 beacon reference library by modifying its layout found from 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 class, [=15] 中编写了以下代码=]
将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
那么当添加这个语句时它工作正常,如前所述。
当你真的想使用信标测距时,听起来你正在使用信标监控。监控用于告诉您何时首次检测到具有共享标识符部分(或任何信标)的一组信标中的任何一个。但它不会告诉您视图中信标的确切标识符。
为了读取在给定时间可见的信标标识符,您应该使用 Ranging API。这些 API 每秒为您的代码提供一次回调,其中包含与您定义的区域匹配的所有可见信标的列表。
@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。
终于我能够确定我的问题了,我的信标解析器是错误的
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"));