在Android 4.4.4 Nexus 4上写入多个BluetoothGatt对象

时间:2014-11-17 18:22:26

标签: android bluetooth-lowenergy android-4.4-kitkat nexus-4

我知道这已经详细讨论了,但我还没有找到答案似乎解决了我在Android蓝牙LE面临的问题。

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

当我尝试将相同数据写入多个设备时会出现问题。通常,每个单独的写入是相同特征UUID上的相同数据,但是在不同的BluetoothGatt实例上。所有写入都在应用程序中排队,以确保在Android上的BT堆栈的给定时间内只有一个写入请求待处理。我很清楚其他方面的风险,因为有太多的信息。

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

  

11-18 01:58:55.571 E / testapp(1110):writeDataToCharacteristic(特征。值:[111,-1,95])

     

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

     

11-18 01:58:55.571 I / testapp(1110): CF:9E:D0:9A:98:90 的writeCharacteristic值 - [-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() - address = 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:Event 1015

     

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

     

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

     

11-18 01:58:55.571 D / BluetoothGatt(1110):onCharacteristicWrite() - Device = 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(特征。值:[111,-1,95])

     

11-18 01:58:55.581 D / testapp(1110):特征WriteType: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() - address = 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:Event 1015

     

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

     

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

     

11-18 01:58:55.581 D / BluetoothGatt(1110):onCharacteristicWrite() - Device = 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;
}

还有其他人遇到过这个问题并解决了吗?

1 个答案:

答案 0 :(得分:-1)

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

当写入和读取上一个写入的特征时,应该在回调onCharacteristicRead中更改 canWrite 标志(在您的伪代码上)。

希望这有帮助。