!33 新增云快充启动充电的逻辑卡号和物理卡号,和双枪并充序号以及双枪并充的测试接口

* 新增云快充启动充电的逻辑卡号和物理卡号,和双枪并充序号以及双枪并充的测试接口
* CMD路由优化
* Merge remote-tracking branch 'gitee/master' into Feat_Lvneng_module_optimize
* cmd路由优化
* cmd路由优化
* 绿能模块优化
* 新增云快充1.7 0x3D
* 添加停止充电的TestController
This commit is contained in:
三丙
2025-08-25 14:04:25 +00:00
parent 7c26534dff
commit 921045af8f
63 changed files with 795 additions and 380 deletions

View File

@@ -9,9 +9,11 @@ package sanbing.jcpp.protocol.lvneng;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import sanbing.jcpp.infrastructure.util.codec.ByteUtil;
import sanbing.jcpp.protocol.domain.DownlinkCmdEnum;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.listener.tcp.enums.SequenceNumberLength;
import sanbing.jcpp.protocol.lvneng.enums.LvnengDownlinkCmdEnum;
import sanbing.jcpp.protocol.lvneng.mapping.LvnengDownlinkCmdConverter;
import sanbing.jcpp.protocol.mapping.DownlinkCmdConverter;
/**
* 绿能协议基础类
@@ -20,12 +22,17 @@ public class AbstractLvnengCmdExe {
protected static final int LVNENG_HEAD = 0xAAF5;
protected static final int LVNENG_ENCRYPTION_FLAG = 0x10;
/**
* 下行命令转换器单例,用于将通用命令转换为协议特定命令值
*/
private static final DownlinkCmdConverter DOWNLINK_CMD_CONVERTER = LvnengDownlinkCmdConverter.getInstance();
/**
* 编码下行消息
* 格式:帧头(2) + 长度(2) + 加密标识(1) + 序号(1) + 命令字(2) + 数据域(n) + 校验和(1)
*/
protected byte[] encode(LvnengDownlinkCmdEnum downlinkCmd,
protected byte[] encode(int downlinkCmd,
int seqNo,
int encryptionFlag,
ByteBuf msgBody) {
@@ -39,13 +46,13 @@ public class AbstractLvnengCmdExe {
response.writeShortLE(totalLength); // 长度
response.writeByte(encryptionFlag); // 加密标识
response.writeByte(seqNo); // 序号
response.writeShortLE(downlinkCmd.getCmd()); // 命令字
response.writeShortLE(downlinkCmd); // 命令字
response.writeBytes(msgBody); // 数据域
// 3. 准备校验和计算的数据(命令字 + 数据域)
byte[] sumData = new byte[2 + msgBodyLength]; // 2字节命令字 + 数据域
sumData[0] = (byte) (downlinkCmd.getCmd() & 0xFF);
sumData[1] = (byte) ((downlinkCmd.getCmd() >> 8) & 0xFF);
sumData[0] = (byte) (downlinkCmd & 0xFF);
sumData[1] = (byte) ((downlinkCmd >> 8) & 0xFF);
if (msgBodyLength > 0) {
System.arraycopy(response.array(), 8, sumData, 2, msgBodyLength);
}
@@ -60,7 +67,7 @@ public class AbstractLvnengCmdExe {
/**
* 编码并发送消息(完整参数版本)
*/
protected void encodeAndWriteFlush(LvnengDownlinkCmdEnum downlinkCmd,
protected void encodeAndWriteFlush(int downlinkCmd,
int seqNo,
int encryptionFlag,
ByteBuf msgBody,
@@ -73,7 +80,7 @@ public class AbstractLvnengCmdExe {
* 编码并发送消息(简化参数版本)
* 使用默认的加密标识和自增序号
*/
protected void encodeAndWriteFlush(LvnengDownlinkCmdEnum downlinkCmd,
protected void encodeAndWriteFlush(int downlinkCmd,
ByteBuf msgBody,
TcpSession tcpSession) {
byte[] encode = encode(downlinkCmd,
@@ -82,4 +89,32 @@ public class AbstractLvnengCmdExe {
msgBody);
tcpSession.writeAndFlush(Unpooled.copiedBuffer(encode));
}
/**
* 便捷方法:直接使用 DownlinkCmdEnum 发送命令
*/
protected void encodeAndWriteFlush(DownlinkCmdEnum downlinkCmdEnum,
int seqNo,
int encryptionFlag,
ByteBuf msgBody,
TcpSession tcpSession) {
if (!DOWNLINK_CMD_CONVERTER.supports(downlinkCmdEnum)) {
throw new IllegalArgumentException("绿能协议不支持下行命令: " + downlinkCmdEnum);
}
Integer cmd = DOWNLINK_CMD_CONVERTER.convertToCmd(downlinkCmdEnum);
encodeAndWriteFlush(cmd, seqNo, encryptionFlag, msgBody, tcpSession);
}
/**
* 便捷方法:直接使用 DownlinkCmdEnum 发送命令(自动生成序列号)
*/
protected void encodeAndWriteFlush(DownlinkCmdEnum downlinkCmdEnum,
ByteBuf msgBody,
TcpSession tcpSession) {
if (!DOWNLINK_CMD_CONVERTER.supports(downlinkCmdEnum)) {
throw new IllegalArgumentException("绿能协议不支持下行命令: " + downlinkCmdEnum);
}
Integer cmd = DOWNLINK_CMD_CONVERTER.convertToCmd(downlinkCmdEnum);
encodeAndWriteFlush(cmd, msgBody, tcpSession);
}
}

View File

@@ -0,0 +1,35 @@
/**
* 开源代码,仅供学习和交流研究使用,商用请联系三丙
* 微信mohan_88888
* 抖音:程序员三丙
* 付费课程知识星球https://t.zsxq.com/aKtXo
*/
package sanbing.jcpp.protocol.lvneng;
/**
* 绿能协议常量定义
*
* @author sanbing
* @since 2024-12-16
*/
public final class LvnengProtocolConstants {
private LvnengProtocolConstants() {
// 工具类,禁止实例化
}
/**
* 协议名称常量
*/
public static final class ProtocolNames {
/** 绿能协议 v3.4.0 */
public static final String LVNENG_V340 = "lvnengV340";
// 注解专用简短别名
public static final String V340 = LVNENG_V340;
private ProtocolNames() {
// 工具类,禁止实例化
}
}
}

View File

@@ -6,7 +6,7 @@
*/
package sanbing.jcpp.protocol.lvneng;
import cn.hutool.core.util.ClassUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.extern.slf4j.Slf4j;
@@ -16,18 +16,16 @@ import sanbing.jcpp.infrastructure.util.jackson.JacksonUtil;
import sanbing.jcpp.proto.gen.ProtocolProto;
import sanbing.jcpp.protocol.ProtocolContext;
import sanbing.jcpp.protocol.ProtocolMessageProcessor;
import sanbing.jcpp.protocol.domain.DownlinkCmdEnum;
import sanbing.jcpp.protocol.domain.ListenerToHandlerMsg;
import sanbing.jcpp.protocol.domain.SessionToHandlerMsg;
import sanbing.jcpp.protocol.forwarder.Forwarder;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.lvneng.annotation.LvnengCmd;
import sanbing.jcpp.protocol.lvneng.enums.LvnengDownlinkCmdEnum;
import sanbing.jcpp.protocol.lvneng.mapping.LvnengDownlinkCmdConverter;
import sanbing.jcpp.protocol.mapping.DownlinkCmdConverter;
import sanbing.jcpp.protocol.routing.ProtocolCommandRouter;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class LvnengProtocolMessageProcessor extends ProtocolMessageProcessor {
@@ -35,40 +33,26 @@ public class LvnengProtocolMessageProcessor extends ProtocolMessageProcessor {
private static final int HEADER_SIZE = 9; // 帧头(2) + 长度(2) + 加密标识(1) + 序号(1) + 命令字(2) + 校验和(1)
private static final int FRAME_MIN_LENGTH = 9; // 最小帧长度(无数据域的情况)
private final Map<Integer, LvnengUplinkCmdExe> uplinkCmdExeMap = new ConcurrentHashMap<>();
private final Map<Integer, LvnengDownlinkCmdExe> downlinkCmdExeMap = new ConcurrentHashMap<>();
private final ProtocolCommandRouter<LvnengUplinkCmdExe> uplinkRouter;
private final ProtocolCommandRouter<LvnengDownlinkCmdExe> downlinkRouter;
private final DownlinkCmdConverter downlinkCmdConverter;
public LvnengProtocolMessageProcessor(Forwarder forwarder, ProtocolContext protocolContext) {
super(forwarder, protocolContext);
Set<Class<?>> cmdClasses = ClassUtil.scanPackageByAnnotation(ClassUtil.getPackage(this.getClass()), LvnengCmd.class);
cmdClasses.stream().filter(LvnengUplinkCmdExe.class::isAssignableFrom)
.forEach(clazz -> {
int cmd = clazz.getAnnotation(LvnengCmd.class).value();
try {
LvnengUplinkCmdExe lvnengUplinkCmdExe = (LvnengUplinkCmdExe) clazz.getDeclaredConstructor().newInstance();
uplinkCmdExeMap.put(cmd, lvnengUplinkCmdExe);
} catch (InstantiationException |
IllegalAccessException |
InvocationTargetException |
NoSuchMethodException e) {
throw new RuntimeException(e);
}
});
// 使用 CommandRouter 替代手动注册逻辑
this.uplinkRouter = new ProtocolCommandRouter<>(
this.getClass(),
LvnengUplinkCmdExe.class::isAssignableFrom
);
cmdClasses.stream().filter(LvnengDownlinkCmdExe.class::isAssignableFrom)
.forEach(clazz -> {
int cmd = clazz.getAnnotation(LvnengCmd.class).value();
try {
LvnengDownlinkCmdExe lvnengDownlinkCmdExe = (LvnengDownlinkCmdExe) clazz.getDeclaredConstructor().newInstance();
downlinkCmdExeMap.put(cmd, lvnengDownlinkCmdExe);
} catch (InstantiationException |
IllegalAccessException |
InvocationTargetException |
NoSuchMethodException e) {
throw new RuntimeException(e);
}
});
this.downlinkRouter = new ProtocolCommandRouter<>(
this.getClass(),
LvnengDownlinkCmdExe.class::isAssignableFrom
);
// 获取下行命令转换器单例
this.downlinkCmdConverter = LvnengDownlinkCmdConverter.getInstance();
}
@Override
@@ -143,7 +127,16 @@ public class LvnengProtocolMessageProcessor extends ProtocolMessageProcessor {
ProtocolProto.DownlinkRequestMessage protocolDownlinkMsg = sessionToHandlerMsg.downlinkMsg();
int cmd = LvnengDownlinkCmdEnum.valueOf(protocolDownlinkMsg.getDownlinkCmd()).getCmd();
DownlinkCmdEnum downlinkCmd = DownlinkCmdEnum.valueOf(protocolDownlinkMsg.getDownlinkCmd());
// 首先检查是否支持该命令
if (!downlinkCmdConverter.supports(downlinkCmd)) {
log.warn("绿能协议不支持下行命令: {}", downlinkCmd);
return;
}
// 支持的命令直接转换这里不会返回null
Integer cmd = downlinkCmdConverter.convertToCmd(downlinkCmd);
LvnengDwonlinkMessage message = new LvnengDwonlinkMessage();
message.setId(new UUID(protocolDownlinkMsg.getMessageIdMSB(), protocolDownlinkMsg.getMessageIdLSB()));
@@ -163,12 +156,13 @@ public class LvnengProtocolMessageProcessor extends ProtocolMessageProcessor {
private void exeCmd(LvnengUplinkMessage message, TcpSession session) {
LvnengUplinkCmdExe uplinkCmdExe = uplinkCmdExeMap.get(message.getCmd());
String protocolName = session.getProtocolName();
int cmd = message.getCmd();
LvnengUplinkCmdExe uplinkCmdExe = uplinkRouter.getExecutor(protocolName, cmd);
if (uplinkCmdExe == null) {
log.info("{} 绿能协议接收到未知的上行指令 0x{}", session, Integer.toHexString(message.getCmd()));
log.info("{} 绿能协议[{}]接收到未知的上行指令 0x{}", session, protocolName, Integer.toHexString(cmd));
return;
}
@@ -176,12 +170,13 @@ public class LvnengProtocolMessageProcessor extends ProtocolMessageProcessor {
}
private void exeCmd(LvnengDwonlinkMessage message, TcpSession session) {
LvnengDownlinkCmdExe downlinkCmdExe = downlinkCmdExeMap.get(message.getCmd());
String protocolName = session.getProtocolName();
int cmd = message.getCmd();
LvnengDownlinkCmdExe downlinkCmdExe = downlinkRouter.getExecutor(protocolName, cmd);
if (downlinkCmdExe == null) {
log.info("{} 绿能协议接收到未知的下行指令 0x{}", session, Integer.toHexString(message.getCmd()));
log.info("{} 绿能协议[{}]接收到未知的下行指令 0x{}", session, protocolName, Integer.toHexString(cmd));
return;
}

View File

@@ -1,21 +0,0 @@
/**
* 开源代码,仅供学习和交流研究使用,商用请联系三丙
* 微信mohan_88888
* 抖音:程序员三丙
* 付费课程知识星球https://t.zsxq.com/aKtXo
*/
package sanbing.jcpp.protocol.lvneng.annotation;
import java.lang.annotation.*;
/**
* @author baigod
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LvnengCmd {
int value();
}

View File

@@ -1,31 +0,0 @@
/**
* 开源代码,仅供学习和交流研究使用,商用请联系三丙
* 微信mohan_88888
* 抖音:程序员三丙
* 付费课程知识星球https://t.zsxq.com/aKtXo
*/
package sanbing.jcpp.protocol.lvneng.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author baigod
*/
@AllArgsConstructor
@Getter
public enum LvnengDownlinkCmdEnum {
LOGIN_ACK((short) 105),
SYNC_TIME((short) 3),
HEARTBEAT_ACK((short) 101),
REAL_TIME_DATA_ACK((short) 103),
TRANSACTION_RECORD_ACK((short) 201);
private final short cmd;
}

View File

@@ -0,0 +1,72 @@
/**
* 开源代码,仅供学习和交流研究使用,商用请联系三丙
* 微信mohan_88888
* 抖音:程序员三丙
* 付费课程知识星球https://t.zsxq.com/aKtXo
*/
package sanbing.jcpp.protocol.lvneng.mapping;
import sanbing.jcpp.protocol.domain.DownlinkCmdEnum;
import sanbing.jcpp.protocol.mapping.DownlinkCmdConverter;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 绿能协议下行命令转换器(单例)
*
* 建立通用下行命令与绿能协议特定命令字的显式转换关系
* 使用Map存储转换关系提供O(1)性能
*
* 采用单例模式,避免重复实例化
*
* @author sanbing
* @since 2024-12-16
*/
public class LvnengDownlinkCmdConverter implements DownlinkCmdConverter {
/**
* 单例实例
*/
private static final LvnengDownlinkCmdConverter INSTANCE = new LvnengDownlinkCmdConverter();
/**
* 命令映射表使用Map提供O(1)查找性能
*/
private static final Map<DownlinkCmdEnum, Integer> COMMAND_MAP = new ConcurrentHashMap<>();
static {
// 初始化绿能协议的命令映射
COMMAND_MAP.put(DownlinkCmdEnum.LOGIN_ACK, 105);
COMMAND_MAP.put(DownlinkCmdEnum.SYNC_TIME_REQUEST, 3);
COMMAND_MAP.put(DownlinkCmdEnum.TRANSACTION_RECORD_ACK, 201);
COMMAND_MAP.put(DownlinkCmdEnum.HEARTBEAT_ACK, 101); // 心跳应答
COMMAND_MAP.put(DownlinkCmdEnum.REAL_TIME_DATA_ACK, 103); // 实时数据应答
// 绿能协议支持以上命令其他命令返回null
}
/**
* 私有构造函数,防止外部实例化
*/
private LvnengDownlinkCmdConverter() {
}
/**
* 获取单例实例
*
* @return 单例实例
*/
public static LvnengDownlinkCmdConverter getInstance() {
return INSTANCE;
}
@Override
public Integer convertToCmd(DownlinkCmdEnum downlinkCmd) {
return COMMAND_MAP.get(downlinkCmd);
}
@Override
public String getProtocolName() {
return "绿能协议";
}
}

View File

@@ -12,13 +12,13 @@ import sanbing.jcpp.protocol.ProtocolBootstrap;
import sanbing.jcpp.protocol.ProtocolMessageProcessor;
import sanbing.jcpp.protocol.lvneng.LvnengProtocolMessageProcessor;
import static sanbing.jcpp.protocol.lvneng.v340.LvnengV340ProtocolBootstrap.PROTOCOL_NAME;
import static sanbing.jcpp.protocol.lvneng.LvnengProtocolConstants.ProtocolNames.LVNENG_V340;
@ProtocolComponent(PROTOCOL_NAME)
@ProtocolComponent(LVNENG_V340)
@Slf4j
public class LvnengV340ProtocolBootstrap extends ProtocolBootstrap {
public static final String PROTOCOL_NAME = "lvnengV340";
public static final String PROTOCOL_NAME = LVNENG_V340;
@Override
protected String getProtocolName() {
return PROTOCOL_NAME;

View File

@@ -15,20 +15,21 @@ import sanbing.jcpp.infrastructure.util.jackson.JacksonUtil;
import sanbing.jcpp.proto.gen.ProtocolProto.HeartBeatRequest;
import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage;
import sanbing.jcpp.protocol.ProtocolContext;
import sanbing.jcpp.protocol.annotation.ProtocolCmd;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.lvneng.LvnengUplinkCmdExe;
import sanbing.jcpp.protocol.lvneng.LvnengUplinkMessage;
import sanbing.jcpp.protocol.lvneng.annotation.LvnengCmd;
import java.nio.charset.StandardCharsets;
import static sanbing.jcpp.protocol.lvneng.enums.LvnengDownlinkCmdEnum.HEARTBEAT_ACK;
import static sanbing.jcpp.protocol.domain.DownlinkCmdEnum.HEARTBEAT_ACK;
import static sanbing.jcpp.protocol.lvneng.LvnengProtocolConstants.ProtocolNames.V340;
/**
* 绿能3.4 充电桩上传心跳包
*/
@Slf4j
@LvnengCmd(102)
@ProtocolCmd(value = 102, protocolNames = {V340})
public class LvnengV340HeartbeatULCmd extends LvnengUplinkCmdExe {
@Override
public void execute(TcpSession tcpSession, LvnengUplinkMessage lvnengUplinkMessage, ProtocolContext ctx) {

View File

@@ -16,28 +16,29 @@ import sanbing.jcpp.infrastructure.util.mdc.MDCUtils;
import sanbing.jcpp.infrastructure.util.trace.TracerContextUtil;
import sanbing.jcpp.proto.gen.ProtocolProto.LoginResponse;
import sanbing.jcpp.protocol.ProtocolContext;
import sanbing.jcpp.protocol.annotation.ProtocolCmd;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.listener.tcp.enums.SequenceNumberLength;
import sanbing.jcpp.protocol.lvneng.LvnengDownlinkCmdExe;
import sanbing.jcpp.protocol.lvneng.LvnengDwonlinkMessage;
import sanbing.jcpp.protocol.lvneng.LvnengUplinkMessage;
import sanbing.jcpp.protocol.lvneng.annotation.LvnengCmd;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import static sanbing.jcpp.infrastructure.util.config.ThreadPoolConfiguration.PROTOCOL_SESSION_SCHEDULED;
import static sanbing.jcpp.protocol.domain.DownlinkCmdEnum.LOGIN_ACK;
import static sanbing.jcpp.protocol.domain.DownlinkCmdEnum.SYNC_TIME_REQUEST;
import static sanbing.jcpp.protocol.domain.SessionCloseReason.MANUALLY;
import static sanbing.jcpp.protocol.listener.tcp.TcpSession.SCHEDULE_KEY_AUTO_SYNC_TIME;
import static sanbing.jcpp.protocol.lvneng.enums.LvnengDownlinkCmdEnum.LOGIN_ACK;
import static sanbing.jcpp.protocol.lvneng.enums.LvnengDownlinkCmdEnum.SYNC_TIME;
import static sanbing.jcpp.protocol.lvneng.LvnengProtocolConstants.ProtocolNames.V340;
/**
* 绿能3.4 服务器应答充电桩签到命令
*/
@Slf4j
@LvnengCmd(105)
@ProtocolCmd(value = 105, protocolNames = {V340})
public class LvnengV340LoginAckDLCmd extends LvnengDownlinkCmdExe {
@Override
public void execute(TcpSession tcpSession, LvnengDwonlinkMessage lvnengDwonlinkMessage, ProtocolContext ctx) {
@@ -121,7 +122,7 @@ public class LvnengV340LoginAckDLCmd extends LvnengDownlinkCmdExe {
//7 命令参数数据
msgBodyBuf.writeBytes(BCDUtil.dateToBcd8(LocalDateTime.now()));
encodeAndWriteFlush(SYNC_TIME,
encodeAndWriteFlush(SYNC_TIME_REQUEST,
tcpSession.nextSeqNo(SequenceNumberLength.SHORT),
requestData.getEncryptionFlag(),
msgBodyBuf,

View File

@@ -16,20 +16,22 @@ import sanbing.jcpp.infrastructure.util.jackson.JacksonUtil;
import sanbing.jcpp.proto.gen.ProtocolProto.LoginRequest;
import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage;
import sanbing.jcpp.protocol.ProtocolContext;
import sanbing.jcpp.protocol.annotation.ProtocolCmd;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.lvneng.LvnengUplinkCmdExe;
import sanbing.jcpp.protocol.lvneng.LvnengUplinkMessage;
import sanbing.jcpp.protocol.lvneng.annotation.LvnengCmd;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.ZoneId;
import static sanbing.jcpp.protocol.lvneng.LvnengProtocolConstants.ProtocolNames.V340;
/**
* 绿能3.4 充电桩签到信息上报
*/
@Slf4j
@LvnengCmd(106)
@ProtocolCmd(value = 106, protocolNames = {V340})
public class LvnengV340LoginULCmd extends LvnengUplinkCmdExe {
@Override
public void execute(TcpSession tcpSession, LvnengUplinkMessage lvnengUplinkMessage, ProtocolContext ctx) {

View File

@@ -19,10 +19,10 @@ import sanbing.jcpp.proto.gen.ProtocolProto.GunRunStatus;
import sanbing.jcpp.proto.gen.ProtocolProto.GunRunStatusProto;
import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage;
import sanbing.jcpp.protocol.ProtocolContext;
import sanbing.jcpp.protocol.annotation.ProtocolCmd;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.lvneng.LvnengUplinkCmdExe;
import sanbing.jcpp.protocol.lvneng.LvnengUplinkMessage;
import sanbing.jcpp.protocol.lvneng.annotation.LvnengCmd;
import sanbing.jcpp.protocol.lvneng.enums.LvnengAlarmCodeEnum;
import sanbing.jcpp.protocol.lvneng.enums.LvnengPileStartTypeEnum;
import sanbing.jcpp.protocol.lvneng.enums.LvnengPileStatusEnum;
@@ -35,13 +35,14 @@ import java.time.ZoneId;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static sanbing.jcpp.protocol.lvneng.enums.LvnengDownlinkCmdEnum.REAL_TIME_DATA_ACK;
import static sanbing.jcpp.protocol.domain.DownlinkCmdEnum.REAL_TIME_DATA_ACK;
import static sanbing.jcpp.protocol.lvneng.LvnengProtocolConstants.ProtocolNames.V340;
/**
* 绿能3.4 充电桩状态信息包上报
*/
@Slf4j
@LvnengCmd(109)
@ProtocolCmd(value = 109, protocolNames = {V340})
public class LvnengV340RealTimeDataULCmd extends LvnengUplinkCmdExe {
@Override
public void execute(TcpSession tcpSession, LvnengUplinkMessage lvnengUplinkMessage, ProtocolContext ctx) {

View File

@@ -12,22 +12,23 @@ import lombok.extern.slf4j.Slf4j;
import sanbing.jcpp.infrastructure.util.jackson.JacksonUtil;
import sanbing.jcpp.proto.gen.ProtocolProto.TransactionRecordResponse;
import sanbing.jcpp.protocol.ProtocolContext;
import sanbing.jcpp.protocol.annotation.ProtocolCmd;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.lvneng.LvnengDownlinkCmdExe;
import sanbing.jcpp.protocol.lvneng.LvnengDwonlinkMessage;
import sanbing.jcpp.protocol.lvneng.LvnengUplinkMessage;
import sanbing.jcpp.protocol.lvneng.annotation.LvnengCmd;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import static sanbing.jcpp.protocol.lvneng.enums.LvnengDownlinkCmdEnum.TRANSACTION_RECORD_ACK;
import static sanbing.jcpp.protocol.domain.DownlinkCmdEnum.TRANSACTION_RECORD_ACK;
import static sanbing.jcpp.protocol.lvneng.LvnengProtocolConstants.ProtocolNames.V340;
/**
* 绿能3.4 服务器应答订单信息
*/
@Slf4j
@LvnengCmd(201)
@ProtocolCmd(value = 201, protocolNames = {V340})
public class LvnengV340TransactionRecordAckDLCmd extends LvnengDownlinkCmdExe {
@Override
public void execute(TcpSession tcpSession, LvnengDwonlinkMessage lvnengDwonlinkMessage, ProtocolContext ctx) {

View File

@@ -20,10 +20,10 @@ import sanbing.jcpp.proto.gen.ProtocolProto.TransactionDetail;
import sanbing.jcpp.proto.gen.ProtocolProto.TransactionRecordRequest;
import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage;
import sanbing.jcpp.protocol.ProtocolContext;
import sanbing.jcpp.protocol.annotation.ProtocolCmd;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.lvneng.LvnengUplinkCmdExe;
import sanbing.jcpp.protocol.lvneng.LvnengUplinkMessage;
import sanbing.jcpp.protocol.lvneng.annotation.LvnengCmd;
import sanbing.jcpp.protocol.lvneng.enums.LvnengPileFinishReasonEnum;
import sanbing.jcpp.protocol.lvneng.enums.LvnengPileStartTypeEnum;
@@ -37,11 +37,13 @@ import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import static sanbing.jcpp.protocol.lvneng.LvnengProtocolConstants.ProtocolNames.V340;
/**
* 绿能3.4 充电桩上报充电订单
*/
@Slf4j
@LvnengCmd(203)
@ProtocolCmd(value = 203, protocolNames = {V340})
public class LvnengV340TransactionRecordULCmd extends LvnengUplinkCmdExe {
@@ -213,7 +215,6 @@ public class LvnengV340TransactionRecordULCmd extends LvnengUplinkCmdExe {
.build();
tcpSession.getForwarder().sendMessage(uplinkQueueMessage);
}