我知道这已被详细讨论过,但我还没有找到一个似乎可以解决我在使用 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;
}
有没有其他人遇到这个问题并解决了它?