From 5c2c718d347b58b4e3c2b96433d25b9060068990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BA=A2=E4=B8=AD?= <851474045@qq.com> Date: Tue, 5 Aug 2025 11:24:13 +0000 Subject: [PATCH] =?UTF-8?q?!15=20=E5=A2=9E=E5=8A=A00x92=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E5=92=8C0x91=E8=BF=9C=E7=A8=8B=E9=87=8D?= =?UTF-8?q?=E5=90=AF=E5=BA=94=E7=AD=94=20*=20Merge=20remote-tracking=20bra?= =?UTF-8?q?nch=20'refs/remotes/upstream/master'=20into=20maste=E2=80=A6=20?= =?UTF-8?q?*=200x92=E8=BF=9C=E7=A8=8B=E9=87=8D=E5=90=AF=E5=92=8C0x91?= =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E9=87=8D=E5=90=AF=E5=BA=94=E7=AD=94=20*=200x?= =?UTF-8?q?92=E8=BF=9C=E7=A8=8B=E9=87=8D=E5=90=AF=E5=92=8C0x91=E8=BF=9C?= =?UTF-8?q?=E7=A8=8B=E9=87=8D=E5=90=AF=E5=BA=94=E7=AD=94=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20*=200x92=E8=BF=9C=E7=A8=8B=E9=87=8D=E5=90=AF=E5=92=8C0x91?= =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E9=87=8D=E5=90=AF=E5=BA=94=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jcpp/app/adapter/TestController.java | 8 +++ .../jcpp/app/service/PileProtocolService.java | 12 ++++ .../impl/DefaultPileProtocolService.java | 31 ++++++++++ .../ProtocolUplinkConsumerService.java | 4 ++ .../src/main/proto/protocol.proto | 14 +++++ .../jcpp/protocol/domain/DownlinkCmdEnum.java | 2 + jcpp-protocol-yunkuaichong/READMD.md | 8 +++ .../enums/YunKuaiChongDownlinkCmdEnum.java | 4 +- .../cmd/YunKuaiChongV150RestartPileDLCmd.java | 49 ++++++++++++++++ ...unKuaiChongV150RestartPileResultULCmd.java | 58 +++++++++++++++++++ 10 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RestartPileDLCmd.java create mode 100644 jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RestartPileResultULCmd.java diff --git a/jcpp-app/src/main/java/sanbing/jcpp/app/adapter/TestController.java b/jcpp-app/src/main/java/sanbing/jcpp/app/adapter/TestController.java index ee25da2..3566350 100644 --- a/jcpp-app/src/main/java/sanbing/jcpp/app/adapter/TestController.java +++ b/jcpp-app/src/main/java/sanbing/jcpp/app/adapter/TestController.java @@ -33,6 +33,14 @@ public class TestController { return ResponseEntity.ok("success"); } + @GetMapping("/api/reStartCharge") + public ResponseEntity reStartCharge() { + + pileProtocolService.restartPile("20231212000010", 1); + + return ResponseEntity.ok("success"); + } + @GetMapping("/api/setPricing") public ResponseEntity setPricing() { diff --git a/jcpp-app/src/main/java/sanbing/jcpp/app/service/PileProtocolService.java b/jcpp-app/src/main/java/sanbing/jcpp/app/service/PileProtocolService.java index 9f37b12..6dc0562 100644 --- a/jcpp-app/src/main/java/sanbing/jcpp/app/service/PileProtocolService.java +++ b/jcpp-app/src/main/java/sanbing/jcpp/app/service/PileProtocolService.java @@ -74,6 +74,12 @@ public interface PileProtocolService { */ void startCharge(String pileCode, String gunCode, BigDecimal limitYuan, String orderNo); + + /** + * 重启充电 + */ + void restartPile(String pileCode, Integer type); + /** * 下发计费 */ @@ -94,6 +100,12 @@ public interface PileProtocolService { */ void onBmsCharingInfo(UplinkQueueMessage uplinkQueueMessage, Callback callback); + /** + * 远程重启反馈 + */ + void onRestartPileResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback); + + /** * 充电阶段BMS中止 */ diff --git a/jcpp-app/src/main/java/sanbing/jcpp/app/service/impl/DefaultPileProtocolService.java b/jcpp-app/src/main/java/sanbing/jcpp/app/service/impl/DefaultPileProtocolService.java index 56480b1..7f8e689 100644 --- a/jcpp-app/src/main/java/sanbing/jcpp/app/service/impl/DefaultPileProtocolService.java +++ b/jcpp-app/src/main/java/sanbing/jcpp/app/service/impl/DefaultPileProtocolService.java @@ -297,6 +297,28 @@ public class DefaultPileProtocolService implements PileProtocolService { downlinkCallService.sendDownlinkMessage(downlinkRequestMessageBuilder, pileCode); } + @Override + public void restartPile(String pileCode, Integer type) { + + UUID messageId = UUID.randomUUID(); + UUID requestId = UUID.randomUUID(); + + + DownlinkRequestMessage.Builder downlinkRequestMessageBuilder = DownlinkRequestMessage.newBuilder() + .setMessageIdMSB(messageId.getMostSignificantBits()) + .setMessageIdLSB(messageId.getLeastSignificantBits()) + .setPileCode(pileCode) + .setRequestIdMSB(requestId.getMostSignificantBits()) + .setRequestIdLSB(requestId.getLeastSignificantBits()) + .setDownlinkCmd(DownlinkCmdEnum.REMOTE_RE_START_CHARGING.name()) + .setRestartPileRequest(RestartPileRequest.newBuilder() + .setPileCode(pileCode) + .setType(type) + .build()); + + downlinkCallService.sendDownlinkMessage(downlinkRequestMessageBuilder, pileCode); + } + @Override public void setPricing(String pileCode, SetPricingRequest setPricingRequest) { UUID messageId = UUID.randomUUID(); @@ -347,6 +369,15 @@ public class DefaultPileProtocolService implements PileProtocolService { callback.onSuccess(); } + @Override + public void onRestartPileResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback) { + log.info("接收到充电桩重启结果反馈 {}", uplinkQueueMessage); + + // TODO 处理相关业务逻辑 + + callback.onSuccess(); + } + private static Period createPeriod(int sn, LocalTime beginTime, LocalTime endTime, PricingModelFlag flag) { Period period = new Period(); period.setSn(sn); diff --git a/jcpp-app/src/main/java/sanbing/jcpp/app/service/queue/consumer/ProtocolUplinkConsumerService.java b/jcpp-app/src/main/java/sanbing/jcpp/app/service/queue/consumer/ProtocolUplinkConsumerService.java index 0d89adb..3059105 100644 --- a/jcpp-app/src/main/java/sanbing/jcpp/app/service/queue/consumer/ProtocolUplinkConsumerService.java +++ b/jcpp-app/src/main/java/sanbing/jcpp/app/service/queue/consumer/ProtocolUplinkConsumerService.java @@ -208,6 +208,10 @@ public class ProtocolUplinkConsumerService extends AbstractConsumerService imple pileProtocolService.onBmsAbort(uplinkQueueMsg, callback); + } else if (uplinkQueueMsg.hasRestartPileResponse()) { + + pileProtocolService.onRestartPileResponse(uplinkQueueMsg, callback); + } else { callback.onSuccess(); diff --git a/jcpp-infrastructure-proto/src/main/proto/protocol.proto b/jcpp-infrastructure-proto/src/main/proto/protocol.proto index 050f83c..5d75192 100644 --- a/jcpp-infrastructure-proto/src/main/proto/protocol.proto +++ b/jcpp-infrastructure-proto/src/main/proto/protocol.proto @@ -70,6 +70,8 @@ message UplinkQueueMessage { BmsParamConfigReport bmsParamConfigReport = 33; BmsChargingInfoProto bmsChargingInfoProto = 34; BmsAbortProto bmsAbortProto = 35; + RestartPileResponse restartPileResponse = 36; + } message DownlinkRequestMessage { @@ -90,6 +92,7 @@ message DownlinkRequestMessage { RemoteStartChargingRequest remoteStartChargingRequest = 25; RemoteStopChargingRequest remoteStopChargingRequest = 26; TransactionRecordAck transactionRecordAck = 27; + RestartPileRequest restartPileRequest = 28; } message DownlinkResponseMessage { @@ -242,6 +245,12 @@ message RemoteStartChargingRequest { optional string additionalInfo = 20; } +message RestartPileRequest { + string pileCode = 4; + int32 type = 7; + +} + message RemoteStartChargingResponse { int64 ts = 1; string pileCode = 4; @@ -251,6 +260,11 @@ message RemoteStartChargingResponse { string failReason = 8; optional string additionalInfo = 20; } +message RestartPileResponse { + int64 ts = 1; + string pileCode = 4; + bool success = 7; +} message RemoteStopChargingRequest { string pileCode = 4; diff --git a/jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/domain/DownlinkCmdEnum.java b/jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/domain/DownlinkCmdEnum.java index ee41d6d..bde9707 100644 --- a/jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/domain/DownlinkCmdEnum.java +++ b/jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/domain/DownlinkCmdEnum.java @@ -26,4 +26,6 @@ public enum DownlinkCmdEnum { TRANSACTION_RECORD_ACK, REMOTE_PARALLEL_START_CHARGING, + + REMOTE_RE_START_CHARGING, } \ No newline at end of file diff --git a/jcpp-protocol-yunkuaichong/READMD.md b/jcpp-protocol-yunkuaichong/READMD.md index 64b721a..ac07bfb 100644 --- a/jcpp-protocol-yunkuaichong/READMD.md +++ b/jcpp-protocol-yunkuaichong/READMD.md @@ -75,3 +75,11 @@ --- #### 0x1D 充电阶段BMS中止 `68 20 00 18 00 1D 20 23 12 12 00 00 01 01 11 51 11 61 55 53 50 26 20 23 12 12 00 00 10 01 00 00 00 00 5a 23` + + +#### 0x91 远程重启应答 +`68 0C 00 11 00 91 20 23 12 12 00 00 10 01 03 F2` + +--- + + diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/enums/YunKuaiChongDownlinkCmdEnum.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/enums/YunKuaiChongDownlinkCmdEnum.java index 44a9f36..b85618b 100644 --- a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/enums/YunKuaiChongDownlinkCmdEnum.java +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/enums/YunKuaiChongDownlinkCmdEnum.java @@ -34,7 +34,9 @@ public enum YunKuaiChongDownlinkCmdEnum { TRANSACTION_RECORD(0x40), - REMOTE_PARALLEL_START_CHARGING(0xA4); + REMOTE_PARALLEL_START_CHARGING(0xA4), + + REMOTE_RE_START_CHARGING(0x92); private final Integer cmd; diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RestartPileDLCmd.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RestartPileDLCmd.java new file mode 100644 index 0000000..a28979d --- /dev/null +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RestartPileDLCmd.java @@ -0,0 +1,49 @@ +/** + * 开源代码,仅供学习和交流研究使用,商用请联系三丙 + * 微信:mohan_88888 + * 抖音:程序员三丙 + * 付费课程知识星球:https://t.zsxq.com/aKtXo + */ +package sanbing.jcpp.protocol.yunkuaichong.v150.cmd; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import lombok.extern.slf4j.Slf4j; +import sanbing.jcpp.proto.gen.ProtocolProto.RestartPileRequest; +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 static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.REMOTE_RE_START_CHARGING; + +/** + * 云快充1.5.0 运营平台远程重启充电桩 + */ +@Slf4j +@YunKuaiChongCmd(0x92) +public class YunKuaiChongV150RestartPileDLCmd extends YunKuaiChongDownlinkCmdExe { + + @Override + public void execute(TcpSession tcpSession, YunKuaiChongDwonlinkMessage yunKuaiChongDwonlinkMessage, ProtocolContext ctx) { + log.info("{} 云快充1.5.0运营平台远程重启充电桩", tcpSession); + + if (!yunKuaiChongDwonlinkMessage.getMsg().hasRestartPileRequest()) { + return; + } + + RestartPileRequest restartPileRequest = yunKuaiChongDwonlinkMessage.getMsg().getRestartPileRequest(); + String pileCode = restartPileRequest.getPileCode(); + int type = restartPileRequest.getType(); + ByteBuf msgBody = Unpooled.buffer(8); + // 桩编码 + msgBody.writeBytes(encodePileCode(pileCode)); + // 0x01:立即执行 0x02:空闲执行 + msgBody.writeInt(type); + encodeAndWriteFlush(REMOTE_RE_START_CHARGING, + msgBody, + tcpSession); + } + +} \ No newline at end of file diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RestartPileResultULCmd.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RestartPileResultULCmd.java new file mode 100644 index 0000000..4098fa1 --- /dev/null +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150RestartPileResultULCmd.java @@ -0,0 +1,58 @@ +/** + * 开源代码,仅供学习和交流研究使用,商用请联系三丙 + * 微信:mohan_88888 + * 抖音:程序员三丙 + * 付费课程知识星球:https://t.zsxq.com/aKtXo + */ +package sanbing.jcpp.protocol.yunkuaichong.v150.cmd; + +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.trace.TracerContextUtil; +import sanbing.jcpp.proto.gen.ProtocolProto.RestartPileResponse; +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.5.0 远程重启充电命令回复 + */ +@Slf4j +@YunKuaiChongCmd(0x91) +public class YunKuaiChongV150RestartPileResultULCmd extends YunKuaiChongUplinkCmdExe { + + @Override + public void execute(TcpSession tcpSession, YunKuaiChongUplinkMessage yunKuaiChongUplinkMessage, ProtocolContext ctx) { + log.info("{} 云快充1.5.0远程重启动充电命令回复", tcpSession); + ByteBuf byteBuf = Unpooled.wrappedBuffer(yunKuaiChongUplinkMessage.getMsgBody()); + + // 从Tracer总获取当前时间 + long ts = TracerContextUtil.getCurrentTracer().getTracerTs(); + + // 1.桩编号 + byte[] pileCodeBytes = new byte[7]; + byteBuf.readBytes(pileCodeBytes); + String pileCode = BCDUtil.toString(pileCodeBytes); + + // 2.命令执行结果 0x00失败 0x01成功 + boolean isSuccess = (byteBuf.readByte() == 0x01); + + RestartPileResponse restartPileResponse = RestartPileResponse.newBuilder() + .setTs(ts) + .setPileCode(pileCode) + .setSuccess(isSuccess) + .build(); + + // 转发到后端 + UplinkQueueMessage uplinkQueueMessage = uplinkMessageBuilder(pileCode, tcpSession, yunKuaiChongUplinkMessage) + .setRestartPileResponse(restartPileResponse) + .build(); + + tcpSession.getForwarder().sendMessage(uplinkQueueMessage); + } +} \ No newline at end of file