扩展云快充1.6

This commit is contained in:
三丙
2024-10-12 16:47:27 +08:00
parent 2cd7c9c573
commit c94110d02a
32 changed files with 373 additions and 66 deletions

View File

@@ -12,7 +12,7 @@ import sanbing.jcpp.infrastructure.util.codec.BCDUtil;
import sanbing.jcpp.proto.gen.ProtocolProto;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.listener.tcp.enums.SequenceNumberLength;
import sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum;
import sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -98,7 +98,7 @@ public class AbstractYunKuaiChongCmdExe {
}
protected byte[] encode(YunKuaiChongV150DownlinkCmdEnum downlinkCmd,
protected byte[] encode(YunKuaiChongDownlinkCmdEnum downlinkCmd,
int seqNo,
int encryptionFlag,
ByteBuf msgBody) {
@@ -120,7 +120,7 @@ public class AbstractYunKuaiChongCmdExe {
return toBytes(response);
}
protected void encodeAndWriteFlush(YunKuaiChongV150DownlinkCmdEnum downlinkCmd,
protected void encodeAndWriteFlush(YunKuaiChongDownlinkCmdEnum downlinkCmd,
int seqNo,
int encryptionFlag,
ByteBuf msgBody,
@@ -131,7 +131,7 @@ public class AbstractYunKuaiChongCmdExe {
tcpSession.writeAndFlush(Unpooled.copiedBuffer(encode));
}
protected void encodeAndWriteFlush(YunKuaiChongV150DownlinkCmdEnum downlinkCmd,
protected void encodeAndWriteFlush(YunKuaiChongDownlinkCmdEnum downlinkCmd,
ByteBuf msgBody,
TcpSession tcpSession) {

View File

@@ -10,7 +10,7 @@ import sanbing.jcpp.protocol.listener.tcp.TcpSession;
/**
* @author baigod
*/
public abstract class YunKuaiChongDownlinkCmdExe extends AbstractYunKuaiChongCmdExe{
public abstract class YunKuaiChongDownlinkCmdExe extends AbstractYunKuaiChongCmdExe {
public abstract void execute(TcpSession tcpSession, YunKuaiChongDwonlinkMessage yunKuaiChongDwonlinkMessage, ProtocolContext ctx);

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150;
package sanbing.jcpp.protocol.yunkuaichong;
import cn.hutool.core.util.ClassUtil;
import io.netty.buffer.ByteBuf;
@@ -17,12 +17,8 @@ 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.yunkuaichong.YunKuaiChongDownlinkCmdExe;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkCmdExe;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkMessage;
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
import sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum;
import sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@@ -33,17 +29,17 @@ import java.util.concurrent.ConcurrentHashMap;
import static sanbing.jcpp.infrastructure.util.codec.ByteUtil.checkCrcSum;
@Slf4j
public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProcessor {
private final Map<Byte, YunKuaiChongUplinkCmdExe> uplinkCmdExeMap = new ConcurrentHashMap<>();
private final Map<Byte, YunKuaiChongDownlinkCmdExe> downlinkCmdExeMap = new ConcurrentHashMap<>();
public class YunKuaiChongProtocolMessageProcessor extends ProtocolMessageProcessor {
private final Map<Integer, YunKuaiChongUplinkCmdExe> uplinkCmdExeMap = new ConcurrentHashMap<>();
private final Map<Integer, YunKuaiChongDownlinkCmdExe> downlinkCmdExeMap = new ConcurrentHashMap<>();
public YunKuaiChongV15ProtocolMessageProcessor(Forwarder forwarder, ProtocolContext protocolContext) {
public YunKuaiChongProtocolMessageProcessor(Forwarder forwarder, ProtocolContext protocolContext) {
super(forwarder, protocolContext);
Set<Class<?>> cmdClasses = ClassUtil.scanPackageByAnnotation(ClassUtil.getPackage(this.getClass()), YunKuaiChongCmd.class);
cmdClasses.stream().filter(YunKuaiChongUplinkCmdExe.class::isAssignableFrom)
.forEach(clazz -> {
byte cmd = clazz.getAnnotation(YunKuaiChongCmd.class).value();
int cmd = clazz.getAnnotation(YunKuaiChongCmd.class).value();
try {
YunKuaiChongUplinkCmdExe yunKuaiChongUplinkCmdExe = (YunKuaiChongUplinkCmdExe) clazz.getDeclaredConstructor().newInstance();
uplinkCmdExeMap.put(cmd, yunKuaiChongUplinkCmdExe);
@@ -57,7 +53,7 @@ public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProc
cmdClasses.stream().filter(YunKuaiChongDownlinkCmdExe.class::isAssignableFrom)
.forEach(clazz -> {
byte cmd = clazz.getAnnotation(YunKuaiChongCmd.class).value();
int cmd = clazz.getAnnotation(YunKuaiChongCmd.class).value();
try {
YunKuaiChongDownlinkCmdExe yunKuaiChongDownlinkCmdExe = (YunKuaiChongDownlinkCmdExe) clazz.getDeclaredConstructor().newInstance();
downlinkCmdExeMap.put(cmd, yunKuaiChongDownlinkCmdExe);
@@ -138,15 +134,15 @@ public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProc
JCPPPair<Boolean, Integer> checkResult = checkCrcSum(checkData, checkSum);
if (!checkResult.getFirst()) {
if (Boolean.FALSE.equals(checkResult.getFirst())) {
csTemp.writeBytes(byCheckSum);
checkSum = csTemp.readUnsignedShortLE();
checkResult = checkCrcSum(checkData, checkSum);
log.info("云快充V1.5检验和 第二次检查: checkResult:{}, checkSum:{}", checkResult, checkSum);
log.info("云快充检验和 第二次检查: checkResult:{}, checkSum:{}", checkResult, checkSum);
}
if (!checkResult.getFirst()) {
log.info("云快充V1.5检验和不一致两次不通过 不处理! CMD{},校验域:{},正确校验和:{}", frameType, checkSum, checkResult.getSecond());
if (Boolean.FALSE.equals(checkResult.getFirst())) {
log.info("云快充检验和不一致两次不通过 不处理! CMD{},校验域:{},正确校验和:{}", frameType, checkSum, checkResult.getSecond());
return;
}
@@ -169,7 +165,7 @@ public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProc
DownlinkRestMessage protocolDownlinkMsg = sessionToHandlerMsg.downlinkMsg();
int cmd = YunKuaiChongV150DownlinkCmdEnum.valueOf(protocolDownlinkMsg.getDownlinkCmd()).getCmd();
int cmd = YunKuaiChongDownlinkCmdEnum.valueOf(protocolDownlinkMsg.getDownlinkCmd()).getCmd();
YunKuaiChongDwonlinkMessage message = new YunKuaiChongDwonlinkMessage();
message.setId(new UUID(protocolDownlinkMsg.getMessageIdMSB(), protocolDownlinkMsg.getMessageIdLSB()));
@@ -188,11 +184,11 @@ public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProc
}
private void exeCmd(YunKuaiChongUplinkMessage message, TcpSession session) {
YunKuaiChongUplinkCmdExe uplinkCmdExe = uplinkCmdExeMap.get((byte) message.getCmd());
YunKuaiChongUplinkCmdExe uplinkCmdExe = uplinkCmdExeMap.get(message.getCmd());
if (uplinkCmdExe == null) {
log.info("[{}] 云快充V1.5协议接收到未知的上行指令 {}", session, message.getCmd());
log.info("[{}] 云快充协议接收到未知的上行指令 {}", session, message.getCmd());
return;
}
@@ -201,11 +197,11 @@ public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProc
}
private void exeCmd(YunKuaiChongDwonlinkMessage message, TcpSession session) {
YunKuaiChongDownlinkCmdExe downlinkCmdExe = downlinkCmdExeMap.get((byte) message.getCmd());
YunKuaiChongDownlinkCmdExe downlinkCmdExe = downlinkCmdExeMap.get(message.getCmd());
if (downlinkCmdExe == null) {
log.info("[{}] 云快充V1.5协议接收到未知的下行指令 {}", session, message.getCmd());
log.info("[{}] 云快充协议接收到未知的下行指令 {}", session, message.getCmd());
return;
}

View File

@@ -15,7 +15,7 @@ import sanbing.jcpp.protocol.listener.tcp.TcpSession;
* @author baigod
*/
@Slf4j
public abstract class YunKuaiChongUplinkCmdExe extends AbstractYunKuaiChongCmdExe{
public abstract class YunKuaiChongUplinkCmdExe extends AbstractYunKuaiChongCmdExe {
public abstract void execute(TcpSession tcpSession, YunKuaiChongUplinkMessage yunKuaiChongUplinkMessage, ProtocolContext ctx);

View File

@@ -14,6 +14,6 @@ import java.lang.annotation.*;
@Documented
public @interface YunKuaiChongCmd {
byte value();
int value();
}

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import cn.hutool.core.util.HexUtil;
import com.fasterxml.jackson.databind.node.ObjectNode;

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.buffer.ByteBuf;
@@ -18,7 +18,7 @@ import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkCmdExe;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkMessage;
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.HEARTBEAT;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.HEARTBEAT;
/**
* 云快充1.5.0 充电桩心跳包

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -28,8 +28,8 @@ import static sanbing.jcpp.infrastructure.util.config.ThreadPoolConfiguration.PR
import static sanbing.jcpp.protocol.domain.SessionCloseReason.MANUALLY;
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.FAILURE_BYTE;
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.SUCCESS_BYTE;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.LOGIN_ACK;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.SYNC_TIME;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.LOGIN_ACK;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.SYNC_TIME;
/**
* 云快充1.5.0登录认证应答

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.buffer.ByteBuf;

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -23,7 +23,7 @@ import java.util.List;
import java.util.Map;
import static sanbing.jcpp.proto.gen.ProtocolProto.PricingModelFlag.*;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.QUERY_PRICING_ACK;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.QUERY_PRICING_ACK;
/**
* 计费模型请求应答

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.buffer.ByteBuf;

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.buffer.ByteBuf;

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -16,7 +16,7 @@ import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDownlinkCmdExe;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage;
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.REMOTE_START_CHARGING;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.REMOTE_START_CHARGING;
/**
* 云快充1.5.0 运营平台远程控制启机

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.buffer.ByteBuf;

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -14,7 +14,7 @@ import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDownlinkCmdExe;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage;
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.REMOTE_START_CHARGING;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.REMOTE_START_CHARGING;
/**
* 云快充1.5.0 运营平台远程停机

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.buffer.ByteBuf;

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -16,7 +16,7 @@ import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkCmdExe;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkMessage;
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.QUERY_PRICING_ACK;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.QUERY_PRICING_ACK;
/**
* 云快充1.5.0 计费模型应答

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -23,8 +23,8 @@ import java.util.List;
import java.util.Map;
import static sanbing.jcpp.proto.gen.ProtocolProto.PricingModelFlag.*;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.QUERY_PRICING_ACK;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.SET_PRICING;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.QUERY_PRICING_ACK;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.SET_PRICING;
/**
* 云快充1.5.0 计费模型设置

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -18,7 +18,7 @@ import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.FAILURE_BYTE;
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.SUCCESS_BYTE;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.VERIFY_PRICING_ACK;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.VERIFY_PRICING_ACK;
/**
* 云快充1.5.0 交易记录确认

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.buffer.ByteBuf;

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -20,7 +20,7 @@ import java.util.Arrays;
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.FAILURE_BYTE;
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.SUCCESS_BYTE;
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.VERIFY_PRICING_ACK;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.VERIFY_PRICING_ACK;
/**
* 云快充1.5.0计费模型验证请求应答

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
package sanbing.jcpp.protocol.yunkuaichong.commoncmd;
import com.fasterxml.jackson.databind.node.ObjectNode;

View File

@@ -2,7 +2,7 @@
* 抖音关注程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v150.enums;
package sanbing.jcpp.protocol.yunkuaichong.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -12,7 +12,7 @@ import lombok.Getter;
*/
@AllArgsConstructor
@Getter
public enum YunKuaiChongV150DownlinkCmdEnum {
public enum YunKuaiChongDownlinkCmdEnum {
LOGIN_ACK(0x02),
@@ -30,9 +30,10 @@ public enum YunKuaiChongV150DownlinkCmdEnum {
REMOTE_STOP_CHARGING(0x36),
TRANSACTION_RECORD(0x40)
;
TRANSACTION_RECORD(0x40),
private int cmd;
REMOTE_PARALLEL_START_CHARGING(0xA4);
private final Integer cmd;
}

View File

@@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j;
import sanbing.jcpp.infrastructure.util.annotation.ProtocolComponent;
import sanbing.jcpp.protocol.ProtocolBootstrap;
import sanbing.jcpp.protocol.ProtocolMessageProcessor;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongProtocolMessageProcessor;
import static sanbing.jcpp.protocol.yunkuaichong.v150.YunkuaichongV150ProtocolBootstrap.PROTOCOL_NAME;
@@ -38,7 +39,7 @@ public class YunkuaichongV150ProtocolBootstrap extends ProtocolBootstrap {
@Override
protected ProtocolMessageProcessor messageProcessor() {
return new YunKuaiChongV15ProtocolMessageProcessor(forwarder, protocolContext);
return new YunKuaiChongProtocolMessageProcessor(forwarder, protocolContext);
}

View File

@@ -0,0 +1,46 @@
/**
* 抖音关注:程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v160;
import lombok.extern.slf4j.Slf4j;
import sanbing.jcpp.infrastructure.util.annotation.ProtocolComponent;
import sanbing.jcpp.protocol.ProtocolBootstrap;
import sanbing.jcpp.protocol.ProtocolMessageProcessor;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongProtocolMessageProcessor;
import static sanbing.jcpp.protocol.yunkuaichong.v160.YunkuaichongV160ProtocolBootstrap.PROTOCOL_NAME;
/**
* @author baigod
*/
@ProtocolComponent(PROTOCOL_NAME)
@Slf4j
public class YunkuaichongV160ProtocolBootstrap extends ProtocolBootstrap {
public static final String PROTOCOL_NAME = "yunkuaichongV160";
@Override
protected String getProtocolName() {
return PROTOCOL_NAME;
}
@Override
protected void _init() {
// do nothing
}
@Override
protected void _destroy() {
// do nothing
}
@Override
protected ProtocolMessageProcessor messageProcessor() {
return new YunKuaiChongProtocolMessageProcessor(forwarder, protocolContext);
}
}

View File

@@ -0,0 +1,80 @@
/**
* 抖音关注:程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v160.cmd;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import sanbing.jcpp.infrastructure.util.codec.BCDUtil;
import sanbing.jcpp.proto.gen.ProtocolProto;
import sanbing.jcpp.protocol.ProtocolContext;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDownlinkCmdExe;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage;
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.REMOTE_START_CHARGING;
/**
* 云快充1.6.0 运营平台远程控制并充启机
*
* @author baigod
*/
@Slf4j
@YunKuaiChongCmd(0xA4)
public class YunKuaiChongV160RemoteParallelStartDLCmd extends YunKuaiChongDownlinkCmdExe {
static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
@Override
public void execute(TcpSession tcpSession, YunKuaiChongDwonlinkMessage yunKuaiChongDwonlinkMessage, ProtocolContext ctx) {
log.info("{} 云快充1.6.0运营平台远程控制并充启机", tcpSession);
if (!yunKuaiChongDwonlinkMessage.getMsg().hasRemoteStartChargingRequest()) {
return;
}
ProtocolProto.RemoteStartChargingRequest remoteStartChargingRequest = yunKuaiChongDwonlinkMessage.getMsg().getRemoteStartChargingRequest();
String pileCode = remoteStartChargingRequest.getPileCode();
String gunCode = remoteStartChargingRequest.getGunCode();
String tradeNo = remoteStartChargingRequest.getTradeNo();
int limitYuan = remoteStartChargingRequest.getLimitYuan();
byte[] cardNo = encodeCardNo(tradeNo);
ByteBuf msgBody = Unpooled.buffer(44);
// 交易流水号
msgBody.writeBytes(encodeTradeNo(tradeNo));
// 桩编码
msgBody.writeBytes(encodePileCode(pileCode));
// 枪号
msgBody.writeBytes(encodeGunCode(gunCode));
// 逻辑卡号 BCD码
msgBody.writeBytes(cardNo);
// 物理卡号
msgBody.writeBytes(cardNo);
// 账户余额
msgBody.writeIntLE(limitYuan);
// 并充序号
msgBody.writeBytes(BCDUtil.toBytes(LocalDateTime.now().format(dateTimeFormatter)));
encodeAndWriteFlush(REMOTE_START_CHARGING,
msgBody,
tcpSession);
}
/**
* 用交易流水号做卡号
*/
private static byte[] encodeCardNo(String tradeNo) {
tradeNo = StringUtils.right(tradeNo, 16);
tradeNo = StringUtils.leftPad(tradeNo, 16, '0');
return BCDUtil.toBytes(tradeNo);
}
}

View File

@@ -0,0 +1,104 @@
/**
* 抖音关注:程序员三丙
* 知识星球https://t.zsxq.com/j9b21
*/
package sanbing.jcpp.protocol.yunkuaichong.v160.cmd;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.extern.slf4j.Slf4j;
import sanbing.jcpp.infrastructure.util.codec.BCDUtil;
import sanbing.jcpp.infrastructure.util.jackson.JacksonUtil;
import sanbing.jcpp.infrastructure.util.trace.TracerContextUtil;
import sanbing.jcpp.proto.gen.ProtocolProto.RemoteStartChargingResponse;
import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage;
import sanbing.jcpp.protocol.ProtocolContext;
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkCmdExe;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkMessage;
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
/**
* 云快充1.6.0 远程并充启机命令回复
*
* @author baigod
*/
@Slf4j
@YunKuaiChongCmd(0xA3)
public class YunKuaiChongV160RemoteParallelStartResultULCmd extends YunKuaiChongUplinkCmdExe {
@Override
public void execute(TcpSession tcpSession, YunKuaiChongUplinkMessage yunKuaiChongUplinkMessage, ProtocolContext ctx) {
log.info("{} 云快充1.6.远程并充启机命令回复", tcpSession);
ByteBuf byteBuf = Unpooled.copiedBuffer(yunKuaiChongUplinkMessage.getMsgBody());
// 从Tracer总获取当前时间
long ts = TracerContextUtil.getCurrentTracer().getTracerTs();
ObjectNode additionalInfo = JacksonUtil.newObjectNode();
// 1.交易流水号
byte[] tradeNoBytes = new byte[16];
byteBuf.readBytes(tradeNoBytes);
String tradeNo = decodeTradeNo(tradeNoBytes);
// 2.桩编号
byte[] pileCodeBytes = new byte[7];
byteBuf.readBytes(pileCodeBytes);
String pileCode = BCDUtil.toString(pileCodeBytes);
// 3.抢号
byte gunCodeByte = byteBuf.readByte();
String gunCode = BCDUtil.toString(gunCodeByte);
// 4.命令执行结果 0x00失败 0x01成功
boolean isSuccess = (byteBuf.readByte() == 0x01);
// 5.失败原因 0无 1设备编码不匹配 2枪已在充电 3设备故障 4设备离线 5未插枪
byte failReasonByte = byteBuf.readByte();
String failReason = mapFailCode(failReasonByte);
// 6.主辅枪标记 0x00 主枪 0x01辅枪
byte gunFlagByte = byteBuf.readByte();
String gunFlag = BCDUtil.toString(gunFlagByte);
additionalInfo.put("主辅枪标记", gunFlag);
// 7.并充序号0xA4下发的并充序号
byte[] parallelSeqNoBytes = new byte[6];
byteBuf.readBytes(parallelSeqNoBytes);
String parallelSeqNo = BCDUtil.toString(parallelSeqNoBytes);
additionalInfo.put("并充序号", parallelSeqNo);
RemoteStartChargingResponse remoteStartChargingResponse = RemoteStartChargingResponse.newBuilder()
.setTs(ts)
.setPileCode(pileCode)
.setGunCode(gunCode)
.setTradeNo(tradeNo)
.setSuccess(isSuccess)
.setFailReason(failReason)
.setAdditionalInfo(additionalInfo.toString())
.build();
// 转发到后端
UplinkQueueMessage uplinkQueueMessage = uplinkMessageBuilder(pileCode, tcpSession, yunKuaiChongUplinkMessage)
.setRemoteStartChargingResponse(remoteStartChargingResponse)
.build();
tcpSession.getForwarder().sendMessage(uplinkQueueMessage);
}
public static String mapFailCode(byte failCode) {
return switch (failCode) {
case 0x00 -> "";
case 0x01 -> "设备编号不匹配";
case 0x02 -> "枪已在充电";
case 0x03 -> "设备故障";
case 0x04 -> "设备离线";
case 0x05 -> "未插枪";
case 0x33 -> "充电失败"; // 充电失败或其他相关信息
case 0x34 -> "待启充"; // 示例,处理收到充电命令
default -> "未知错误代码";
};
}
}