update 电单车

This commit is contained in:
Guoqs
2024-09-14 17:19:05 +08:00
parent e85e630282
commit 86dd583ad6
6 changed files with 167 additions and 12 deletions

View File

@@ -0,0 +1,72 @@
package com.jsowell.pile.domain.ebike;
import com.jsowell.common.YouDianUtils;
import com.jsowell.common.util.BytesUtil;
import lombok.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AbsEBikeMessage2 {
protected String header; // 包头 (3字节)
protected int msgLength; // 长度 (2字节)
protected int physicalId; // 物理ID (4字节)
protected int messageId; // 消息ID (2字节)
protected String command; // 命令 (1字节)
protected Object payload; // 数据 (n字节)
protected int checksum; // 校验 (2字节)
protected void parseMessage(byte[] messageBytes) {
if (messageBytes == null || messageBytes.length < 14 || messageBytes.length > 256) {
throw new IllegalArgumentException("Invalid message bytes");
}
// 读取包头
int startIndex = 0;
int length = 3;
byte[] headerBytes = BytesUtil.copyBytes(messageBytes, startIndex, length);
this.header = new String(headerBytes, StandardCharsets.UTF_8);
// 读取长度
startIndex += length;
length = 2;
byte[] lengthBytes = BytesUtil.copyBytes(messageBytes, startIndex, length);
this.msgLength = BytesUtil.bytesToIntLittle(lengthBytes);
// 验证长度
if (msgLength != (messageBytes.length - 5)) {
throw new IllegalArgumentException("Invalid message length");
}
// 读取物理ID
startIndex += length;
length = 4;
byte[] physicalIdBytes = BytesUtil.copyBytes(messageBytes, startIndex, length);
this.physicalId = YouDianUtils.convertToPhysicalId(physicalIdBytes);
// 读取消息ID
startIndex += length;
length = 2;
byte[] messageIdBytes = BytesUtil.copyBytes(messageBytes, startIndex, length);
this.messageId = BytesUtil.bytesToIntLittle(messageIdBytes);
// 读取命令
startIndex += length;
length = 1;
byte[] commandBytes = BytesUtil.copyBytes(messageBytes, startIndex, length);
this.command = BytesUtil.bcd2StrLittle(commandBytes);
// 读取数据
// byte[] dataBytes = BytesUtil.copyBytes(messageBytes, startIndex, length);
// 读取校验
byte[] checksumBytes = Arrays.copyOfRange(messageBytes, messageBytes.length - 2, messageBytes.length);
this.checksum = BytesUtil.bytesToIntLittle(checksumBytes);
}
}

View File

@@ -0,0 +1,75 @@
package com.jsowell.pile.domain.ebike.deviceupload;
import com.alibaba.fastjson2.JSON;
import com.jsowell.common.YouDianUtils;
import com.jsowell.common.util.BytesUtil;
import com.jsowell.pile.domain.ebike.AbsEBikeMessage2;
import lombok.Data;
/**
* 启动充电回复
*/
@Data
public class ChargingOperationResponse extends AbsEBikeMessage2 {
/**
* 应答:执行开始充电命令,=0执行成功启动或停止充电
* =1端口未插充电器不执行
* =2端口状态和充电命令相同不执行
* =3端口故障执行
* =4无此端口号不执行
* =5有多个待充端口响应FF充电命令不执行只针对双路双路设备的二维码只有一个且端口号为FF当2个口都插了充电器
* 服务器下发充电端口为FF时设备检测到有2个口待充电不知道充哪个就会返回此应答
* =6多路设备功率超标不执行
*/
private int result;
/**
* 交易流水号
*/
private String transactionCode;
/**
* 充电端口
*/
private String portNumber;
/**
* 待充端口:当应答=5的时候此数据才是有效的。按照bit定义各待充端口状态0=非待充1=待充
*/
private String waitPortNumber;
public ChargingOperationResponse(byte[] dataBytes) {
int startIndex = 0;
int length = 1;
this.result = BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(dataBytes, startIndex, length));
startIndex += length;
length = 16;
this.transactionCode = BytesUtil.bcd2Str(BytesUtil.copyBytes(dataBytes, startIndex, length));
startIndex += length;
length = 1;
this.portNumber = YouDianUtils.convertPortNumberToString(BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(dataBytes, startIndex, length)));
// startIndex += length;
// length = 2;
// this.waitPortNumber = YouDianUtils.convertPortNumberToString(BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(dataBytes, startIndex, length)));
}
@Override
protected void parseMessage(byte[] messageBytes) {
super.parseMessage(messageBytes);
// 截取数据
byte[] bytes = BytesUtil.copyBytes(messageBytes, 11, this.msgLength);
ChargingOperationResponse response = new ChargingOperationResponse(bytes);
System.out.println(JSON.toJSONString(response));
}
public static void main(String[] args) {
String s = "444e591d00198bca07da0c8200132738810124091416463569289954500000007907";
byte[] messageBytes = BytesUtil.hexStringToByteArray(s);
ChargingOperationResponse response = new ChargingOperationResponse(messageBytes);
response.parseMessage(messageBytes);
System.out.println(response);
}
}