update 电单车协议

This commit is contained in:
Guoqs
2024-08-15 08:56:59 +08:00
parent 1929d62176
commit c6efbab693

View File

@@ -1,5 +1,6 @@
package com.jsowell.netty.domain; package com.jsowell.netty.domain;
import com.jsowell.common.YouDianUtils;
import com.jsowell.common.util.BytesUtil; import com.jsowell.common.util.BytesUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
@@ -39,51 +40,65 @@ public class ChargingPileMessage {
.toString(); .toString();
} }
// 从字节数组解析消息
public static ChargingPileMessage parseMessage(byte[] messageBytes) { public static ChargingPileMessage parseMessage(byte[] messageBytes) {
if (messageBytes == null || messageBytes.length < 14 || messageBytes.length > 256) {
throw new IllegalArgumentException("Invalid message bytes");
}
ChargingPileMessage message = new ChargingPileMessage(); ChargingPileMessage message = new ChargingPileMessage();
// log.info("parseMessage:{}", BytesUtil.binary(messageBytes, 16));
// 读取包头
byte[] headerBytes = Arrays.copyOfRange(messageBytes, 0, 3);
String header = new String(headerBytes, StandardCharsets.UTF_8);
message.setHeader(header);
// System.out.println("包头:" + header);
// 读取长度 try {
byte[] lengthBytes = {messageBytes[3], messageBytes[4]}; // 读取包头
int length = BytesUtil.bytesToIntLittle(lengthBytes); byte[] headerBytes = Arrays.copyOfRange(messageBytes, 0, 3);
message.setLength(length); String header = new String(headerBytes, StandardCharsets.UTF_8);
// System.out.println("长度:" + length); message.setHeader(header);
// 读取物理ID // 读取长度
byte[] physicalIdBytes = Arrays.copyOfRange(messageBytes, 5, 9); byte[] lengthBytes = Arrays.copyOfRange(messageBytes, 3, 5);
int physicalId = BytesUtil.bytesToIntLittle(physicalIdBytes); int length = BytesUtil.bytesToIntLittle(lengthBytes);
message.setPhysicalId(physicalId); message.setLength(length);
// System.out.println("物理ID:" + physicalId);
// 读取消息ID // 验证长度
byte[] messageIdBytes = {messageBytes[9], messageBytes[10]}; if (length != (messageBytes.length - 5)) {
int messageId = BytesUtil.bytesToIntLittle(messageIdBytes); throw new IllegalArgumentException("Invalid message length");
message.setMessageId(messageId); }
// System.out.println("消息ID:" + messageId);
// 读取命令 // 读取物理ID
byte command = messageBytes[11]; byte[] physicalIdBytes = Arrays.copyOfRange(messageBytes, 5, 9);
message.setCommand(BytesUtil.bcd2StrLittle(new byte[] {command})); int physicalId = BytesUtil.bytesToIntLittle(physicalIdBytes);
// System.out.println("命令:" + BytesUtil.bcd2StrLittle(new byte[] {command})); message.setPhysicalId(physicalId);
// 读取数据 // 读取消息ID
byte[] dataBytes = Arrays.copyOfRange(messageBytes, 12, messageBytes.length - 2); byte[] messageIdBytes = Arrays.copyOfRange(messageBytes, 9, 11);
message.setData(dataBytes); int messageId = BytesUtil.bytesToIntLittle(messageIdBytes);
String data = BytesUtil.bcd2StrLittle(dataBytes); message.setMessageId(messageId);
// System.out.println("数据:" + data);
// 读取校验 // 读取命令
byte[] checksumBytes = {messageBytes[messageBytes.length - 2], messageBytes[messageBytes.length - 1]}; byte commandByte = messageBytes[11];
int checksum = BytesUtil.bytesToIntLittle(checksumBytes); String command = BytesUtil.bcd2StrLittle(new byte[]{commandByte});
message.setChecksum(checksum); message.setCommand(command);
// System.out.println("校验:" + checksum);
log.info("报文:{}, parseMessage:{}", BytesUtil.binary(messageBytes, 16), message.toString()); // 读取数据
return message; byte[] dataBytes = Arrays.copyOfRange(messageBytes, 12, messageBytes.length - 2);
message.setData(dataBytes);
String data = BytesUtil.bcd2StrLittle(dataBytes);
// 读取校验
byte[] checksumBytes = Arrays.copyOfRange(messageBytes, messageBytes.length - 2, messageBytes.length);
int checksum = BytesUtil.bytesToIntLittle(checksumBytes);
message.setChecksum(checksum);
// 校验码验证
if (!YouDianUtils.validateChecksum(messageBytes)) {
throw new IllegalArgumentException("Checksum validation failed");
}
log.info("报文:{}, parseMessage:{}", BytesUtil.binary(messageBytes, 16), message.toString());
return message;
} catch (Exception e) {
log.error("Error parsing message", e);
throw e;
}
} }
} }