Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用android信标库检测Eddystone TLM_Android_Altbeacon_Beacon_Eddystone - Fatal编程技术网

使用android信标库检测Eddystone TLM

使用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

我配置为检测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: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,库在测距回调中不提供单独的信标实例。库intead将此帧类型视为对AltBeacon或Eddystone UID等主信标帧的补充。因此,如果检测到来自同一设备的另一个主信标帧,它将仅提供来自Eddystone TLM的信息

其工作方式是,当检测到AltBeacon或Eddystone UID等信标帧时,将创建一个
信标
对象并将其传递给测距回调。当检测到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做广告,我相信这个附件会起作用(尽管我还没有测试过这个配置)