Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android 4.4.4 Nexus 4上写入多个BluetoothGatt对象_Android_Bluetooth Lowenergy_Android 4.4 Kitkat_Nexus 4 - Fatal编程技术网

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

在Android 4.4.4 Nexus 4上写入多个BluetoothGatt对象,android,bluetooth-lowenergy,android-4.4-kitkat,nexus-4,Android,Bluetooth Lowenergy,Android 4.4 Kitkat,Nexus 4,我知道这已经被详细讨论过了,但我还没有找到一个答案,似乎可以解决我在Android Bluetooth LE上面临的问题 我们设计的系统允许连接到多个设备。发现和连接到多个设备非常有效。每个BluetoothGatt对象实例都是基于设备的MAC地址保存的,并且每个实例都被分配了一个唯一的回调对象。这是基于北欧半导体公司网站上关于Android中多个设备连接的信息 当我试图将相同的数据写入多个设备时,就会出现这个问题。通常,每个单独的写入都是相同特征UUID上的相同数据,但在不同的Bluetoot

我知道这已经被详细讨论过了,但我还没有找到一个答案,似乎可以解决我在Android Bluetooth LE上面临的问题

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

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

我看到的行为是,其中一个设备,通常是我连接的第一个设备,总是接收数据。其他设备从不接收数据。但是,对于我发送的每一次写入,BT堆栈都会返回onCharacteristicWrite。因此,BT堆栈似乎认为它将数据写入了所有设备,但它似乎将数据排队。如果在一段未知时间后,我只向其中一个未接收数据的设备发送命令,BT堆栈似乎会将所有未发送的数据推送到该设备,然后我上次发送的任何命令都会像发送刷新命令一样。以下是该行为的日志:

11-18 01:58:55.571 E/testapp 1110:写入状态特征。值:[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:写入特性-uuid:9a143cb6-d775-4cfb-9eca-6e3a9b0f966b

11-18 01:58:55.571 D/BtGatt.gatt服务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_事件:事件1015

11-18 01:58:55.571 D/BtGatt.btif 1204:btif_gattc_上游_evt:事件4

11-18 01:58:55.571 D/BtGatt.gatt服务1204:onWriteCharacteristic-地址=CF:9E:D0:9A:98:90,状态=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:oncharacteristicwrite

11-18 01:58:55.571 E/testapp 1110:写入状态特征。值:[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值为-[-1,-102,-112]的写入特性

11-18 01:58:55.581 D/BluetoothGatt 1110:写入特征-uuid:9a143cb6-d775-4cfb-9eca-6e3a9b0f966b

11-18 01:58:55.581 D/BtGatt.gatt服务1204:writeCharacteristic-address=DB:7B:3E:47:AF:1A

11-18 01:58:55.581 D/BtGatt.btif 1204:btif\u gattc\u write\u char

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

11-18 01:58:55.581 D/BtGatt.btif 1204:btif_gattc_上游_evt:Event 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-Device=DB:7B:3E:47:AF:1A UUID=9a143cb6-d775-4cfb-9eca-6e3a9b0f966b状态=0

11-18 01:58:55.581 I/testapp 1110:OnCharacteristicWrite

在上面的例子中,在两个不同的设备上有两个特征写入到相同的特征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;
}

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

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

因此,当前面写入的特征完成写入和读取时,应该在回调onCharacteristicRead内更改伪代码上的canWrite标志


希望这有帮助。

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

因此,当前面写入的特征完成写入和读取时,应该在回调onCharacteristicRead内更改伪代码上的canWrite标志


希望这能有所帮助。

对三星Galaxy S4的额外测试表明,我的代码在S4上几乎可以完美运行。数据不被发送的情况仍然很少,但总的来说,问题似乎消失了。所以,这可能是Nexus4的问题。当我试图从两台设备读取数据时,我也面临同样的问题。实际上,我订阅了这两种设备的特性。我只收到一个数据流。对三星Galaxy S4的额外测试表明,我的代码在S4上运行得几乎完美。数据不被发送的情况仍然很少,但总的来说,问题似乎消失了。所以,这可能是Nexus4的问题。当我试图从两台设备读取数据时,我也面临同样的问题。实际上,我订阅了这两种设备的特性。我只收到一个数据流。考虑到onCharacteristicWrite方法显示了特征的更新值,我不确定为什么需要在写入后执行读取。因此,无论如何,在这一点上,写本质上就是读。我会在Nexus 4上试试看是否有什么不同。写了之后再读似乎会使连接更加不稳定,这也是因为它都是基于回调交互的,这毫无意义。考虑到onCharacteristicWrite方法显示了特征的更新值,我不确定为什么有必要在写入后执行读取。因此,无论如何,在这一点上,写本质上就是读。我将在Nexus4上试用它,看看它是否有什么不同。写后阅读似乎会使连接更加不稳定,这同样是因为它都是基于回调交互的,没有任何意义。