Techに戻る

OCPP 2.0.1 主要メッセージタイプ解説

BootNotification, Heartbeat, Authorize, TransactionEvent などのコアメッセージを 5〜10 分で理解する

OCPP 2.0.1では80以上のメッセージが定義されていますが、日常運用で頻出する「コアメッセージ」は10程度に絞れます。
本記事では BootNotification / Heartbeat / Authorize / TransactionEvent / StatusNotification / MeterValues を中心に、JSON 例とともに概要を解説します。

この記事では Charging Station を CS、Central System Management System を CSMS と表記します。

1. メッセージ構造のおさらい

OCPP 2.0.1 は WebSocket 上で次の 3 種フレームを交換します。

フレームタイプ説明
CALL (2)CS or CSMS から送信されるリクエスト[2,"msgId","BootNotification",{...}]
CALLRESULT (3)リクエストに対する正常応答[3,"msgId",{...}]
CALLERROR (4)リクエストが失敗した場合の応答[4,"msgId","ErrorCode","Description",{}]

msgId はリクエスト・レスポンスを紐づけるユニーク ID です。

2. BootNotification

2.1 目的

CSが起動時または再接続時に自身の情報(モデル名、FW など)を CSMS に通知します。

2.2 シーケンス

2.3 JSON 例

json
[2,"12345","BootNotification",{
  "chargingStation": {
    "model": "GW-1000",
    "vendorName": "OCPP-GW Inc.",
    "serialNumber": "GW1000-42"
  },
  "reason": "PowerUp",
  "reasonTimestamp": "2025-08-03T09:01:27Z"
}]

応答例(要約):

json
[3,"12345",{
  "status": "Accepted",
  "interval": 300,
  "currentTime": "2025-08-03T09:01:28Z"
}]

interval 秒ごとに Heartbeat を送信するよう指示されています。

3. Heartbeat

3.1 目的

CSの接続維持確認と時刻同期。

3.2 JSON 例

json
[2,"6d89f","Heartbeat",{}]

応答:

json
[3,"6d89f",{"currentTime":"2025-08-03T09:06:28Z"}]

currentTime を用いて CS はシステム時刻を更新します。

4. Authorize(認証)

4.1 目的

ユーザ識別子(RFID, Plug&Charge Certificate, Token など)の利用可否を確認。

4.2 JSON 例

json
[2,"a1b2c","Authorize",{
  "idToken": {
    "idToken": "04FE23...",
    "type": "ISO14443"
  }
}]

応答:

json
[3,"a1b2c",{
  "idTokenInfo": {
    "status": "Accepted",
    "cacheExpiryDateTime": "2025-08-03T11:00:00Z"
  }
}]

5. TransactionEvent

StartTransactionStopTransaction が 2.0.1 で TransactionEvent に統合・拡張されました。

5.1 ステータス遷移

EventTypeStarted / Updated / Ended を示します。

5.2 開始イベント例

json
[2,"tx-01","TransactionEvent",{
  "eventType":"Started",
  "timestamp":"2025-08-03T09:10:00Z",
  "triggerReason":"Authorized",
  "seqNo":1,
  "transactionInfo":{
    "transactionId":"tx-9876",
    "chargingState":"Charging"
  },
  "evse":{"id":1,"connectorId":1},
  "idToken":{"idToken":"04FE23...","type":"ISO14443"}
}]

6. StatusNotification

EVSE・コネクタ単位の状態変化を報告します。

json
[2,"sn-11","StatusNotification",{
  "timestamp":"2025-08-03T09:10:01Z",
  "connectorStatus":"Occupied",
  "evse": {"id":1,"connectorId":1}
}]

7. MeterValues

一定間隔で電力量などの計測値を送信します。

json
[2,"m-001","MeterValues",{
  "evseId":1,
  "meterValue":[{
    "timestamp":"2025-08-03T09:15:00Z",
    "sampledValue":[{"value":"12.34","measurand":"Energy.Active.Import.Register","unit":"kWh"}]
  }]
}]

8. まとめ

  • BootNotification・Heartbeat:接続確立と維持に必須
  • Authorize・TransactionEvent:認証と課金のコア
  • StatusNotification・MeterValues:状態と計測値で運用を支える
  • これらを押さえれば デバッグログの 70% を読めるようになります。

次回は「BootNotification から Heartbeat までの実装ポイント」を C++17 コード断片付きで紹介します。