1 项目概览
1.1 目标与适用场景
1.1.1 简介
本文介绍的开源项目 ocpp_charge,是一个 自研轻量实现 OCPP 1.6 JSON 协议(欧洲版) 的充电桩调试平台。
它没有依赖官方 OCPP 1.6J 库,而是从零实现协议解析与会话管理,适合快速验证桩与平台的互通。
1.1.1.1 读者对象
- 充电桩厂商研发人员:快速验证桩侧 OCPP 报文是否符合标准。
- 平台开发人员:快速接入调试桩,便于协议联调。
- 二次开发工程师:在现有轻量框架上扩展更多业务逻辑。
2 快速上手(教程)
2.1 环境与依赖
2.1.1 基本要求
- Java JDK 1.8
- Maven 3.6+
- 建议内存 ≥ 512MB
2.1.1.1 获取仓库(示例)
git clone https://github.com/qyhua0/ocpp_charge.git
cd ocpp_charge
2.1.2 构建与运行
2.1.2.1 构建
mvn clean package -DskipTests
2.1.2.2 启动
java -jar target/ocpp-server-1.0.0.jar
-
默认端口:
8080
-
WebSocket 地址:
ws://<server-ip>:8080/ocpp/{chargePointId}
2.2 使用 Web 管理界面
2.2.1 访问
浏览器打开:
http://<server-ip>:8080/web
即可查看当前接入的桩、实时报文日志,并能点击按钮启动/停止充电。
2.2.1.1 REST API 示例
- 远程启动充电:
curl "http://<server-ip>:8080/api/ocpp/remoteStart/{cpId}?idTag=ID123&connectorId=1"
- 远程停止充电:
curl "http://<server-ip>:8080/api/ocpp/remoteStop/{cpId}?transactionId=1001"
- 查询连接状态:
curl "http://<server-ip>:8080/api/ocpp/connections"
3 OCPP 报文与调试
3.1 BootNotification 报文示例
3.1.1 桩上报的 BootNotification
[2, "uuid", "BootNotification", {"chargePointVendor": "XQ","chargePointModel": "ocpp_ac_7kw","chargePointSerialNumber": "ks0117100000008","firmwareVersion": "250722"
}]
3.1.1.1 字段说明
chargePointVendor
厂商标识chargePointModel
型号serialNumber
桩序列号firmwareVersion
固件版本
3.2 使用 Node.js 模拟桩连接
3.2.1 示例代码
const WebSocket = require('ws');
const ws = new WebSocket('ws://127.0.0.1:8080/ocpp/CP_TEST');ws.on('open', () => {const boot = [2, "req-1", "BootNotification", {chargePointVendor: "XQ",chargePointModel: "ocpp_ac_7kw"}];ws.send(JSON.stringify(boot));console.log('BootNotification sent');
});ws.on('message', (msg) => {console.log('recv:', msg.toString());
});
3.3 常见交互流程
- 建立 WebSocket 连接
- 桩发送
BootNotification
- 桩周期性发送
Heartbeat
/MeterValues
- 平台下发
RemoteStart
/RemoteStop
- 所有报文在 Web 界面实时显示
4 二次开发实战
4.1 项目结构速览
4.1.1 核心包
src/main/java├── ws # WebSocket 服务├── service # 报文处理├── model # 设备/会话对象├── api # REST 控制器└── util # 报文工具
4.1.1.1 特点
- 框架简单,逻辑清晰
- 支持快速扩展自定义 Action
4.2 新增自定义 Action
4.2.1 修改 OcppService
在 OcppService.handleCall
中新增分支:
case "MyCustomAction":JSONObject result = new JSONObject();result.put("status", "Accepted");String resp = OcppMessageUtil.buildCallResult(requestId, result);session.sendMessage(resp);break;
4.2.1.1 调试建议
- 利用 Web UI 日志观察报文
- 使用 Node.js 或 Python 客户端模拟桩
- 保证自定义字段符合 JSON 规范
5 部署与运维
5.1 测试到生产
5.1.1 建议
- 使用 WSS + HTTPS
- 增加认证/鉴权
- 使用 Redis 管理会话,便于扩展
5.1.1.1 日志与监控
- 建议接入 ELK 或 Prometheus
- 对交易相关报文做好幂等校验
6 常见问题
6.1 无法建立 WebSocket
- 确认 URL 正确:
/ocpp/{chargePointId}
- 检查端口是否开放
6.2 远程命令无响应
- 确认桩在线
- 查看报文日志是否下发成功
6.3 BootNotification 解析失败
- 检查字段拼写是否符合协议
7 结语与贡献
7.1 许可与参与
本项目采用 MIT License,欢迎提交 Issue 与 PR。
项目地址:https://github.com/qyhua0/ocpp_charge