欢迎光临~深圳市芯橙科技有限公司
语言选择: 中文版 ∷  英文版

新闻中心

充电桩主板本地日志与OCPP远程日志对不上,如何强制同步?

充电桩主板本地日志与 OCPP 远程日志“对不上”90% 不是协议缺陷,而是“本地没写成功、没发出去、或平台没回执”三件事之一;把下面 5 个强制步骤跑完,基本都能 对齐。

1 先判断“谁缺”——3 秒定位法

现象缺失方立即查看
桩侧有、平台无上传链路TCP/心跳、报文 ACK、Kafka 积压
平台有、桩侧无本地存储SQLite 锁/满盘、文件句柄、NTP 时间
两边都有但时间差>5s时间基准chrony status、MCU RTC 漂移

2 强制同步 5 步(现场可直接操作)

  1. 立即触发一次 GetDiagnostics
    用平台下发 GetDiagnostics 消息,指定 startTime / stopTime 到秒,桩侧必须把对应时段本地 .log 打成 zip 通过 HTTP POST 上传到平台指定 URL;这一步就能把“本地漏记”还是“平台漏收”一次性区分开
  2. 检查本地事务是否真正提交
    很多低端主板用 SQLite,高并发时 COMMIT 被阻塞,结果日志写在内存缓冲区就掉电丢失;临时方案:把 PRAGMA synchronous = FULL; PRAGMA journal_mode = WAL; 写进固件初始化脚本,掉电也能回滚
  3. 补发漏掉的 OCPP 消息
    若第 1 步确认平台缺、桩侧有,用“离线重放”脚本
    • 把桩侧 zip 解压,提取 messageId + payload
    • 按原 timestamp 顺序重发 StartTransaction / StopTransaction / MeterValues
    • 发完后对比平台 transactionId 是否生成,生成即代表对齐成功
  4. 强制时钟同步
    如果时间差>5s,先 systemctl restart chronyd,再 chronyc makestepOCPP 报文里 timestamp 与平台差超过 30s 会被直接丢弃,这是最容易忽视的“隐形丢日志”
  5. 打开“回执确认”开关
    ChangeConfiguration 里把 AcknowledgeLocalTx 设为 true,平台每收到一条记录必须回 STATUS_OK,否则桩侧重发 3 次;这样以后再也不会出现“平台以为收到,桩侧以为没收到”的灰色地带

3 一键脚本(给运维)

#!/bin/sh# 强制对齐昨天 00:00~23:59 的日志CHARGE_BOX_ID="12345678"START=$(date -d yesterday +%Y-%m-%dT00:00:00Z)STOP=$(date -d yesterday +%Y-%m-%dT23:59:59Z)curl -X POST $CSMS_URL \
  -d '{"action":"GetDiagnostics","chargeBoxId":"'$CHARGE_BOX_ID'",
       "payload":{"startTime":"'$START'","stopTime":"'$STOP'","retries":3}}'
跑完 30 秒内拿到下载 URL,把 zip 里的 csv 与平台 transaction 表做 LEFT JOIN,空白行就是缺失记录,按第 3 步补传即可。

4 结论

  • 协议本身有完整重发+回执机制,缺日志 99% 是“本地没写、没发、没回执”三件套;
  • GetDiagnostics 先定位谁缺,再补时钟、补事务、补回执,30 分钟就能 对齐
  • 以后固件默认把 AcknowledgeLocalTx 打开,再也不同步焦虑

芯橙科技交流充电桩主板,质优价美,欢迎咨询选购!