Catch如何分开Eddystone框架

时间:2018-01-06 17:23:38

标签: android ibeacon eddystone android-ibeacon

我正在开发一个Eddystone Library Parser。 我不明白的节点是:

我使用此回调来获取信标中的数据:

    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信标的行为。对于信标发送的每一帧,他们是否每次都调用LeScan回调,或者他们只用扫描记录中的所有帧调用回调一次?如果多次调用onLeScan,我怎样才能产生差异并将同一个信标发送的帧与同一场中其他信标的帧分开?

1 个答案:

答案 0 :(得分:0)

每个Eddystone帧都将在其自己的扫描记录中,并将自己回调到onLeScan。对于多帧的情况(例如,将Eddystone-TLM与Eddystone-UID相结合),您需要一些方法来了解这两个来自同一个物理信标。

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

可选您还可以决定是否要将Eddystone-TLM等帧与非Eddystone信标帧(如iBeacon或AltBeacon)结合使用。如果您不希望这样做,那么在组合之前您还要确保框架具有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 Library时,这都是自动的。您只需使用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.");

     }

我意识到你正在努力推动自己,所以我提供上述实现作为参考。以上都是开源的,因此您可以随意复制和修改它。