mirror of
https://gitee.com/san-bing/JChargePointProtocol
synced 2026-05-07 11:29:53 +08:00
扩展云快充1.6
This commit is contained in:
@@ -16,8 +16,8 @@
|
|||||||
------------------------------
|
------------------------------
|
||||||
#### 当前支持的充电桩协议
|
#### 当前支持的充电桩协议
|
||||||
| 协议名 | 版本号 |
|
| 协议名 | 版本号 |
|
||||||
|---|---|
|
|---|------------|
|
||||||
| 云快充 | 1.5.0 |
|
| 云快充 | 1.5.0、1.6.0 |
|
||||||
|
|
||||||
------------------------------
|
------------------------------
|
||||||
#### 充电桩协议文档
|
#### 充电桩协议文档
|
||||||
|
|||||||
@@ -206,6 +206,45 @@ service:
|
|||||||
linger-ms: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_KAFKA_LINGER_MS:0}"
|
linger-ms: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_KAFKA_LINGER_MS:0}"
|
||||||
buffer-memory: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_BUFFER_MEMORY:33554432}"
|
buffer-memory: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_BUFFER_MEMORY:33554432}"
|
||||||
other-properties: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_QUEUE_KAFKA_OTHER_PROPERTIES:}"
|
other-properties: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_QUEUE_KAFKA_OTHER_PROPERTIES:}"
|
||||||
|
yunkuaichongV160:
|
||||||
|
enabled: "${PROTOCOLS_YUNKUAICHONGV150_ENABLED:true}"
|
||||||
|
listener:
|
||||||
|
tcp:
|
||||||
|
bind-address: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_BIND_ADDRESS:0.0.0.0}"
|
||||||
|
bind-port: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_BIND_PORT:38002}"
|
||||||
|
boss-group-thread_count: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_BOSS_GROUP_THREADS:4}"
|
||||||
|
worker-group-thread-count: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_WORKER_GROUP_THREADS:16}"
|
||||||
|
so-keep-alive: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_SO_KEEPALIVE:true}"
|
||||||
|
so-backlog: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_SO_BACKLOG:128}"
|
||||||
|
so-rcvbuf: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_SO_RCVBUF:65536}"
|
||||||
|
so-sndbuf: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_SO_SNDBUF:65536}"
|
||||||
|
nodelay: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_NODELAY:true}"
|
||||||
|
handler:
|
||||||
|
idle-timeout-seconds: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_HANDLER_IDLE_TIMEOUT_SECONDS:600}"
|
||||||
|
max_connections: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_HANDLER_MAX_CONNECTIONS:100000}"
|
||||||
|
# 默认为二进制类型的拆包器
|
||||||
|
# 可选JSON类型的拆包器 "${PROTOCOLS_YUNKUAICHONGV160_NETTY_HANDLER_BINARY_CONFIGURATION:type:JSON}"
|
||||||
|
# 可选纯文本类型的拆包器 "${PROTOCOLS_YUNKUAICHONGV160_NETTY_HANDLER_BINARY_CONFIGURATION:type:TEXT;maxFrameLength:128;stripDelimiter:true;messageSeparator:null;charsetName:UTF-8}"
|
||||||
|
configuration: "${PROTOCOLS_YUNKUAICHONGV160_NETTY_HANDLER_BINARY_CONFIGURATION:type:BINARY;decoder:sanbing.jcpp.protocol.listener.tcp.decoder.JCPPLengthFieldBasedFrameDecoder;byteOrder:LITTLE_ENDIAN;head:68;lengthFieldOffset:1;lengthFieldLength:1;lengthAdjustment:2;initialBytesToStrip:0}"
|
||||||
|
forwarder:
|
||||||
|
# 如果是单体服务,可选kafka、memory,未来计划扩展RocketMQ, GRpc、REST
|
||||||
|
type: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_TYPE:memory}"
|
||||||
|
memory:
|
||||||
|
topic: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_MEMORY_TOPIC:protocol_uplink}"
|
||||||
|
kafka:
|
||||||
|
topic: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_TOPIC:protocol_uplink}"
|
||||||
|
jcpp-partition: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_JCPP_PARTITION:true}" # 是否利用JCPP的分片框架
|
||||||
|
# 以下配置只有在service.type为protocol时且jcpp-partition为false时才生效
|
||||||
|
bootstrap-servers: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_SERVERS:10.102.12.102:9092}"
|
||||||
|
acks: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_ACKS:1}"
|
||||||
|
# # 可选 protobuf(推荐)、json
|
||||||
|
encoder: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_ENCODER:protobuf}"
|
||||||
|
retries: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_RETRIES:1}"
|
||||||
|
compression-type: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_COMPRESSION_TYPE:lz4}" # none, gzip, snappy, lz4, zstd
|
||||||
|
batch-size: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_BATCH_SIZE:16384}"
|
||||||
|
linger-ms: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_LINGER_MS:0}"
|
||||||
|
buffer-memory: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_BUFFER_MEMORY:33554432}"
|
||||||
|
other-properties: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_QUEUE_KAFKA_OTHER_PROPERTIES:}"
|
||||||
|
|
||||||
thread-pool:
|
thread-pool:
|
||||||
sharding:
|
sharding:
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
redis.connection.type=cluster
|
redis.connection.type=cluster
|
||||||
redis.cluster.nodes=10.102.12.101:30700,10.102.12.101:32027,10.102.12.101:30767,10.102.12.101:30250,10.102.12.101:30612,10.102.12.101:32303
|
redis.cluster.nodes=10.102.12.101:30700,10.102.12.101:32027,10.102.12.101:30767,10.102.12.101:30250,10.102.12.101:30612,10.102.12.101:32303
|
||||||
service.protocols.yunkuaichongV150.listener.tcp.bind-port=0
|
service.protocols.yunkuaichongV150.listener.tcp.bind-port=0
|
||||||
|
service.protocols.yunkuaichongV160.listener.tcp.bind-port=0
|
||||||
@@ -20,4 +20,6 @@ public enum DownlinkCmdEnum {
|
|||||||
REMOTE_START_CHARGING,
|
REMOTE_START_CHARGING,
|
||||||
|
|
||||||
TRANSACTION_RECORD,
|
TRANSACTION_RECORD,
|
||||||
|
|
||||||
|
REMOTE_PARALLEL_START_CHARGING,
|
||||||
}
|
}
|
||||||
@@ -81,6 +81,43 @@ service:
|
|||||||
linger-ms: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_KAFKA_LINGER_MS:0}"
|
linger-ms: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_KAFKA_LINGER_MS:0}"
|
||||||
buffer-memory: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_BUFFER_MEMORY:33554432}"
|
buffer-memory: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_BUFFER_MEMORY:33554432}"
|
||||||
other-properties: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_QUEUE_KAFKA_OTHER_PROPERTIES:}"
|
other-properties: "${PROTOCOLS_YUNKUAICHONGV150_FORWARD_QUEUE_KAFKA_OTHER_PROPERTIES:}"
|
||||||
|
yunkuaichongV160:
|
||||||
|
enabled: "${PROTOCOLS_YUNKUAICHONGV160_ENABLED:true}"
|
||||||
|
listener:
|
||||||
|
tcp:
|
||||||
|
bind-address: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_BIND_ADDRESS:0.0.0.0}"
|
||||||
|
bind-port: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_BIND_PORT:38002}"
|
||||||
|
boss-group-thread_count: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_BOSS_GROUP_THREADS:4}"
|
||||||
|
worker-group-thread-count: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_WORKER_GROUP_THREADS:16}"
|
||||||
|
so-keep-alive: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_SO_KEEPALIVE:true}"
|
||||||
|
so-backlog: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_SO_BACKLOG:128}"
|
||||||
|
so-rcvbuf: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_SO_RCVBUF:65536}"
|
||||||
|
so-sndbuf: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_SO_SNDBUF:65536}"
|
||||||
|
nodelay: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_NODELAY:true}"
|
||||||
|
handler:
|
||||||
|
idle-timeout-seconds: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_HANDLER_IDLE_TIMEOUT_SECONDS:600}"
|
||||||
|
max_connections: "${PROTOCOLS_YUNKUAICHONGV160_LISTENER_TCP_HANDLER_MAX_CONNECTIONS:100000}"
|
||||||
|
# 默认为二进制类型的拆包器
|
||||||
|
# 可选JSON类型的拆包器 "${PROTOCOLS_YUNKUAICHONGV160_NETTY_HANDLER_BINARY_CONFIGURATION:type:JSON}"
|
||||||
|
# 可选纯文本类型的拆包器 "${PROTOCOLS_YUNKUAICHONGV160_NETTY_HANDLER_BINARY_CONFIGURATION:type:TEXT;maxFrameLength:128;stripDelimiter:true;messageSeparator:null;charsetName:UTF-8}"
|
||||||
|
configuration: "${PROTOCOLS_YUNKUAICHONGV160_NETTY_HANDLER_BINARY_CONFIGURATION:type:BINARY;decoder:sanbing.jcpp.protocol.listener.tcp.decoder.JCPPLengthFieldBasedFrameDecoder;byteOrder:LITTLE_ENDIAN;head:68;lengthFieldOffset:1;lengthFieldLength:1;lengthAdjustment:2;initialBytesToStrip:0}"
|
||||||
|
forwarder:
|
||||||
|
# 作为前置服务单独启时可选:kafka、kafka-sharding,未来计划扩展RocketMQ, GRpc、REST
|
||||||
|
type: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_TYPE:kafka}"
|
||||||
|
kafka:
|
||||||
|
topic: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_TOPIC:protocol_uplink}"
|
||||||
|
jcpp-partition: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_JCPP_PARTITION:true}" # 是否利用JCPP的分片框架
|
||||||
|
# 以下配置只有在service.type为protocol时且jcpp-partition为false时才生效
|
||||||
|
bootstrap-servers: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_SERVERS:10.102.12.102:9092}"
|
||||||
|
acks: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_ACKS:1}"
|
||||||
|
# # 可选 protobuf(推荐)、json
|
||||||
|
encoder: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_ENCODER:protobuf}"
|
||||||
|
retries: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_RETRIES:1}"
|
||||||
|
compression-type: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_COMPRESSION_TYPE:lz4}" # none, gzip, snappy, lz4, zstd
|
||||||
|
batch-size: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_BATCH_SIZE:16384}"
|
||||||
|
linger-ms: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_KAFKA_LINGER_MS:0}"
|
||||||
|
buffer-memory: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_BUFFER_MEMORY:33554432}"
|
||||||
|
other-properties: "${PROTOCOLS_YUNKUAICHONGV160_FORWARD_QUEUE_KAFKA_OTHER_PROPERTIES:}"
|
||||||
|
|
||||||
# 应用程序服务注册中心配置
|
# 应用程序服务注册中心配置
|
||||||
zk:
|
zk:
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import sanbing.jcpp.infrastructure.util.codec.BCDUtil;
|
|||||||
import sanbing.jcpp.proto.gen.ProtocolProto;
|
import sanbing.jcpp.proto.gen.ProtocolProto;
|
||||||
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
|
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
|
||||||
import sanbing.jcpp.protocol.listener.tcp.enums.SequenceNumberLength;
|
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.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
@@ -98,7 +98,7 @@ public class AbstractYunKuaiChongCmdExe {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected byte[] encode(YunKuaiChongV150DownlinkCmdEnum downlinkCmd,
|
protected byte[] encode(YunKuaiChongDownlinkCmdEnum downlinkCmd,
|
||||||
int seqNo,
|
int seqNo,
|
||||||
int encryptionFlag,
|
int encryptionFlag,
|
||||||
ByteBuf msgBody) {
|
ByteBuf msgBody) {
|
||||||
@@ -120,7 +120,7 @@ public class AbstractYunKuaiChongCmdExe {
|
|||||||
return toBytes(response);
|
return toBytes(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void encodeAndWriteFlush(YunKuaiChongV150DownlinkCmdEnum downlinkCmd,
|
protected void encodeAndWriteFlush(YunKuaiChongDownlinkCmdEnum downlinkCmd,
|
||||||
int seqNo,
|
int seqNo,
|
||||||
int encryptionFlag,
|
int encryptionFlag,
|
||||||
ByteBuf msgBody,
|
ByteBuf msgBody,
|
||||||
@@ -131,7 +131,7 @@ public class AbstractYunKuaiChongCmdExe {
|
|||||||
tcpSession.writeAndFlush(Unpooled.copiedBuffer(encode));
|
tcpSession.writeAndFlush(Unpooled.copiedBuffer(encode));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void encodeAndWriteFlush(YunKuaiChongV150DownlinkCmdEnum downlinkCmd,
|
protected void encodeAndWriteFlush(YunKuaiChongDownlinkCmdEnum downlinkCmd,
|
||||||
ByteBuf msgBody,
|
ByteBuf msgBody,
|
||||||
TcpSession tcpSession) {
|
TcpSession tcpSession) {
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球:https://t.zsxq.com/j9b21
|
||||||
*/
|
*/
|
||||||
package sanbing.jcpp.protocol.yunkuaichong.v150;
|
package sanbing.jcpp.protocol.yunkuaichong;
|
||||||
|
|
||||||
import cn.hutool.core.util.ClassUtil;
|
import cn.hutool.core.util.ClassUtil;
|
||||||
import io.netty.buffer.ByteBuf;
|
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.domain.SessionToHandlerMsg;
|
||||||
import sanbing.jcpp.protocol.forwarder.Forwarder;
|
import sanbing.jcpp.protocol.forwarder.Forwarder;
|
||||||
import sanbing.jcpp.protocol.listener.tcp.TcpSession;
|
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.annotation.YunKuaiChongCmd;
|
||||||
import sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum;
|
import sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -33,17 +29,17 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
import static sanbing.jcpp.infrastructure.util.codec.ByteUtil.checkCrcSum;
|
import static sanbing.jcpp.infrastructure.util.codec.ByteUtil.checkCrcSum;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProcessor {
|
public class YunKuaiChongProtocolMessageProcessor extends ProtocolMessageProcessor {
|
||||||
private final Map<Byte, YunKuaiChongUplinkCmdExe> uplinkCmdExeMap = new ConcurrentHashMap<>();
|
private final Map<Integer, YunKuaiChongUplinkCmdExe> uplinkCmdExeMap = new ConcurrentHashMap<>();
|
||||||
private final Map<Byte, YunKuaiChongDownlinkCmdExe> downlinkCmdExeMap = 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);
|
super(forwarder, protocolContext);
|
||||||
|
|
||||||
Set<Class<?>> cmdClasses = ClassUtil.scanPackageByAnnotation(ClassUtil.getPackage(this.getClass()), YunKuaiChongCmd.class);
|
Set<Class<?>> cmdClasses = ClassUtil.scanPackageByAnnotation(ClassUtil.getPackage(this.getClass()), YunKuaiChongCmd.class);
|
||||||
cmdClasses.stream().filter(YunKuaiChongUplinkCmdExe.class::isAssignableFrom)
|
cmdClasses.stream().filter(YunKuaiChongUplinkCmdExe.class::isAssignableFrom)
|
||||||
.forEach(clazz -> {
|
.forEach(clazz -> {
|
||||||
byte cmd = clazz.getAnnotation(YunKuaiChongCmd.class).value();
|
int cmd = clazz.getAnnotation(YunKuaiChongCmd.class).value();
|
||||||
try {
|
try {
|
||||||
YunKuaiChongUplinkCmdExe yunKuaiChongUplinkCmdExe = (YunKuaiChongUplinkCmdExe) clazz.getDeclaredConstructor().newInstance();
|
YunKuaiChongUplinkCmdExe yunKuaiChongUplinkCmdExe = (YunKuaiChongUplinkCmdExe) clazz.getDeclaredConstructor().newInstance();
|
||||||
uplinkCmdExeMap.put(cmd, yunKuaiChongUplinkCmdExe);
|
uplinkCmdExeMap.put(cmd, yunKuaiChongUplinkCmdExe);
|
||||||
@@ -57,7 +53,7 @@ public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProc
|
|||||||
|
|
||||||
cmdClasses.stream().filter(YunKuaiChongDownlinkCmdExe.class::isAssignableFrom)
|
cmdClasses.stream().filter(YunKuaiChongDownlinkCmdExe.class::isAssignableFrom)
|
||||||
.forEach(clazz -> {
|
.forEach(clazz -> {
|
||||||
byte cmd = clazz.getAnnotation(YunKuaiChongCmd.class).value();
|
int cmd = clazz.getAnnotation(YunKuaiChongCmd.class).value();
|
||||||
try {
|
try {
|
||||||
YunKuaiChongDownlinkCmdExe yunKuaiChongDownlinkCmdExe = (YunKuaiChongDownlinkCmdExe) clazz.getDeclaredConstructor().newInstance();
|
YunKuaiChongDownlinkCmdExe yunKuaiChongDownlinkCmdExe = (YunKuaiChongDownlinkCmdExe) clazz.getDeclaredConstructor().newInstance();
|
||||||
downlinkCmdExeMap.put(cmd, yunKuaiChongDownlinkCmdExe);
|
downlinkCmdExeMap.put(cmd, yunKuaiChongDownlinkCmdExe);
|
||||||
@@ -138,15 +134,15 @@ public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProc
|
|||||||
|
|
||||||
JCPPPair<Boolean, Integer> checkResult = checkCrcSum(checkData, checkSum);
|
JCPPPair<Boolean, Integer> checkResult = checkCrcSum(checkData, checkSum);
|
||||||
|
|
||||||
if (!checkResult.getFirst()) {
|
if (Boolean.FALSE.equals(checkResult.getFirst())) {
|
||||||
csTemp.writeBytes(byCheckSum);
|
csTemp.writeBytes(byCheckSum);
|
||||||
checkSum = csTemp.readUnsignedShortLE();
|
checkSum = csTemp.readUnsignedShortLE();
|
||||||
checkResult = checkCrcSum(checkData, checkSum);
|
checkResult = checkCrcSum(checkData, checkSum);
|
||||||
log.info("云快充V1.5检验和 第二次检查: checkResult:{}, checkSum:{}", checkResult, checkSum);
|
log.info("云快充检验和 第二次检查: checkResult:{}, checkSum:{}", checkResult, checkSum);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!checkResult.getFirst()) {
|
if (Boolean.FALSE.equals(checkResult.getFirst())) {
|
||||||
log.info("云快充V1.5检验和不一致两次不通过 不处理! CMD:{},校验域:{},正确校验和:{}", frameType, checkSum, checkResult.getSecond());
|
log.info("云快充检验和不一致两次不通过 不处理! CMD:{},校验域:{},正确校验和:{}", frameType, checkSum, checkResult.getSecond());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,7 +165,7 @@ public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProc
|
|||||||
|
|
||||||
DownlinkRestMessage protocolDownlinkMsg = sessionToHandlerMsg.downlinkMsg();
|
DownlinkRestMessage protocolDownlinkMsg = sessionToHandlerMsg.downlinkMsg();
|
||||||
|
|
||||||
int cmd = YunKuaiChongV150DownlinkCmdEnum.valueOf(protocolDownlinkMsg.getDownlinkCmd()).getCmd();
|
int cmd = YunKuaiChongDownlinkCmdEnum.valueOf(protocolDownlinkMsg.getDownlinkCmd()).getCmd();
|
||||||
|
|
||||||
YunKuaiChongDwonlinkMessage message = new YunKuaiChongDwonlinkMessage();
|
YunKuaiChongDwonlinkMessage message = new YunKuaiChongDwonlinkMessage();
|
||||||
message.setId(new UUID(protocolDownlinkMsg.getMessageIdMSB(), protocolDownlinkMsg.getMessageIdLSB()));
|
message.setId(new UUID(protocolDownlinkMsg.getMessageIdMSB(), protocolDownlinkMsg.getMessageIdLSB()));
|
||||||
@@ -188,11 +184,11 @@ public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProc
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void exeCmd(YunKuaiChongUplinkMessage message, TcpSession session) {
|
private void exeCmd(YunKuaiChongUplinkMessage message, TcpSession session) {
|
||||||
YunKuaiChongUplinkCmdExe uplinkCmdExe = uplinkCmdExeMap.get((byte) message.getCmd());
|
YunKuaiChongUplinkCmdExe uplinkCmdExe = uplinkCmdExeMap.get(message.getCmd());
|
||||||
|
|
||||||
if (uplinkCmdExe == null) {
|
if (uplinkCmdExe == null) {
|
||||||
|
|
||||||
log.info("[{}] 云快充V1.5协议接收到未知的上行指令 {}", session, message.getCmd());
|
log.info("[{}] 云快充协议接收到未知的上行指令 {}", session, message.getCmd());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -201,11 +197,11 @@ public class YunKuaiChongV15ProtocolMessageProcessor extends ProtocolMessageProc
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void exeCmd(YunKuaiChongDwonlinkMessage message, TcpSession session) {
|
private void exeCmd(YunKuaiChongDwonlinkMessage message, TcpSession session) {
|
||||||
YunKuaiChongDownlinkCmdExe downlinkCmdExe = downlinkCmdExeMap.get((byte) message.getCmd());
|
YunKuaiChongDownlinkCmdExe downlinkCmdExe = downlinkCmdExeMap.get(message.getCmd());
|
||||||
|
|
||||||
if (downlinkCmdExe == null) {
|
if (downlinkCmdExe == null) {
|
||||||
|
|
||||||
log.info("[{}] 云快充V1.5协议接收到未知的下行指令 {}", session, message.getCmd());
|
log.info("[{}] 云快充协议接收到未知的下行指令 {}", session, message.getCmd());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -14,6 +14,6 @@ import java.lang.annotation.*;
|
|||||||
@Documented
|
@Documented
|
||||||
public @interface YunKuaiChongCmd {
|
public @interface YunKuaiChongCmd {
|
||||||
|
|
||||||
byte value();
|
int value();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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 cn.hutool.core.util.HexUtil;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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 com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import io.netty.buffer.ByteBuf;
|
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.YunKuaiChongUplinkMessage;
|
||||||
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
|
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 充电桩心跳包
|
* 云快充1.5.0 充电桩心跳包
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
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.domain.SessionCloseReason.MANUALLY;
|
||||||
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.FAILURE_BYTE;
|
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.FAILURE_BYTE;
|
||||||
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.SUCCESS_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.enums.YunKuaiChongDownlinkCmdEnum.LOGIN_ACK;
|
||||||
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.SYNC_TIME;
|
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.SYNC_TIME;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 云快充1.5.0登录认证应答
|
* 云快充1.5.0登录认证应答
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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 com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
@@ -23,7 +23,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static sanbing.jcpp.proto.gen.ProtocolProto.PricingModelFlag.*;
|
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计费模型请求应答
|
* 计费模型请求应答
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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 com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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 com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
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.YunKuaiChongDwonlinkMessage;
|
||||||
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
|
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 运营平台远程控制启机
|
* 云快充1.5.0 运营平台远程控制启机
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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 com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
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.YunKuaiChongDwonlinkMessage;
|
||||||
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
|
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 运营平台远程停机
|
* 云快充1.5.0 运营平台远程停机
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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 com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
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.YunKuaiChongUplinkMessage;
|
||||||
import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
|
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 计费模型应答
|
* 云快充1.5.0 计费模型应答
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
@@ -23,8 +23,8 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static sanbing.jcpp.proto.gen.ProtocolProto.PricingModelFlag.*;
|
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;
|
||||||
import static sanbing.jcpp.protocol.yunkuaichong.v150.enums.YunKuaiChongV150DownlinkCmdEnum.SET_PRICING;
|
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.SET_PRICING;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 云快充1.5.0 计费模型设置
|
* 云快充1.5.0 计费模型设置
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
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.FAILURE_BYTE;
|
||||||
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.SUCCESS_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 交易记录确认
|
* 云快充1.5.0 交易记录确认
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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 com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
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.FAILURE_BYTE;
|
||||||
import static sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongDwonlinkMessage.SUCCESS_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计费模型验证请求应答
|
* 云快充1.5.0计费模型验证请求应答
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球: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 com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
* 抖音关注:程序员三丙
|
* 抖音关注:程序员三丙
|
||||||
* 知识星球:https://t.zsxq.com/j9b21
|
* 知识星球:https://t.zsxq.com/j9b21
|
||||||
*/
|
*/
|
||||||
package sanbing.jcpp.protocol.yunkuaichong.v150.enums;
|
package sanbing.jcpp.protocol.yunkuaichong.enums;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -12,7 +12,7 @@ import lombok.Getter;
|
|||||||
*/
|
*/
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Getter
|
@Getter
|
||||||
public enum YunKuaiChongV150DownlinkCmdEnum {
|
public enum YunKuaiChongDownlinkCmdEnum {
|
||||||
|
|
||||||
LOGIN_ACK(0x02),
|
LOGIN_ACK(0x02),
|
||||||
|
|
||||||
@@ -30,9 +30,10 @@ public enum YunKuaiChongV150DownlinkCmdEnum {
|
|||||||
|
|
||||||
REMOTE_STOP_CHARGING(0x36),
|
REMOTE_STOP_CHARGING(0x36),
|
||||||
|
|
||||||
TRANSACTION_RECORD(0x40)
|
TRANSACTION_RECORD(0x40),
|
||||||
;
|
|
||||||
|
|
||||||
private int cmd;
|
REMOTE_PARALLEL_START_CHARGING(0xA4);
|
||||||
|
|
||||||
|
private final Integer cmd;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import sanbing.jcpp.infrastructure.util.annotation.ProtocolComponent;
|
import sanbing.jcpp.infrastructure.util.annotation.ProtocolComponent;
|
||||||
import sanbing.jcpp.protocol.ProtocolBootstrap;
|
import sanbing.jcpp.protocol.ProtocolBootstrap;
|
||||||
import sanbing.jcpp.protocol.ProtocolMessageProcessor;
|
import sanbing.jcpp.protocol.ProtocolMessageProcessor;
|
||||||
|
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongProtocolMessageProcessor;
|
||||||
|
|
||||||
import static sanbing.jcpp.protocol.yunkuaichong.v150.YunkuaichongV150ProtocolBootstrap.PROTOCOL_NAME;
|
import static sanbing.jcpp.protocol.yunkuaichong.v150.YunkuaichongV150ProtocolBootstrap.PROTOCOL_NAME;
|
||||||
|
|
||||||
@@ -38,7 +39,7 @@ public class YunkuaichongV150ProtocolBootstrap extends ProtocolBootstrap {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ProtocolMessageProcessor messageProcessor() {
|
protected ProtocolMessageProcessor messageProcessor() {
|
||||||
return new YunKuaiChongV15ProtocolMessageProcessor(forwarder, protocolContext);
|
return new YunKuaiChongProtocolMessageProcessor(forwarder, protocolContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 -> "未知错误代码";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user