2

我知道这已被详细讨论过,但我还没有找到一个似乎可以解决我在使用 Android 蓝牙 LE 时遇到的问题的答案。

我们设计的系统允许连接到多个设备。发现和连接到多个设备效果很好。每个 BluetoothGatt 对象实例都是根据设备的 MAC 地址保存的,并且每个实例都分配有一个唯一的回调对象(这是基于 Nordic Semiconductor 网站上关于 Android 中的多个设备连接的信息)。

当我尝试将相同的数据写入多个设备时,就会出现问题。通常,每个单独的写入都是在相同特征 UUID 上但在不同 BluetoothGatt 实例上的相同数据。所有写入都在应用程序中排队,以确保在给定时间只有一个写入请求在 Android 上的 BT 堆栈挂起。我很清楚不这样做的危险,因为关于它的信息过多。

我看到的行为是其中一个设备,通常是我连接的第一个设备,总是接收数据。其他设备从不接收数据。但是,BT 堆栈会为我发送的每次写入返回 onCharacteristicWrite。因此,BT 堆栈似乎认为它会将数据写入所有设备,但相反,它似乎将其排队。如果经过一段时间(未知时间)后,我仅向其中一个未接收数据的设备发送命令,则 BT 堆栈似乎将所有未发送的数据推送到设备,然后是我最后发送的任何命令如果它被发送了一个 flush() 命令。这是该行为的日志:

11-18 01:58:55.571 E/testapp(1110): writeDataToCharacteristic(characteristic.Value: [111, -1, 95])

11-18 01:58:55.571 D/testapp(1110):特征写入类型:1

11-18 01:58:55.571 I/testapp(1110): writeCharacteristic for CF:9E:D0:9A:98:90 with value - [-1, -102, -112]

11-18 01:58:55.571 D/BluetoothGatt(1110):writeCharacteristic()-uuid:9a143cb6-d775-4cfb-9eca-6e3a9b0f966b

11-18 01:58:55.571 D/BtGatt.GattService(1204):writeCharacteristic()-地址= CF:9E:D0:9A:98:90

11-18 01:58:55.571 D/BtGatt.btif(1204):btif_gattc_write_char

11-18 01:58:55.571 D/BtGatt.btif(1204):btgattc_handle_event:事件 1015

11-18 01:58:55.571 D/BtGatt.btif(1204):btif_gattc_upstreams_evt:事件 4

11-18 01:58:55.571 D/BtGatt.GattService(1204):onWriteCharacteristic()-地址= CF:9E:D0:9A:98:90,状态=0

11-18 01:58:55.571 D/BluetoothGatt(1110):onCharacteristicWrite()-设备= CF:9E:D0:9A:98:90 UUID=9a143cb6-d775-4cfb-9eca-6e3a9b0f966b状态=0

11-18 01:58:55.571 I/testapp(1110): onCharacterisiticWrite

11-18 01:58:55.571 E/testapp(1110): writeDataToCharacteristic(characteristic.Value: [111, -1, 95])

11-18 01:58:55.581 D/testapp(1110):特征写入类型:1

11-18 01:58:55.581 I/testapp(1110):DB:7B:3E:47:AF:1A的 writeCharacteristic 值 - [-1, -102, -112]

11-18 01:58:55.581 D/BluetoothGatt(1110):writeCharacteristic()-uuid:9a143cb6-d775-4cfb-9eca-6e3a9b0f966b

11-18 01:58:55.581 D/BtGatt.GattService(1204):writeCharacteristic()-地址= DB:7B:3E:47:AF:1A

11-18 01:58:55.581 D/BtGatt.btif(1204):btif_gattc_write_char

11-18 01:58:55.581 D/BtGatt.btif(1204):btgattc_handle_event:事件 1015

11-18 01:58:55.581 D/BtGatt.btif(1204):btif_gattc_upstreams_evt:事件 4

11-18 01:58:55.581 D/BtGatt.GattService(1204): onWriteCharacteristic() - address= DB:7B:3E:47:AF:1A , status=0堆栈声称写入成功,但从未收到数据设备和特征值保持不变

11-18 01:58:55.581 D/BluetoothGatt(1110):onCharacteristicWrite()-设备= DB:7B:3E:47:AF:1A UUID=9a143cb6-d775-4cfb-9eca-6e3a9b0f966b状态=0

11-18 01:58:55.581 I/testapp(1110):onCharacterisiticWrite

在上面,有两个特征写入两个不同设备上的相同特征 UUID。主要区别是设备地址,为了清楚起见,我用粗体表示。堆栈声称已经执行了两次写入,但实际上并没有。我还没有找到解决此问题的方法,因为堆栈似乎正在缓存对第二个设备的写入,但实际上并未将其写出。请注意,我在每组写入之间都有延迟,但每个单独的写入仅通过等待堆栈中的 onCharacteristicWrite 回调来延迟。

一些伪代码显示数据如何发送到所有连接的设备。如有必要,我将为此讨论添加更多内容:

if(canWrite) {
    for (BTDevice device : deviceList) {
        /* Each write is queued at a lower level. */
        device.sendData(data);
    }

    nextChangeAllowed = System.currentTimeMillis() + 100;
    canWrite = false;
}

if(nextChangeAllowed < System.currentTimeMillis()) {
    canWrite = true;
}

有没有其他人遇到这个问题并解决了它?

4

1 回答 1

-1

我遇到了和你类似的问题。我需要将相同的特征写入两个设备,我所做的是实现一个算法,将特征写入第二个设备,只有在第一个设备被写入和读取时(当 onCharacteristicRead 被调用时)。

因此,当先前写入的特征已完成写入和读取时,应在回调 onCharacteristicRead 内部更改canWrite标志(在您的伪代码上)。

希望这可以帮助。

于 2014-11-18T10:57:50.613 回答