返回部落格
教學8 分鐘閱讀

OCPP 1.6 開發者指南

OCPP 1.6 是讓充電樁與後端系統對話的協定。本文走一遍每個開發者在動手寫第一行固件之前都該弄懂的核心訊息流程。

I
Infinite Service Team

OCPP 是什麼

OCPP——開放充電點協定(Open Charge Point Protocol)——是充電樁(Charge Point)與後端管理系統(中央系統管理軟體,即 CSMS)之間通訊的業界標準。1.6 版是目前現場部署最廣的版本。

協定跑在 WebSocket 上。充電樁永遠是 WebSocket 用戶端,CSMS 是伺服端。訊息是 JSON(也就是 -J 變體,實際上大家用的都是它)。

訊息格式

每一條 OCPP 訊息都是一個結構固定的 JSON 陣列:

json
[MessageTypeId, UniqueId, Action, Payload]
  • MessageTypeId:2 = Call(請求),3 = CallResult(回應),4 = CallError
  • UniqueId:你自己產生的字串,用來把請求和回應對上
  • Action:操作名稱(例如 “BootNotification”)
  • Payload:訊息主體,一個 JSON 物件

一次典型的 BootNotification 往返是這樣:

json
// 充電樁 → CSMS
[2, "19223201", "BootNotification", {
  "chargePointModel": "SingleSocketCharger",
  "chargePointVendor": "VendorX"
}]
json
// 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,驅動你的充電樁走完上面這些流程,並在每一步驗證訊息結構與時序。跑第一遍,你就能抓出大部分一致性問題。

相關文章