!9 充电桩与 BMS 充电错误报文更新

* 测试用例修改
* Merge remote-tracking branch 'refs/remotes/upstream/master' into feat_15bmserror
* 充电桩与 BMS 充电错误报文更新
* 充电桩与 BMS 充电错误报文更新
* 充电桩与 BMS 充电错误报文更新
This commit is contained in:
Norman
2025-08-01 06:36:31 +00:00
committed by 三丙
parent f28aeee87c
commit 975d9223ea
6 changed files with 174 additions and 0 deletions

View File

@@ -79,6 +79,11 @@ public interface PileProtocolService {
*/
void setPricing(String pileCode, SetPricingRequest setPricingRequest);
/**
* 充电桩与 BMS 充电错误上报
*/
void onBmsChargingErrorProto(UplinkQueueMessage uplinkQueueMsg, Callback callback);
/**
* 充电桩与 BMS 参数配置阶段报文
*/

View File

@@ -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();

View File

@@ -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);

View File

@@ -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;

View File

@@ -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参数配置

View File

@@ -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 "未知";
}
}