← 返回版本与方案索引

桩数据采集协议设计(0x68 上行采集链路 · as-built 与桩兼容性)

定位:本页把「桩→平台数据采集」链路在 server-cdz(module/pile,M3 桩协议网关)的实现事实收拢为设计口径,并给出与桩(厂商/固件/存量)的兼容边界——是 M3 后续接线(D1-2 后置项)、真实桩联调(D1-3)、新桩企/新固件接入评审的共同参考。

分工:协议帧权威 = [[detailed-design/pile-detailed-design]](§一 帧 / §四 指令 / §八 时序 / §十 兼容红线);消息侧权威 = [[detailed-design/mq-message-contracts]](U/D 队列);本页只讲采集链路组成、每帧落到哪个业务、兼容开关与残余风险,口径与编号沿用前两者(R-1~R-5 / U1~U6 / D1~D7 / E-8 / E-13 等编号原样引用)。

代码基线:server-cdz com.gridvo.cdz.module.pile.*(下文代码引用即此前缀,行号为当前实现);版本基线 = 云快充 2.0(0x68)帧型(非 1.x 68...16+XOR 型,同 pile-detailed-design §「版本基线声明」)。

一、范围界定:本仓库的「采集协议」是什么

  1. 无独立「采集协议」文档/模块:仓库内"采集"的落点即 0x68 上行链路——桩主动上报(01 登录 / 03 心跳 / 13 实时监测 / 19 充电结束 / 33·35 回复 / 3B 交易记录)+ 平台应答(02/04/40)+ 采集数据落库/订单回联/告警消费。
  2. 采集模式 = 桩主动周期上报,无平台轮询:下行 0x12「读取实时监测数据」登记为未接线静默丢弃(PileCommand.java:91-92);平台读取通道 = 桩按 10s 级主动推 13(pile-detailed-design §八 ④)。
  3. 码空间口径:PileCommand 按 legacy Message.java 常量全量登记 53 码(含平台应答码与占位,PileCommand.java:8-23);pile-detailed-design §四「47 指令总表」为合并口径(行内合并 15/17/1B/1D/21、23/25 等 + 应答码 02/04/06/0A/40 未单列)——两口径差异在枚举 javadoc 标注,注册表 53 码为新平台协议码空间真源。
  4. 实现态四档(PileDisposition):CORE 12 条(上行 7 + 下行 5,负载 DTO+编解码已实现)/ ACK_LATER(接线后置,含平台应答码)/ SWALLOW_NOOP(23/25 吞报文)/ DISCARD_SILENT(未接线 25 条(合并口径,含 0x12)静默丢弃 + 按码计数埋点 = 固件越界探测器)。

二、采集链路与数据流(as-built)

2.1 协议栈与 Pipeline

Netty TCP,cdz.pile.* 全参数 @ConfigurationProperties(端口默认 9998,F-5 修复落点,PileNettyServer.java:26-33):

IdleStateHandler(readerIdleSeconds=60, 0, 0)
  → PileReadIdleHandler(READER_IDLE → 断连置离线)
  → PileFrameDecoder(PileHexFramer 拆包 + CRC 裁决 R-2/R-3 + R-1 补丁)
  → PileServerHandler(状态机 + 指令分发)
  出站 PileFrameEncoder(组帧落线,任意位置注册即可)

2.2 处理流水与消费方

桩 TCP → 拆包/CRC 裁决 → 状态机(UNREGISTERED --01 登录成功--> ONLINE;60s 读空闲/断开/异常 → OFFLINE;
                           重复登录幂等;无登出指令,"登出"= TCP 断开)
  → 按 PileCommandRegistry 分发(CORE 解码负载;23/25 吞;ACK_LATER/DISCARD 丢弃计数)
  → 事件化(PileSessionListener)→ PileGatewayEvents 转四类消费方:
     ① PileOnlineStateService       is_online/update_time 定向更新 + 02 登录应答(档案命中 00/未命中 01,未命中仍注册=宽容)
     ② PileRealtimeStateService     13 → connector「遥测允许列」写回 + 枪四态→设备 7 态内存快照
     ③ OrderPileService             33/35/19/3B → 订单状态机推进;13 → 充电会话遥测快照(C 端 realtime 3s 轮询直读)
     ④ PileGatewayAlertSink         monitor 告警引擎(PileAlertEngineImpl;上线/心跳/13 遥测/离线四事件)

三、采集指令与负载规范

3.1 上行采集指令(7 条 CORE,表驱动注册)

码指令Data 要点落点(server-cdz)MQ 批次后置(mq-contracts)
01登录认证桩号 7B BCD + 桩类型(0直流/1交流) + 枪数 + 协议版本×10 + 程序版本 8B ASCII + 网络类型 + SIM BCD(20 位) + 运营商(固定 30B,LoginPayload)handleLogin → bindPileNo → onOnline(02 应答下发)登录 RPC(02 直发,无上行队列)
03心跳桩号 + 枪号 1B + 枪状态 1B(仅 00 正常/01 故障,共 9B;四态在 13 帧勿混)handleHeartbeat(续约 + 04 应答)CHARGING_PILE_HEART_BEAT_QUEUE(U1)
13实时监测(主采集)16B 流水号 + 桩号[16..23) + 60B 负载(§四);多枪批量帧由 R-1 拆成多条独立 13 帧onRealtime → ①遥测写回 ②会话快照 ③告警CHARGING_PILE_REAL_TIME_MONITOR_DATA_QUEUE(U2)
19充电结束BMS SOC/电压/温度 + 累计时间 + 输出能量 + 充电机编号onChargeEnd → OrderPileService(IN_PROGRESS→BILLING)CHARGING_PILE_REMOTE_STOP_CHARGING_QUEUE(U3)
33远程启机回复16B 流水号 + 桩号[16..23) + 枪号 + 结果(00败/01成) + 原因(00无/01设备不匹配/02枪已充电/03故障/04离线/05未插枪);未插枪 60s 内可补送成功(E-13)onRemoteStartReply → OrderPileService(PENDING→IN_PROGRESS/START_FAILED;PENDING 不因 33 失败立即关闭)CHARGING_PILE_REMOTE_START_COMMAND_QUEUE(U4)
35远程停机回复桩号开头 + 枪号 + 结果(00败/01成) + 原因(00无/01设备不匹配/02枪未充电/03其他)(无 16B 流水号,共 10B)onRemoteStopReply → OrderPileService(IN_PROGRESS→BILLING)CHARGING_PILE_REMOTE_SHUTDOWN_QUEUE(U5)
3B交易记录16B 流水号 + 四费率×单价/电量/计损/金额 + 电表起止 + VIN + 交易标识 + 停止原因onTransactionRecord → OrderPileService(计量登记/对账参照,桩报总额不直入结算)→ 40 回执TRANSACTION_RECORDS_QUEUE(U6)

3.2 平台应答与下行(已接线)

方向码内容实现
↓02 登录应答Data=桩号 7B + 结果(00 成功/01 失败);serial 回显登录帧(E-8)PileGatewayEvents.onOnline(writeAck 即时下发;未命中设备档案 01 但会话仍注册=宽容策略,生产加固待 D1-3)
↓04 心跳应答Data=桩号 + 枪号回显 + heartbeatResp 恒 00onHeartbeat
↓40 交易确认Data=16B 流水号 echo + 00 受理/01 非法账单onTransactionRecord(受理与否由订单桥返回;无订单桥按受理回执避免桩重传)
↓34 远程启机桩号 + 16B 流水号 + 逻辑卡号 8B + 物理卡号 8B + 余额(分 4B 小端)OrderPileService.startCharge(MQ D1 等价动作,MQ 批次后置)
↓36 远程停机桩号 + 枪号OrderPileService.stopCharge(MQ D2 等价动作)
↓56/58/92 校时/计费模型设置/远程重启codec 就绪(TimeSync/BillingModelSet/RemoteRestart payload)下发入口 D1-2 后置(远程操作页接线;MQ D4/D3/D5)

下行组帧要求 Data 已含 7B BCD 桩号前缀(PileFrameCodec.java:23 注释);应答帧 serial 一律回显当前上行帧(E-8),即时下发、不参与 idle 重发语义(PileGatewayEvents.java:294-312);下行写失败走 SessionRegistry 退避重试(F-2),设备离线返回 Optional 由业务降级(F-1)。

四、采集字段换算与状态派生

4.1 13 帧 60B 负载(RealTimeMonitorPayload.java)

字段换算备注
transactionSerialNo16B 流水号(32 位 hex;全 0 = 未交易哨兵)会话回联键
gunState00 离线 / 01 故障 / 02 空闲 / 03 充电与心跳两态语义不同
outputVoltage / outputCurrent原始 LE ÷10(0.1V / 0.1A)
枪线温度 / 电池最高温度原始 −50 ℃
SOC原值 0-100交流桩恒 0
累计/剩余充电时间LE 2B,单位 min
chargeDegree / lossChargeDegree / chargedAmountLE 4B ÷10⁴(kWh / 元)未设计损比例时计损度数=充电度数
hardwareFailureLE 2B 13bit 位图:bit1 急停 / bit2 无整流模块 / bit3 出风口过热 / bit4 交流防雷 / bit5 DC20 断连 / bit6 绝缘检测断连 / bit7 电度表断连 / bit8 读卡器断连 / bit9 RC10 断连 / bit10 风扇调速板故障 / bit11 直流熔断器故障 / bit12 高压接触器故障 / bit13 门打开(1=故障)failureBit(n) 便捷断言

4.2 状态派生与落库红线

五、与桩的兼容性

5.1 兼容对象与接入现状

5.2 固件怪癖兼容机制(沿用 pile-detailed-design §十 编号 R-1~R-5)

编号桩固件问题处置实现落点(server-cdz)状态
R-1存量两桩批量帧(13/25)声明 LEN 大于实际发送长度、帧尾缺 0,按声明截帧即错位声明窗口内第二 0x68 为真实边界 → 截真实内容尾补 0 → CRC 以 6789 替代豁免PileHexFramer.applyLegacyLengthPatch(:226-245);配置 codec-patches(默认 40055825050010:13,25、40058825050011:13,25)✅ 已外置配置;精确边界待真实桩日志回放校准(D1-3)
R-2固件 CRC 算错/字节序不分默认不放行:清单外 CRC 失败即丢弃+计数;仅 crc-tolerance-piles 白名单放行并告警计数PileHexFramer.feed CRC 分支(:179-192);默认白名单 = 上述两桩✅ 已实现(G1 定稿);白名单载体待迁 business_equipment.crc_tolerance(该列当前不存在,禁止引用)
R-3CRC 字节序写反正序/逆序都收PileFrameCodec.verifyCrc(:73-77)+ PileCrc16✅ 已实现
R-4数据域含 0x68 即错位(无转义 + 字符串找头的固有缺陷)保留 hex 找头方案 + LEN 交叉校验 + 双守卫;不引入转义(协议层改动=不兼容)PileHexFramer 守卫与重同步(:105-155)✅ 已实现
R-5登录帧带协议版本×10 但旧系统无按版本分发登记版本号入 business_equipment.protocol_version,为未来分版本预留(本期不分发)LoginPayload.protocolVersionX10 已解析;登记列未建(EquipmentDO 现仅 firmwareVersion)⚠️ 解析就绪、落库待建

5.3 桩型差异处理

5.4 兼容风险与真实桩联调待定项(D1-3)

  1. 33/35 结果码语义:33 定义 00=失败/01=成功、35 定义 00=失败/01=成功(RemoteStartReplyPayload.java:6、RemoteStopReplyPayload.java:6)。旧系统代码分析曾发现「33 以 00 判败、35 以 01 判成,与云快充 1.6 常见 00=成功疑似相反」(legacy 05-订单结算引擎 §8.5)——须按对接桩厂商报文样本确认后定版。
  2. 34 余额分端序(E-5):legacy RemoteControlOfStartupOnTheOperationPlatform.java:36 未 reverseOrder ⇒ 大端 4B,与文档「帧内 4B 小端分」相出入;新实现按文档小端——真实桩对账前存在「断存量桩 vs 一直收错」双向风险,须实测定论。
  3. R-1 补丁精确边界:现为 legacy 硬编码的「等价简化版」,注释自认需真实桩日志回放校准(PileHexFramer.java:222-224)。
  4. 桩号↔设备/枪映射规范:connector_code 两拼写并存、legacy 14 位桩号 vs P+4 建议码、02 未命中档案仍注册的宽容策略——生产加固项(联调定稿)。
  5. CRC 白名单载体:当前在配置,目标落库 business_equipment.crc_tolerance(迁移后删配置,禁止双源)。
  6. 节拍核对:桩侧心跳 10s / 网关 readerIdle 60s(=×6 防误判)/ 13 上报 10s 级(pile-detailed-design §六/§八);模拟器默认 1s 心跳便于测试(PileSimulator.Config.heartbeatIntervalMillis=1000)——真实桩固件节拍需实测。
  7. 3B/40 对账走向:G2 定稿 3B/40 改 MQ 异步(U6 / D7);当前内存直连即时回执。
  8. 跨实例一致性:充电会话/实时态现为本实例内存,网关重启即失;Redis 会话/实时态后置前,多实例漂移无保障。

六、验证方法与验收边界

6.1 桩侧模拟能力(内置 PileSimulator / PileSimulatorConsole)

模拟真实充电桩物理行为(人+桩互动测试载体,命令表 PileSimulatorConsole.java:34-52):plug/unplug(插拔枪 + E-13 补送触发)、start-ok/start-fail/late-ok(33 回复策略与 60s 补送)、full(充满自停自发 19+3B)、fault <hex>(13 故障位图注入)、gun-state 0-3、hb-off/hb-on(停心跳 → 60s 断连离线路径)、rt-off/rt-on(停 13 → C 端 realtime stale 观察窗)、drop-35(测平台超窗重发)、no-tx(测结算兜底)、crc <n>(上行 CRC 篡改 → R-2 裁决)、power/step/volt/curr(遥测数值注入);启动 flag 另支持 --auto-full / --fault-hex / --crc-after / --drop35-on / --hb-off-after-login / --daemon / --plug-after(无人值守脚本化)。

6.2 端到端闭环(D4-① 场景,工作交接文档-20260903)

B 建档(桩 40055825050010 + 2 枪)→ PileSimulator 登录网关 9998 → C 端 start(34 下发)→ 模拟器 33 应答 + 13 遥测(真数据回联 currentPower/degree/amount)→ stop(36)→ 19/3B → 订单状态 1→2→5→6 → 守卫(枪忙 40901 / 活跃单 40903)→ DB 释放 5→6。

6.3 真实桩接入验收门(兼容红线回放)

  1. 存量两桩批量帧 R-1 补丁重组不丢数、CRC 6789 豁免路径生效;
  2. 篡改 CRC 帧:白名单桩放行并告警计数、清单外丢弃(R-2);正/逆序 CRC 均通过(R-3);
  3. 桩复位/断网重连:01 重新登录重建会话;60s 无心跳断连置离线(is_online=false);重复上线顶替旧连接;
  4. 33 失败后 60s 内插枪补送成功,订单 PENDING 不被 33 失败立即关闭(E-13);
  5. 结果码 / 端序(§5.4 ①②)按桩厂商样本复核后定版。

七、演进登记(watch list)

项现状目标关联
MQ 接线无(内存直连)mq-contracts U/D 队列接入(U1/U2/U3/U4/U5/U6、D1~D7)[[detailed-design/mq-message-contracts]]
Redis 实时态 / 会话无(本实例内存快照)Redis 实时态 + PG 规范化(er-charging §四);会话持久化[[er/er-charging]]
CRC 白名单落库配置承载(cdz.pile.crc-tolerance-piles)business_equipment.crc_tolerance[[design-conventions]] §十 G1
协议版本登记解析就绪(LoginPayload.protocolVersionX10)business_equipment.protocol_versionpile-detailed-design §十 R-5
校价/运维下行codec 就绪56/58/92 下发入口(远程操作页接线);05/09/0A/06 校价闭环[[pages/charging/remote-operation]]

相关页面