Android BLE setValue 写入错误值

Android BLE setValue writing wrong value

我正在使用特性通过 BLE 从 Android phone 到 Nordic nRF51 设备发送和接收数据。

BLE 实现了 CRC 码并使用数据包重传,因此数据传输可以被认为是可靠的。

然而,Android有时无法写入特征,即使我检查写入操作是否成功。

Android代码:

byte value[] = new byte[3 + transaction.data.length];
value[PKT_ID] = transaction.id; //Event ID
value[PKT_TWI_WRITE_DEVADD] = transaction.deviceAddress; //Address

for (int i = 0; i < transaction.data.length; i++)
    value[i + PKT_TWI_WRITE_DATA] = transaction.data[i];

while(!charac.setValue(value) || (value[PKT_ID]&0xFF) != ((charac.getValue())[PKT_ID]&0xFF));

charac.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);

boolean status = false;
while(!(status = gattInstance.writeCharacteristic(charac)));

System.out.println("Sent id " + (value[PKT_ID]&0xFF) + " char val:" + ((charac.getValue())[PKT_ID]&0xFF) );

示例输出:

I/System.out: Sent id 2 char val:2
I/System.out: Sent id 3 char val:169
I/System.out: Sent id 4 char val:4
I/System.out: Sent id 5 char val:5

可能是什么原因造成的,如何纠正?

找到问题的根源并成功解决

我正在使用一个单一的特性来进行双向通信。然而,由于我试图达到的速度,序列 setValue()>writeCharacteristic 不能再被认为是原子的。发生的事情是 android phone 在 setValuewriteCharacteristic 之间收到通知,更改 phone 本身写入特征的值。

使用两个独立的特性解决了问题,一个用于每个通信方向。