我需要使用Android ble类发送以下结构,但是不幸的是Java不支持struct类型,我必须将structer转换为class。实际上,我可以创建类似结构的类,但是最大的问题是,java也不支持uint8和uint32类型。
我在BluethootGattChracteristic下找到了Format_UINT32和Format_UINT8方法,但是它无法正常工作。我总是使用以下代码将相同的数组发送到目标设备
我的标准C结构如下
struct test{
Time1 uint32;
Time2 uint32;
Time3 uint32;
Time4 uint32;
Time5 uint32;
Time6 uint32;
Speed uint8;
Speed2 uint8;
Speed3 uint8;
}
我在Java中创建相同的类型,如下所示
long Time1= 4000000000L;
long Time2= 1500L;
long Time3= 0L;
long Time4= 0L;
long Time5= 0L;
long Time6= 0L;
int speed = 01;
int speed2 = 02;
int speed3 = 04;
然后我尝试使用像这样的ble写入方法发送此数据;
Time1= BluetoothGattCharacteristic.FORMAT_UINT32;
Time2= BluetoothGattCharacteristic.FORMAT_UINT32;
Time3= BluetoothGattCharacteristic.FORMAT_UINT32;
Time4= BluetoothGattCharacteristic.FORMAT_UINT32;
Time5= BluetoothGattCharacteristic.FORMAT_UINT32;
Time6= BluetoothGattCharacteristic.FORMAT_UINT32;
speed= BluetoothGattCharacteristic.FORMAT_UINT8;
speed2= BluetoothGattCharacteristic.FORMAT_UINT8;
speed3= BluetoothGattCharacteristic.FORMAT_UINT8;
ByteBuffer buffer = ByteBuffer.allocate(27);
buffer.put((byte)Time1);
buffer.put((byte)Time2);
buffer.put((byte)Time3);
buffer.put((byte)Time4);
buffer.put((byte)Time5);
buffer.put((byte)Time6);
buffer.put((byte)speed);
buffer.put((byte)speed2);
buffer.put((byte)speed3);
buffer.order(ByteOrder.LITTLE_ENDIAN);
charac.setValue(buffer.array());
这段代码以某种方式发送数据数组,如0x1414141411111110000…,但这是完全错误的。
如何解决这个问题?或如何创建类似于上述结构的类?
谢谢
分析解答
您的代码具有一些不错的元素,但是您只发送了BluetoothGattCharacteristic.FORMAT_UINT32
的常量值,而没有实际数据。您不需要BluetoothGattCharacteristic.FORMAT_UINT32
。
因此,让我们看一个简单的类来保存数据:
class Payload {
int time1;
int time2;
int time3;
int time4;
int time5;
int time6;
byte speed1;
byte speed2;
byte speed3;
}
然后,使用ByteBuffer
从中创建一个字节数组:
byte[] createBytes(Payload payload) {
ByteByffer buffer = ByteBuffer.allocate(28).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(payload.time1);
buffer.putInt(payload.time2);
buffer.putInt(payload.time3);
buffer.putInt(payload.time4);
buffer.putInt(payload.time5);
buffer.putInt(payload.time6);
buffer.putByte(payload.speed1);
buffer.putByte(payload.speed2);
buffer.putByte(payload.speed3);
buffer.putByte(0);
return buffer.array();
}
额外的0是将数据长度填充为4的倍数,即28。最有可能的是,C结构的长度为28个字节。
最后,您传输数据:
byte[] data = createBytes(payload);
gattCharacteristic.setValue(data);
请注意,Java整数类型是带符号的(例如,字节为-128到127),而C类型是无符号的(例如,uint8_t是0到255)。这可能需要使用Java进行一些其他处理。