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 在 setValue
和 writeCharacteristic
之间收到通知,更改 phone 本身写入特征的值。
使用两个独立的特性解决了问题,一个用于每个通信方向。
我正在使用特性通过 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 在 setValue
和 writeCharacteristic
之间收到通知,更改 phone 本身写入特征的值。
使用两个独立的特性解决了问题,一个用于每个通信方向。