使用android信标库检测Eddystone TLM
我配置为检测Eddystone数据包使用android信标库检测Eddystone TLM,android,altbeacon,beacon,eddystone,Android,Altbeacon,Beacon,Eddystone,我配置为检测Eddystone数据包 beaconManager = BeaconManager.getInstanceForApplication(context); // Detect the main identifier (UID) frame: beaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:1
beaconManager = BeaconManager.getInstanceForApplication(context);
// Detect the main identifier (UID) frame:
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19"));
// Detect the telemetry (TLM) frame:
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("x,s:0-1=feaa,m:2-2=20,d:3-3,d:4-5,d:6-7,d:8-11,d:12-15"));
// Detect the URL frame:
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-21v"));
beaconManager.bind(this);
Android信标库中从未检测到中的信标
@Override
public void onBeaconServiceConnect() {
beaconManager.addMonitorNotifier(this);
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons,
Region region) {
if (beacons.size() > 0) {
Extra.log("Beacons detected", "info");
//Process beacons data...
}
}
});
try {
beaconManager.startRangingBeaconsInRegion(new Region(
"myRangingUniqueId", null, null, null));
} catch (RemoteException e) {
}
}
@覆盖
BeaConserviceConnect()上的公共无效({
beaconManager.addMonitorNotifier(此);
beaconManager.addRangeNotifier(新的RangeNotifier(){
@凌驾
公共范围信标区域(收集信标,
(区域){
如果(beacons.size()>0){
额外日志(“检测到的信标”、“信息”);
//处理信标数据。。。
}
}
});
试一试{
StarTrangBeaconRegion(新区域)信标经理(
“myRangingUniqueId”,空,空,空);
}捕获(远程异常){
}
}
测试:
- 如果在Eddystone TML中配置了信标,我可以使用制造商应用程序检测信标遥测数据
- 如果在Eddystone TML中配置了信标,则我无法使用库检测信标
- 如果在Eddystone UID中配置了信标,我可以使用库和制造商应用程序正确检测信标
- 确保调用了onbeacerviceconnect()。添加一个
语句以确保Log.d
- 如果您正在Android 6+上测试,请确保您的应用程序已获得位置权限。有关更多信息,请参阅李>
信标对象并将其传递给测距回调。当检测到Eddystone TLM帧来自与主信标帧相同的MAC地址时,遥测信息附加到主信标帧的对象。要访问此信息,请致电:
// Do we have telemetry data?
if (beacon.getExtraDataFields().size() > 0) {
long telemetryVersion = beacon.getExtraDataFields().get(0);
long batteryMilliVolts = beacon.getExtraDataFields().get(1);
long pduCount = beacon.getExtraDataFields().get(3);
long uptime = beacon.getExtraDataFields().get(4);
Log.d(TAG, "The above beacon is sending telemetry version "+telemetryVersion+
", has been up for : "+uptime+" seconds"+
", has a battery level of "+batteryMilliVolts+" mV"+
", and has transmitted "+pduCount+" advertisements.");
}
onBeaconServiceConnect()在开始时调用一次。DidRangeBeaconsistinregion with beacons.size()==0会被多次调用,即使beacon已关闭。这个设备是安卓5.1。我在同一个设备上用Eddystone-UID和Albeacon信标测试了这个库,工作正常。问题仅出现在Eddystone-TLM信标中。问题已在信标配置=UID+TLM中解决。这只是TLM,这就是问题所在。@DavidYoung是否有任何限制允许仅将遥测附加到AltBeacon或Eddystone UID帧?在我正在开发的应用程序中,我们使用的是iBeacon,信标本身作为iBeacon、sBeacon和所有三个Eddystone进行广告宣传,因此,将TLM作为iBeacon(或任何其他主帧类型)的补充也很好。库将根据信标的MAC地址将遥测附加到其他信标帧。因此,如果beacon正在为iBeacon和Eddystone TLM做广告,我相信这个附件会起作用(尽管我还没有测试过这个配置)