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 e012a74..2fe3d80 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 @@ -79,6 +79,11 @@ public interface PileProtocolService { */ void setPricing(String pileCode, SetPricingRequest setPricingRequest); + /** + * 充电桩与 BMS 充电错误上报 + */ + void onBmsChargingErrorProto(UplinkQueueMessage uplinkQueueMsg, 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 d8422db..6f3067d 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 @@ -314,6 +314,14 @@ public class DefaultPileProtocolService implements PileProtocolService { downlinkCallService.sendDownlinkMessage(downlinkRequestMessageBuilder, pileCode); } + @Override + public void onBmsChargingErrorProto(UplinkQueueMessage uplinkQueueMessage, Callback callback) { + log.info("充电桩与 BMS 充电错误上报 {}", uplinkQueueMessage); + + // TODO 处理相关业务逻辑 + + callback.onSuccess(); + } private static Period createPeriod(int sn, LocalTime beginTime, LocalTime endTime, PricingModelFlag flag) { Period period = new Period(); 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 38b6841..b56f70f 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 @@ -192,6 +192,10 @@ public class ProtocolUplinkConsumerService extends AbstractConsumerService imple pileProtocolService.onTransactionRecord(uplinkQueueMsg, callback); + } else if (uplinkQueueMsg.hasBmsChargingErrorProto()) { + + pileProtocolService.onBmsChargingErrorProto(uplinkQueueMsg, callback); + } else if (uplinkQueueMsg.hasBmsParamConfigReport()) { pileProtocolService.onBmsParamConfigReport(uplinkQueueMsg, callback); diff --git a/jcpp-infrastructure-proto/src/main/proto/protocol.proto b/jcpp-infrastructure-proto/src/main/proto/protocol.proto index c7b6348..3ef6652 100644 --- a/jcpp-infrastructure-proto/src/main/proto/protocol.proto +++ b/jcpp-infrastructure-proto/src/main/proto/protocol.proto @@ -66,6 +66,7 @@ message UplinkQueueMessage { RemoteStartChargingResponse remoteStartChargingResponse = 28; RemoteStopChargingResponse remoteStopChargingResponse = 29; TransactionRecord transactionRecord = 30; + BmsChargingErrorProto bmsChargingErrorProto = 31; BmsParamConfigReport bmsParamConfigReport = 33; } @@ -286,6 +287,14 @@ message TransactionRecord { optional string additionalInfo = 20; } +message BmsChargingErrorProto { + int64 ts = 1; + string pileCode = 4; + string gunCode = 5; + string tradeNo = 6; + optional string additionalInfo = 20; +} + message TransactionRecordAck { string tradeNo = 6; bool success = 7; diff --git a/jcpp-protocol-yunkuaichong/READMD.md b/jcpp-protocol-yunkuaichong/READMD.md index 9cab02e..78ca7ed 100644 --- a/jcpp-protocol-yunkuaichong/READMD.md +++ b/jcpp-protocol-yunkuaichong/READMD.md @@ -51,6 +51,11 @@ #### 下行交易就应答 `68 15 00 46 00 06 20 23 12 12 00 00 10 32 32 39 00 00 00 00 00 00 00 C6 2D ` +--- + +#### 充电桩与 BMS 充电错误报文 +`68 24 00 17 00 1B 32 01 02 00 00 00 00 11 15 11 16 15 55 35 02 06 20 23 12 12 00 00 10 01 00 00 00 00 00 00 00 00 79 00` + --- ### 7.4上行BMS参数配置 diff --git a/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150BmsChargingErrorULCmd.java b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150BmsChargingErrorULCmd.java new file mode 100644 index 0000000..0a53151 --- /dev/null +++ b/jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/cmd/YunKuaiChongV150BmsChargingErrorULCmd.java @@ -0,0 +1,143 @@ +/** + * 开源代码,仅供学习和交流研究使用,商用请联系三丙 + * 微信:mohan_88888 + * 抖音:程序员三丙 + * 付费课程知识星球:https://t.zsxq.com/aKtXo + */ +package sanbing.jcpp.protocol.yunkuaichong.v150.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.BmsChargingErrorProto; +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(0x1B) +public class YunKuaiChongV150BmsChargingErrorULCmd extends YunKuaiChongUplinkCmdExe { + + @Override + public void execute(TcpSession tcpSession, YunKuaiChongUplinkMessage yunKuaiChongUplinkMessage, ProtocolContext ctx) { + log.debug("{} 云快充1.5.0错误请求", tcpSession); + ByteBuf byteBuf = Unpooled.wrappedBuffer(yunKuaiChongUplinkMessage.getMsgBody()); + // 从Tracer总获取当前时间 + long ts = TracerContextUtil.getCurrentTracer().getTracerTs(); + + ObjectNode additionalInfo = JacksonUtil.newObjectNode(); + byte[] tradeNoBytes = new byte[16]; + byteBuf.readBytes(tradeNoBytes); + //1 交易流水号 + String tradeNo = BCDUtil.toString(tradeNoBytes); + + byte[] pileCodeBytes = new byte[7]; + byteBuf.readBytes(pileCodeBytes); + //2 桩编号 + String pileCode = BCDUtil.toString(pileCodeBytes); + //3 枪号 + byte[] gunCodeBytes = new byte[1]; + byteBuf.readBytes(gunCodeBytes); + String gunCode = BCDUtil.toString(gunCodeBytes); + //<00>:=正常;<01>:=超时;<10>: =不可信状态 + //4 接收 SPN2560=0x00 的充电机辨识报文超时 2位 + //5 接收 SPN2560=0xAA 的充电机辨识报文超时 2位 + //6 预留位 4位 + byte chargerByte = byteBuf.readByte(); + int time00 = chargerByte & 0x03; + int timeAA = (chargerByte & 0x0C) >>> 2; + additionalInfo.put("接收 SPN2560=0x00 的充电机辨识报文超时", getErrorDescriptions(time00)); + additionalInfo.put("接收 SPN2560=0xAA 的充电机辨识报文超时", getErrorDescriptions(timeAA)); + //7 接收充电机的时间同步和充电机最大输出能力报文超时 2位 + //8 接收充电机完成充电准备报文超时 2位 + //9 预留位 4位 + byte chargerByte2 = byteBuf.readByte(); + int timeSyn = chargerByte2 & 0x03; + int timeFinish = (chargerByte2 & 0x0C) >>> 2; + additionalInfo.put("接收充电机的时间同步和充电机最大输出能力报文超时", getErrorDescriptions(timeSyn)); + additionalInfo.put("接收充电机完成充电准备报文超时", getErrorDescriptions(timeFinish)); + //10 接收充电机充电状态报文超时 2位 + //11 接收充电机中止充电报文超时 2位 + //12 预留位 4位 + byte chargerByte3 = byteBuf.readByte(); + int timeStatus = chargerByte3 & 0x03; + int timeEnd = (chargerByte3 & 0x0C) >>> 2; + additionalInfo.put("接收充电机充电状态报文超时", getErrorDescriptions(timeStatus)); + additionalInfo.put("接收充电机中止充电报文超时", getErrorDescriptions(timeEnd)); + //13 接收充电机充电统计报文超时 2位 + //14 BMS 其他 6位 + byte chargerByte4 = byteBuf.readByte(); + int timeStatistics = chargerByte4 & 0x03; + additionalInfo.put("接收充电机充电统计报文超时", getErrorDescriptions(timeStatistics)); + //15 接收 BMS 和车辆的辨识报文超时 2位 + //16 预留位 6位 + byte bmsByte = byteBuf.readByte(); + int timeBms = bmsByte & 0x03; + additionalInfo.put("接收 BMS 和车辆的辨识报文超时", getErrorDescriptions(timeBms)); + //17 接收电池充电参数报文超时 2位 + //18 接收 BMS 完成充电准备报文超时 2位 + //19 预留位 4位 + byte bmsByte2 = byteBuf.readByte(); + int timeBmsParam = bmsByte2 & 0x03; + int timeBmsEnd = (bmsByte2 & 0x0C) >>> 2; + additionalInfo.put("接收电池充电参数报文超时", getErrorDescriptions(timeBmsParam)); + additionalInfo.put("接收 BMS 完成充电准备报文超时", getErrorDescriptions(timeBmsEnd)); + //20 接收电池充电总状态报文超时 2位 + //21 接收电池充电要求报文超时 2位 + //22 接收 BMS 中止充电报文超时 2位 + //23 预留位 2位 + byte batteryByte = byteBuf.readByte(); + int timeBatteryStatus = batteryByte & 0x03; + int timeBatteryRequest = (batteryByte & 0x0C) >>> 2; + int timeBatteryEnd = (batteryByte & 0x30) >>> 4; + additionalInfo.put("接收电池充电总状态报文超时", getErrorDescriptions(timeBatteryStatus)); + additionalInfo.put("接收电池充电要求报文超时", getErrorDescriptions(timeBatteryRequest)); + additionalInfo.put("接收 BMS 中止充电报文超时", getErrorDescriptions(timeBatteryEnd)); + //24 接收 BMS 充电统计报文超时 2位 + //25 充电机其他 6位 + byte bmsByte3 = byteBuf.readByte(); + int timeBmsTotal = bmsByte3 & 0x03; + additionalInfo.put("接收 BMS 充电统计报文超时", getErrorDescriptions(timeBmsTotal)); + + tcpSession.addPileCode(pileCode); + + // 注册前置会话 + ctx.getProtocolSessionRegistryProvider().register(tcpSession); + + // 转发到后端 + BmsChargingErrorProto bmsChargingErrorProto = BmsChargingErrorProto.newBuilder() + .setTs(ts) + .setPileCode(pileCode) + .setTradeNo(tradeNo) + .setGunCode(gunCode) + .setAdditionalInfo(additionalInfo.toString()) + .build(); + UplinkQueueMessage uplinkQueueMessage = uplinkMessageBuilder(bmsChargingErrorProto.getPileCode(), tcpSession, yunKuaiChongUplinkMessage) + .setBmsChargingErrorProto(bmsChargingErrorProto) + .build(); + tcpSession.getForwarder().sendMessage(uplinkQueueMessage); + } + + public static String getErrorDescriptions(int code) { + //<00>:=正常;<01>:=超时;<10>: =不可信状态 + if (code == 0) { + return "正常"; + } else if (code == 1) { + return "超时"; + } else if (code == 2) { + return "不可信状态"; + } + return "未知"; + } + +}