mirror of
https://gitee.com/san-bing/JChargePointProtocol
synced 2026-05-04 18:09:54 +08:00
!33 新增云快充启动充电的逻辑卡号和物理卡号,和双枪并充序号以及双枪并充的测试接口
* 新增云快充启动充电的逻辑卡号和物理卡号,和双枪并充序号以及双枪并充的测试接口 * CMD路由优化 * Merge remote-tracking branch 'gitee/master' into Feat_Lvneng_module_optimize * cmd路由优化 * cmd路由优化 * 绿能模块优化 * 新增云快充1.7 0x3D * 添加停止充电的TestController
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
// 工具类,禁止实例化
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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 "绿能协议";
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user