OCPP 是什麼
OCPP——開放充電點協定(Open Charge Point Protocol)——是充電樁(Charge Point)與後端管理系統(中央系統管理軟體,即 CSMS)之間通訊的業界標準。1.6 版是目前現場部署最廣的版本。
協定跑在 WebSocket 上。充電樁永遠是 WebSocket 用戶端,CSMS 是伺服端。訊息是 JSON(也就是 -J 變體,實際上大家用的都是它)。
訊息格式
每一條 OCPP 訊息都是一個結構固定的 JSON 陣列:
[MessageTypeId, UniqueId, Action, Payload]- MessageTypeId:2 = Call(請求),3 = CallResult(回應),4 = CallError
- UniqueId:你自己產生的字串,用來把請求和回應對上
- Action:操作名稱(例如 “BootNotification”)
- Payload:訊息主體,一個 JSON 物件
一次典型的 BootNotification 往返是這樣:
// 充電樁 → CSMS
[2, "19223201", "BootNotification", {
"chargePointModel": "SingleSocketCharger",
"chargePointVendor": "VendorX"
}]// CSMS → 充電樁
[3, "19223201", {
"currentTime": "2026-03-05T10:00:00Z",
"interval": 300,
"status": "Accepted"
}]核心訊息流程
啟動序列
充電樁開機後,必須先發 BootNotification,並在收到 Accepted 之前什麼都不做。如果 CSMS 回傳 Pending 或 Rejected,充電樁應當退避,並按回應裡給出的間隔重試。
BootNotification 被接受之後,充電樁為每個接口各發一條 StatusNotification,然後按 CSMS 指定的間隔開始發 Heartbeat。
授權
啟動一筆交易之前,充電樁通常需要先為使用者授權。它發出帶 idTag(RFID 卡號)的 Authorize,CSMS 回一個 AuthorizationStatus。要緊的幾個狀態是:
- Accepted:允許這筆交易
- Blocked:卡片被停用,不要啟動
- Expired:卡片已過期
- Invalid:未知的卡片
- ConcurrentTx:這張卡在別處已有一筆進行中的交易
交易流程
StartTransaction → [CSMS 指派 transactionId]
→ StatusNotification (Charging)
→ MeterValues(週期性,選用)
→ StopTransaction → [CSMS 關閉交易]
→ StatusNotification (Available)StartTransaction 回傳的 transactionId,必須出現在 StopTransaction 以及本次工作階段期間所有的 MeterValues 裡。
遠端指令
CSMS 可以向充電樁下發指令。需要實作的關鍵幾條:
- RemoteStartTransaction / RemoteStopTransaction:啟動或停止一次工作階段
- Reset:Soft(優雅)或 Hard(立即)重啟
- ChangeAvailability:把某個接口投入或退出服務
- GetConfiguration / ChangeConfiguration:讀寫設定項
- UnlockConnector:實體上釋放線纜
常見的實作錯誤
1. 不理會 BootNotification 回傳 Pending 時的回壓
有些充電樁無視 Pending 回應,立刻開始發 Heartbeat。規範寫得很清楚:等到 Accepted 再說。
2. 用了過期的 transactionId
永遠使用 CSMS 在 StartTransaction.CallResult 裡指派的那個 transactionId。絕不要重複使用上一次工作階段的 ID。
3. StopTransaction 之後不發 StatusNotification
一筆交易結束後,接口狀態應當回到 Available(或者 Preparing、Faulted,取決於實際狀態)。漏掉這一步,CSMS 手上留的就是一個過期的接口狀態。
4. 無視心跳間隔
CSMS 會在 BootNotification 的回應裡告訴你多久發一次 Heartbeat。用那個值,不要用寫死的值。
測試你的實作
這正是 TestPilot 派上用場的地方。它模擬一個 CSMS,驅動你的充電樁走完上面這些流程,並在每一步驗證訊息結構與時序。跑第一遍,你就能抓出大部分一致性問題。