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