67 lines
2.1 KiB
Dart
67 lines
2.1 KiB
Dart
import 'dart:typed_data';
|
||
import 'dart:convert';
|
||
|
||
class RoutePlanSendEntity {
|
||
final int header1 = 0xAB;
|
||
final int header2 = 0xAA;
|
||
final int endFlag1 = 0xAA;
|
||
final int endFlag2 = 0xAB;
|
||
final int crc16 = 0;
|
||
|
||
final int commandType;
|
||
final int pointCounts;
|
||
final double targetLatitude;
|
||
final double targetLongitude;
|
||
final int speed;
|
||
|
||
RoutePlanSendEntity({
|
||
required this.commandType,
|
||
required this.pointCounts,
|
||
required this.targetLatitude,
|
||
required this.targetLongitude,
|
||
required this.speed,
|
||
});
|
||
|
||
/// 生成和Java二进制完全等效的字节数组(解决服务器识别问题)
|
||
Uint8List toBytes() {
|
||
final byteData = ByteData(27);
|
||
int offset = 0;
|
||
|
||
// 1. 严格按Java的byte类型写入(有符号单字节)
|
||
byteData.setInt8(offset++, header1); // 0xAB → 有符号-85
|
||
byteData.setInt8(offset++, header2); // 0xAA → 有符号-86
|
||
|
||
// 2. 命令类型(有符号byte)
|
||
byteData.setInt8(offset++, commandType);
|
||
|
||
// 3. pointCounts(Java short → 有符号16位,小端)
|
||
byteData.setInt16(offset, pointCounts, Endian.little);
|
||
offset += 2;
|
||
|
||
// 4. 纬度(Java double → 64位浮点,小端)
|
||
byteData.setFloat64(offset, targetLatitude, Endian.little);
|
||
offset += 8;
|
||
|
||
// 5. 经度(Java double → 64位浮点,小端)
|
||
byteData.setFloat64(offset, targetLongitude, Endian.little);
|
||
offset += 8;
|
||
|
||
// 6. speed(Java short → 有符号16位,小端)
|
||
byteData.setInt16(offset, speed, Endian.little);
|
||
offset += 2;
|
||
|
||
// 7. CRC16(Java short → 有符号16位,小端)
|
||
byteData.setInt16(offset, crc16, Endian.little);
|
||
offset += 2;
|
||
|
||
// 8. 包尾(有符号byte)
|
||
byteData.setInt8(offset++, endFlag1); // 0xAA → -86
|
||
byteData.setInt8(offset++, endFlag2); // 0xAB → -85
|
||
var uint8list = byteData.buffer.asUint8List();
|
||
// 关键:直接返回原始二进制字节(不做任何映射/转换)
|
||
// print("发送的指令字节数组,$uint8list");
|
||
return byteData.buffer.asUint8List();
|
||
}
|
||
|
||
/// 发送给服务器的核心方法(模拟Java的OutputStream传输)
|
||
} |