云快充离线卡协议相关矫正

This commit is contained in:
三丙
2025-08-25 11:44:58 +08:00
parent 6a8157e179
commit 1019f6e1c9
10 changed files with 46 additions and 51 deletions

View File

@@ -6,28 +6,18 @@
*/ */
package sanbing.jcpp.app.adapter; package sanbing.jcpp.app.adapter;
import java.math.BigDecimal; import com.google.common.collect.Lists;
import java.util.HashMap; import jakarta.annotation.Resource;
import java.util.List;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.google.common.collect.Lists;
import jakarta.annotation.Resource;
import sanbing.jcpp.app.service.PileProtocolService; import sanbing.jcpp.app.service.PileProtocolService;
import sanbing.jcpp.proto.gen.ProtocolProto; import sanbing.jcpp.proto.gen.ProtocolProto;
import sanbing.jcpp.proto.gen.ProtocolProto.CardInfo; import sanbing.jcpp.proto.gen.ProtocolProto.*;
import sanbing.jcpp.proto.gen.ProtocolProto.FlagPriceProto;
import sanbing.jcpp.proto.gen.ProtocolProto.OfflineCardSyncRequest; import java.math.BigDecimal;
import sanbing.jcpp.proto.gen.ProtocolProto.PeriodProto; import java.util.HashMap;
import sanbing.jcpp.proto.gen.ProtocolProto.PricingModelFlag; import java.util.List;
import sanbing.jcpp.proto.gen.ProtocolProto.PricingModelProto;
import sanbing.jcpp.proto.gen.ProtocolProto.PricingModelRule;
import sanbing.jcpp.proto.gen.ProtocolProto.PricingModelType;
import sanbing.jcpp.proto.gen.ProtocolProto.SetPricingRequest;
/** /**
* @author baigod * @author baigod
@@ -186,10 +176,10 @@ public class TestController {
return ResponseEntity.ok("success"); return ResponseEntity.ok("success");
} }
@GetMapping("/api/limitUpdateRequest") @GetMapping("/api/offlineCardBalanceUpdateRequest")
public ResponseEntity<String> limitUpdateRequest() { public ResponseEntity<String> offlineCardBalanceUpdateRequest() {
pileProtocolService.limitUpdateRequest(ProtocolProto.LimitUpdateRequest.newBuilder() pileProtocolService.offlineCardBalanceUpdateRequest(OfflineCardBalanceUpdateRequest.newBuilder()
.setCardNo("1000000000123456") .setCardNo("1000000000123456")
.setPileCode("20231212000010") .setPileCode("20231212000010")
.setGunCode("01") .setGunCode("01")

View File

@@ -8,6 +8,8 @@ package sanbing.jcpp.app.service;
import sanbing.jcpp.infrastructure.queue.Callback; import sanbing.jcpp.infrastructure.queue.Callback;
import sanbing.jcpp.proto.gen.ProtocolProto; import sanbing.jcpp.proto.gen.ProtocolProto;
import sanbing.jcpp.proto.gen.ProtocolProto.OfflineCardBalanceUpdateRequest;
import sanbing.jcpp.proto.gen.ProtocolProto.OfflineCardSyncRequest;
import sanbing.jcpp.proto.gen.ProtocolProto.SetPricingRequest; import sanbing.jcpp.proto.gen.ProtocolProto.SetPricingRequest;
import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage; import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage;
@@ -139,17 +141,17 @@ public interface PileProtocolService {
/** /**
* 远程账户余额更新 * 远程账户余额更新
*/ */
void limitUpdateRequest(ProtocolProto.LimitUpdateRequest request); void offlineCardBalanceUpdateRequest(OfflineCardBalanceUpdateRequest request);
/** /**
* 远程账户余额更新应答 * 远程账户余额更新应答
*/ */
void onLimitUpdateResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback); void onOfflineCardBalanceUpdateResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback);
/** /**
* 离线卡数据同步 * 离线卡数据同步
*/ */
void offlineCardSyncRequest(ProtocolProto.OfflineCardSyncRequest request); void offlineCardSyncRequest(OfflineCardSyncRequest request);
/** /**
* 离线卡数据同步应答 * 离线卡数据同步应答

View File

@@ -455,7 +455,7 @@ public class DefaultPileProtocolService implements PileProtocolService {
@Override @Override
public void onLimitUpdateResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback) { public void onOfflineCardBalanceUpdateResponse(UplinkQueueMessage uplinkQueueMessage, Callback callback) {
log.info("接收到充电桩远程账户余额更新应答 {}", uplinkQueueMessage); log.info("接收到充电桩远程账户余额更新应答 {}", uplinkQueueMessage);
// TODO 处理相关业务逻辑 // TODO 处理相关业务逻辑
@@ -464,7 +464,7 @@ public class DefaultPileProtocolService implements PileProtocolService {
} }
@Override @Override
public void limitUpdateRequest(LimitUpdateRequest request) { public void offlineCardBalanceUpdateRequest(OfflineCardBalanceUpdateRequest request) {
UUID messageId = UUID.randomUUID(); UUID messageId = UUID.randomUUID();
UUID requestId = UUID.randomUUID(); UUID requestId = UUID.randomUUID();
@@ -474,8 +474,8 @@ public class DefaultPileProtocolService implements PileProtocolService {
.setPileCode(request.getPileCode()) .setPileCode(request.getPileCode())
.setRequestIdMSB(requestId.getMostSignificantBits()) .setRequestIdMSB(requestId.getMostSignificantBits())
.setRequestIdLSB(requestId.getLeastSignificantBits()) .setRequestIdLSB(requestId.getLeastSignificantBits())
.setDownlinkCmd(DownlinkCmdEnum.LIMIT_UPDATE_REQUEST.name()) .setDownlinkCmd(DownlinkCmdEnum.OFFLINE_CARD_BALANCE_UPDATE_REQUEST.name())
.setLimitUpdateRequest(request); .setOfflineCardBalanceUpdateRequest(request);
downlinkCallService.sendDownlinkMessage(downlinkRequestMessageBuilder,request.getPileCode()); downlinkCallService.sendDownlinkMessage(downlinkRequestMessageBuilder,request.getPileCode());
} }

View File

@@ -224,9 +224,9 @@ public class ProtocolUplinkConsumerService extends AbstractConsumerService imple
pileProtocolService.postLockStatus(uplinkQueueMsg, callback); pileProtocolService.postLockStatus(uplinkQueueMsg, callback);
} else if (uplinkQueueMsg.hasLimitUpdateResponse()) { } else if (uplinkQueueMsg.hasOfflineCardBalanceUpdateResponse()) {
pileProtocolService.onLimitUpdateResponse(uplinkQueueMsg, callback); pileProtocolService.onOfflineCardBalanceUpdateResponse(uplinkQueueMsg, callback);
} else if (uplinkQueueMsg.hasOfflineCardSyncResponse()) { } else if (uplinkQueueMsg.hasOfflineCardSyncResponse()) {

View File

@@ -74,7 +74,7 @@ message UplinkQueueMessage {
BmsHandshakeProto bmsHandshakeProto = 37; BmsHandshakeProto bmsHandshakeProto = 37;
OtaResponse otaResponse = 38; OtaResponse otaResponse = 38;
GroundLockStatusProto groundLockStatusProto = 39; GroundLockStatusProto groundLockStatusProto = 39;
LimitUpdateResponse limitUpdateResponse = 40; OfflineCardBalanceUpdateResponse offlineCardBalanceUpdateResponse = 40;
OfflineCardSyncResponse offlineCardSyncResponse = 41; OfflineCardSyncResponse offlineCardSyncResponse = 41;
} }
@@ -99,7 +99,7 @@ message DownlinkRequestMessage {
TransactionRecordResponse transactionRecordResponse = 27; TransactionRecordResponse transactionRecordResponse = 27;
RestartPileRequest restartPileRequest = 28; RestartPileRequest restartPileRequest = 28;
OtaRequest otaRequest = 29; OtaRequest otaRequest = 29;
LimitUpdateRequest limitUpdateRequest = 30; OfflineCardBalanceUpdateRequest offlineCardBalanceUpdateRequest = 30;
OfflineCardSyncRequest offlineCardSyncRequest = 31; OfflineCardSyncRequest offlineCardSyncRequest = 31;
} }
@@ -439,14 +439,14 @@ message GroundLockStatusProto {
optional string additionalInfo = 20; // 附加信息 optional string additionalInfo = 20; // 附加信息
} }
message LimitUpdateRequest { message OfflineCardBalanceUpdateRequest {
string pileCode = 1; // 充电桩编码 string pileCode = 1; // 充电桩编码
string gunCode = 2; // 枪编号 string gunCode = 2; // 枪编号
string cardNo = 3; // 物理卡号 string cardNo = 3; // 物理卡号
string limitYuan = 4; // 余额 string limitYuan = 4; // 余额
} }
message LimitUpdateResponse { message OfflineCardBalanceUpdateResponse {
string pileCode = 1; // 充电桩编码 string pileCode = 1; // 充电桩编码
string cardNo = 2; // 物理卡号 string cardNo = 2; // 物理卡号
bool success = 3; bool success = 3;

View File

@@ -31,7 +31,7 @@ public enum DownlinkCmdEnum {
OTA_REQUEST, OTA_REQUEST,
LIMIT_UPDATE_REQUEST, OFFLINE_CARD_BALANCE_UPDATE_REQUEST,
OFFLINE_CARD_SYNC_REQUEST OFFLINE_CARD_SYNC_REQUEST
} }

View File

@@ -101,13 +101,15 @@
#### 0x61 地锁数据上送 #### 0x61 地锁数据上送
`68 14 00 01 00 61 20 23 12 12 00 00 10 01 00 00 00 00 00 00 00 00 3D 6D` `68 14 00 01 00 61 20 23 12 12 00 00 10 01 00 00 00 00 00 00 00 00 3D 6D`
---
#### 0x42 远程账户余额更新 #### 0x42 远程账户余额更新
`68 18 04 00 00 42 20 23 12 12 00 00 10 01 30 31 00 00 00 00 00 00 a0 86 01 00 4e ac` `68 18 04 00 00 42 20 23 12 12 00 00 10 01 30 31 00 00 00 00 00 00 a0 86 01 00 4e ac`
#### 0x41 远程账户余额更新应答 #### 0x41 远程账户余额更新应答
`68 14 19 00 00 41 20 23 12 12 00 00 10 10 00 00 00 00 12 34 56 00 bc 16` `68 14 19 00 00 41 20 23 12 12 00 00 10 10 00 00 00 00 12 34 56 00 bc 16`
#### 0x44 离线卡数据同步 #### 0x44 离线卡数据同步
`68 3f 02 00 00 44 20 23 12 12 00 00 10 03 00 00 00 10 00 00 00 00 12 34 56 10 00 00 00 00 12 34 56 10 00 00 00 00 12 34 57 10 00 00 00 00 12 34 57 10 00 00 00 00 12 34 58 10 00 00 00 00 12 34 58 ba 94` `68 3f 02 00 00 44 20 23 12 12 00 00 10 03 00 00 00 10 00 00 00 00 12 34 56 10 00 00 00 00 12 34 56 10 00 00 00 00 12 34 57 10 00 00 00 00 12 34 57 10 00 00 00 00 12 34 58 10 00 00 00 00 12 34 58 ba 94`

View File

@@ -40,7 +40,7 @@ public enum YunKuaiChongDownlinkCmdEnum {
OTA_REQUEST(0x94), OTA_REQUEST(0x94),
LIMIT_UPDATE_REQUEST(0x42), OFFLINE_CARD_BALANCE_UPDATE_REQUEST(0x42),
OFFLINE_CARD_SYNC_REQUEST(0x44), OFFLINE_CARD_SYNC_REQUEST(0x44),

View File

@@ -6,21 +6,21 @@
*/ */
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd; package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.LIMIT_UPDATE_REQUEST;
import java.math.BigDecimal;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import sanbing.jcpp.infrastructure.util.codec.BCDUtil; import sanbing.jcpp.infrastructure.util.codec.BCDUtil;
import sanbing.jcpp.proto.gen.ProtocolProto; import sanbing.jcpp.proto.gen.ProtocolProto.OfflineCardBalanceUpdateRequest;
import sanbing.jcpp.protocol.ProtocolContext; import sanbing.jcpp.protocol.ProtocolContext;
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.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 java.math.BigDecimal;
import static sanbing.jcpp.protocol.yunkuaichong.enums.YunKuaiChongDownlinkCmdEnum.OFFLINE_CARD_BALANCE_UPDATE_REQUEST;
/** /**
* 云快充1.5.0 远程账户余额更新 * 云快充1.5.0 远程账户余额更新
@@ -29,26 +29,26 @@ import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
*/ */
@Slf4j @Slf4j
@YunKuaiChongCmd(0x42) @YunKuaiChongCmd(0x42)
public class YunKuaiChongV150LimitUpdateRequestDLCmd extends YunKuaiChongDownlinkCmdExe { public class YunKuaiChongV150OfflineCardBalanceUpdateRequestDLCmd extends YunKuaiChongDownlinkCmdExe {
@Override @Override
public void execute(TcpSession tcpSession, YunKuaiChongDwonlinkMessage message, ProtocolContext ctx) { public void execute(TcpSession tcpSession, YunKuaiChongDwonlinkMessage message, ProtocolContext ctx) {
log.info("{} 云快充1.5.0 远程账户余额更新", tcpSession); log.info("{} 云快充1.5.0 远程账户余额更新", tcpSession);
if (!message.getMsg().hasLimitUpdateRequest()) { if (!message.getMsg().hasOfflineCardBalanceUpdateRequest()) {
log.error("云快充1.5.0 远程账户余额更新消息体为空"); log.error("云快充1.5.0 远程账户余额更新消息体为空");
return; return;
} }
// 初始化 buf // 初始化 buf
ByteBuf msgBody = Unpooled.buffer(20); ByteBuf msgBody = Unpooled.buffer(20);
ProtocolProto.LimitUpdateRequest request = message.getMsg().getLimitUpdateRequest(); OfflineCardBalanceUpdateRequest request = message.getMsg().getOfflineCardBalanceUpdateRequest();
msgBody.writeBytes(encodePileCode(request.getPileCode())); msgBody.writeBytes(encodePileCode(request.getPileCode()));
msgBody.writeBytes(encodeGunCode(request.getGunCode())); msgBody.writeBytes(encodeGunCode(request.getGunCode()));
msgBody.writeBytes(BCDUtil.toBytes(request.getCardNo())); msgBody.writeBytes(BCDUtil.toBytes(request.getCardNo()));
msgBody.writeIntLE(new BigDecimal(request.getLimitYuan()).movePointRight(2).intValue()); msgBody.writeIntLE(new BigDecimal(request.getLimitYuan()).movePointRight(2).intValue());
super.encodeAndWriteFlush(LIMIT_UPDATE_REQUEST, msgBody, tcpSession); super.encodeAndWriteFlush(OFFLINE_CARD_BALANCE_UPDATE_REQUEST, msgBody, tcpSession);
} }
} }

View File

@@ -6,20 +6,21 @@
*/ */
package sanbing.jcpp.protocol.yunkuaichong.v150.cmd; package sanbing.jcpp.protocol.yunkuaichong.v150.cmd;
import java.util.Map;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import sanbing.jcpp.infrastructure.util.codec.BCDUtil; import sanbing.jcpp.infrastructure.util.codec.BCDUtil;
import sanbing.jcpp.proto.gen.ProtocolProto; import sanbing.jcpp.proto.gen.ProtocolProto.OfflineCardBalanceUpdateResponse;
import sanbing.jcpp.proto.gen.ProtocolProto.UplinkQueueMessage;
import sanbing.jcpp.protocol.ProtocolContext; import sanbing.jcpp.protocol.ProtocolContext;
import sanbing.jcpp.protocol.listener.tcp.TcpSession; import sanbing.jcpp.protocol.listener.tcp.TcpSession;
import sanbing.jcpp.protocol.yunkuaichong.YunKuaiChongUplinkCmdExe; 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 java.util.Map;
/** /**
* 云快充1.5.0 余额更新应答 * 云快充1.5.0 余额更新应答
@@ -28,7 +29,7 @@ import sanbing.jcpp.protocol.yunkuaichong.annotation.YunKuaiChongCmd;
*/ */
@Slf4j @Slf4j
@YunKuaiChongCmd(0x41) @YunKuaiChongCmd(0x41)
public class YunKuaiChongV150LimitUpdateResponseULCmd extends YunKuaiChongUplinkCmdExe { public class YunKuaiChongV150OfflineCardBalanceUpdateResponseULCmd extends YunKuaiChongUplinkCmdExe {
private static final Map<Byte, String> UPDATE_RESULT; private static final Map<Byte, String> UPDATE_RESULT;
@@ -63,8 +64,8 @@ public class YunKuaiChongV150LimitUpdateResponseULCmd extends YunKuaiChongUplink
// 修改结果 0x00-修改成功 0x01-设备编号错误 0x02-卡号错误 // 修改结果 0x00-修改成功 0x01-设备编号错误 0x02-卡号错误
byte updateResult = byteBuf.readByte(); byte updateResult = byteBuf.readByte();
ProtocolProto.UplinkQueueMessage queueMessage = uplinkMessageBuilder(pileCode, tcpSession, message) UplinkQueueMessage queueMessage = uplinkMessageBuilder(pileCode, tcpSession, message)
.setLimitUpdateResponse(ProtocolProto.LimitUpdateResponse.newBuilder() .setOfflineCardBalanceUpdateResponse(OfflineCardBalanceUpdateResponse.newBuilder()
.setPileCode(pileCode) .setPileCode(pileCode)
.setCardNo(cardNo) .setCardNo(cardNo)
.setSuccess(updateResult == 0x00) .setSuccess(updateResult == 0x00)