【问题标题】:How Catch separate Eddystone Frames如何捕捉分离的 Eddystone 框架
【发布时间】:2018-01-06 17:23:37
【问题描述】:

我正在开发一个 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[] scanRecords 来自信标的字节。我不明白 Eddystone 信标的行为方式。他们是每次都为信标传输的每一帧调用 onLeScan 回调,还是只在扫描记录中的所有帧调用一次回调?如果 onLeScan 被多次调用,我如何才能有所作为,并将同一信标发送的帧与同一字段中其他信标的帧分开?

【问题讨论】:

    标签: android ibeacon eddystone android-ibeacon


    【解决方案1】:

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

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

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

    这是我使用开源 Android Beacon Library 组合 Eddystone 框架的技术。您可以在此处查看ExtraBeaconDataTracker 类中的实现源代码: https://github.com/AltBeacon/android-beacon-library/blob/master/src/main/java/org/altbeacon/beacon/service/ExtraDataBeaconTracker.java 这个类还使用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.");
    
         }
    

    我知道您正在尝试自行开发,因此我提供上述实现作为参考。以上都是开源的,大家可以随意复制修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多