android - 使用 android 信标库检测 Eddystone-TLM

标签 android altbeacon beacon eddystone

我配置android beacon library检测 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) {
  }
}

测试:

  • 如果在 Eddystone-TML 中配置了信标,我可以使用制造商应用检测信标遥测数据。
  • 如果在 Eddystone-TML 中配置了信标,我无法使用库检测信标。
  • 如果在 Eddystone-UID 中配置了信标,我可以使用库和制造商应用程序正确检测到信标。

最佳答案

需要检查两件事以确保您根本没有检测到:

  • 确保调用 onBeaconServiceConnect()。添加 Log.d 语句以确保确定。
  • 如果您在 Android 6+ 上进行测试,请确保您的应用已获得位置权限。请参阅here了解更多信息。

编辑:对于 Eddystone-TLM,该库不在测距回调中提供单独的信标实例。相反,该库将此帧类型视为 AltBeacon 或 Eddystone-UID 等主要信标帧的补充。因此,如果还检测到来自同一设备的另一个主信标帧,它只会提供来自 Eddystone-TLM 的信息。

它的工作方式是,当检测到像 AltBeacon 或 Eddystone-UID 这样的信标帧时,就会创建一个 Beacon 对象并将其传递给测距回调。当检测到 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.");

}

关于android - 使用 android 信标库检测 Eddystone-TLM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39332876/

相关文章:

android - AltBeacon 库 - setBackgroundScanPeriod 不工作

android - Android 设备运行时的 iBeacon 准确性

javascript - 您可以使用 Service Worker 在网络蓝牙中运行后台 iBeacon/Eddystone 扫描吗?

android - 自定义列表适配器重复条目

ios - 在 iOS 中使用 CLLocationmanager 监控 20 多个 BLE 信标区域

ios - 信标测距与 BLE 扫描

linux - 我们如何从 Linux 中的蓝牙信标(具体估计)获取 RSSI 值?

Android - Facebook SDK 4.0.0 - 图片共享时不显示 ShareDialog

android - 未使用 alignParentBottom

android - 如何在实验性Gradle插件中使用dexOption?