如何捕获单独的 Eddystone 帧

How Catch separate Eddystone Frames

我正在开发 Eddystone 库解析器。 我没看懂的节点是这样的:

我使用此回调从信标获取数据:

    private BluetoothAdapter.LeScanCallback mLeScanCallback =
        new BluetoothAdapter.LeScanCallback() {

    @Override
    public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
        runOnUiThread(new Runnable() {
               @Override
               public void run() {
                  ...

我在byte[] scan中获取来自beacon的字节记录。我不明白的是 Eddystone 信标的行为方式。他们是每次都为信标传输的每一帧调用 onLeScan 回调,还是只对扫描记录中的所有帧调用一次回调?如果多次调用 onLeScan,我该如何区分并将同一信标发送的帧与同一字段中其他信标发送的帧分开?

每个 Eddystone 帧都将在其自己的扫描记录中,并将自己回调到 onLeScan。对于多个帧的情况(例如,将 Eddystone-TLM 与 Eddystone-UID 组合),您需要通过某种方式知道两者来自同一个物理信标。

执行此操作的典型方法是使用蓝牙 MAC 地址,该地址对于每个硬件发射器都是唯一的。您可以使用 BluetoothDevice 对象和 device.getAddress() 找到此地址,它将 return 一个 String 的形式:aa:bb:cc:00:11:22,其中每个段都是一个6 字节蓝牙 MAC 地址的字节十六进制组件。

可选 您还可以决定是否要将像 Eddystone-TLM 这样的框架与像 iBeacon 或 AltBeacon 这样的非 Eddystone 信标框架结合起来。如果您不想这样做,那么您还需要在组合它们之前确保框架具有 Eddystone 服务 UUID。

这是我使用开源 Android Beacon Library 组合 Eddystone 帧的技术。您可以在 ExtraBeaconDataTracker class 此处查看实现的源代码: https://github.com/AltBeacon/android-beacon-library/blob/master/src/main/java/org/altbeacon/beacon/service/ExtraDataBeaconTracker.java 此 class 还使用 matchBeaconsByServiceUUID 变量实现了上述可选部分。

使用 Android 信标库时,这一切都是自动的。您可以使用 beacon.getExtraDataFields() 从给定的信标简单地访问额外的帧(如 Eddystone-TLM)。这是一个如何工作的例子:

    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.");

     }

我知道你想自己动手,所以我提供上面的实现作为参考。以上均为开源,大家可以随意复制修改。