diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ebike/PortStatusEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ebike/PortStatusEnum.java new file mode 100644 index 000000000..8ec21bbf2 --- /dev/null +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ebike/PortStatusEnum.java @@ -0,0 +1,49 @@ +package com.jsowell.common.enums.ebike; + +/** + * 电单车端口状态 + */ +public enum PortStatusEnum { + IDLE(0, "空闲"), + CHARGING(1, "充电中"), + CHARGER_CONNECTED_NOT_CHARGING_USER(2, "有充电器但未充电(用户未启动充电)"), + CHARGER_CONNECTED_NOT_CHARGING_FULL(3, "有充电器但未充电(已充满电)"), + UNMEASURABLE(4, "该路无法计量"), + FLOAT_CHARGE(5, "浮充"), + MEMORY_DAMAGE(6, "存储器损坏"), + SOCKET_SPRING_STUCK(7, "插座弹片卡住故障"), + CONTACT_BAD_OR_FUSE_BLOWN(8, "接触不良或保险丝烧断故障"), + RELAY_GLUE(9, "算法-继电器粘连"), + HALL_SWITCH_DAMAGE(10, "霍尔开关损坏(即插入检测传感器)"), + PRE_INSPECTION_RELAY_OR_FUSE_BAD(11, "预检-继电器坏或保险丝断"), + PRE_INSPECTION_LOAD_SHORT_CIRCUIT(13, "预检-负载短路"), + FILTERED_PRE_INSPECTION_RELAY_GLUE(14, "过滤性预检-继电器粘连"), + CARD_CHIP_DAMAGE(15, "刷卡芯片损坏故障"), + DETECTION_CIRCUIT_FAULT(16, "检测电路故障"); + + private final int value; + private final String description; + + PortStatusEnum(int value, String description) { + this.value = value; + this.description = description; + } + + public int getValue() { + return value; + } + + public String getDescription() { + return description; + } + + // 新增方法: 根据 value 获取描述 + public static String getDescriptionByValue(int value) { + for (PortStatusEnum status : values()) { + if (status.getValue() == value) { + return status.getDescription(); + } + } + return "未知状态"; + } +} \ No newline at end of file diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/domain/ebike/deviceupload/DeviceHeartbeat.java b/jsowell-netty/src/main/java/com/jsowell/netty/domain/ebike/deviceupload/DeviceHeartbeat.java new file mode 100644 index 000000000..a2e7209e7 --- /dev/null +++ b/jsowell-netty/src/main/java/com/jsowell/netty/domain/ebike/deviceupload/DeviceHeartbeat.java @@ -0,0 +1,64 @@ +package com.jsowell.netty.domain.ebike.deviceupload; + +import com.google.common.collect.Lists; +import com.jsowell.common.enums.ebike.PortStatusEnum; +import com.jsowell.common.util.BytesUtil; +import lombok.Getter; +import lombok.Setter; + +import java.util.Arrays; +import java.util.List; + +/** + * 此为心跳包,间隔时间默认为3分钟,方便服务器管理SocketIP + * 设备如2次收不到服务器应答,则进入离线状态 + */ +@Getter +@Setter +public class DeviceHeartbeat { + /** + * 电压:设备的当前电压(打包发送心跳包指令时的当前时间点的实时电压) + */ + private String voltage; + + /** + * 端口数量:表示设备总共有多少个端口,和后面的“端口状态”配套 + */ + private int portNumber; + + /** + * 注4、各端口状态:一个字节表示一个端口,和“端口数量”匹配, + * 如端口数量是16,则“各端口状态”为16字节; + * 每个字节表示的意思, + * 0=空闲,1=充电中,2=有充电器但未充电(用户未启动充电),3=有充电器但未充电(已充满电) 4=该路无法计量,5=浮充,6=存储器损坏, + * 7=插座弹片卡住故障,8=接触不良或保险丝烧断故障,9=(算法-继电器粘连),0x0A=霍尔开关损坏(即插入检测传感器)。 + * 0x0B=(预检-继电器坏或保险丝断),0x0D=(预检-负载短路)。0x0E=(过滤性预检-继电器粘连),0x0F=(刷卡芯片损坏故障),0x10=(检测电路故障) + */ + private List portStatus; + + /** + * 信号强度:指分机与主机之间的无线信号强度,如LORA信号。00则为有线组网或无信号强度功能 + */ + private String rssi; + + /** + * 当前环境温度:表示当前设备内的温度,可能和真正的当前环境温度有一定的误差,如00则表示无此功能 + */ + private String temperature; + + + public DeviceHeartbeat(byte[] dataBytes) { + this.voltage = BytesUtil.bytesToIntLittle(Arrays.copyOfRange(dataBytes, 0, 2)) + ""; + this.portNumber = BytesUtil.bytesToIntLittle(Arrays.copyOfRange(dataBytes, 2, 3)); + + byte[] statusBytes = Arrays.copyOfRange(dataBytes, 3, this.portNumber); + List statusList = Lists.newArrayList(); + for (byte statusByte : statusBytes) { + int status = BytesUtil.bytesToIntLittle(new byte[]{statusByte}); + statusList.add(PortStatusEnum.getDescriptionByValue(status)); + } + this.portStatus = statusList; + this.rssi = BytesUtil.bcd2StrLittle(Arrays.copyOfRange(dataBytes, dataBytes.length - 2, dataBytes.length - 1)); + this.temperature = BytesUtil.bcd2StrLittle(Arrays.copyOfRange(dataBytes, dataBytes.length - 1, dataBytes.length)); + } +} diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/domain/ebike/deviceupload/EBikeMessageCmd20.java b/jsowell-netty/src/main/java/com/jsowell/netty/domain/ebike/deviceupload/EBikeMessageCmd20.java index f7593f616..5e90fb1fe 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/domain/ebike/deviceupload/EBikeMessageCmd20.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/domain/ebike/deviceupload/EBikeMessageCmd20.java @@ -1,12 +1,10 @@ package com.jsowell.netty.domain.ebike.deviceupload; import com.jsowell.netty.domain.ebike.AbsEBikeMessage; -import lombok.Data; /** * 设备注册包(20指令) */ -@Data public class EBikeMessageCmd20 extends AbsEBikeMessage { private DeviceRegister deviceRegister; diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/domain/ebike/deviceupload/EBikeMessageCmd21.java b/jsowell-netty/src/main/java/com/jsowell/netty/domain/ebike/deviceupload/EBikeMessageCmd21.java new file mode 100644 index 000000000..35623a779 --- /dev/null +++ b/jsowell-netty/src/main/java/com/jsowell/netty/domain/ebike/deviceupload/EBikeMessageCmd21.java @@ -0,0 +1,26 @@ +package com.jsowell.netty.domain.ebike.deviceupload; + +import com.jsowell.netty.domain.ebike.AbsEBikeMessage; +import lombok.Getter; +import lombok.Setter; + +/** + * 设备注册包(20指令) + */ +@Getter +@Setter +public class EBikeMessageCmd21 extends AbsEBikeMessage { + + private DeviceHeartbeat deviceHeartbeat; + + public EBikeMessageCmd21(String header, int length, int physicalId, int messageId, String command, Object payload, int checksum, DeviceHeartbeat deviceHeartbeat) { + super(header, length, physicalId, messageId, command, payload, checksum); + this.deviceHeartbeat = deviceHeartbeat; + } + + @Override + public void parsePayload(byte[] dataBytes) { + this.deviceHeartbeat = new DeviceHeartbeat(dataBytes); + } + +} \ No newline at end of file