我正在使用一种特性通过BLE发送和接收数据,从Android手机到北欧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
可能导致这种情况的原因,以及如何纠正?
答案 0 :(得分:0)
我找到问题的根源并成功解决了问题。
我使用一个单一的特性进行双向通信。但是,由于我试图实现的速度,序列setValue()
&gt; writeCharacteristic
不再被视为原子序列。发生的事情是Android手机在setValue
和writeCharacteristic
之间收到通知,更改了手机本身写入特征的值。
使用两个独立的特征来解决问题,每个特征对应一个。