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 例
[2,"12345","BootNotification",{
"chargingStation": {
"model": "GW-1000",
"vendorName": "OCPP-GW Inc.",
"serialNumber": "GW1000-42"
},
"reason": "PowerUp",
"reasonTimestamp": "2025-08-03T09:01:27Z"
}]
応答例(要約):
[3,"12345",{
"status": "Accepted",
"interval": 300,
"currentTime": "2025-08-03T09:01:28Z"
}]
interval
秒ごとに Heartbeat を送信するよう指示されています。
3. Heartbeat
3.1 目的
CSの接続維持確認と時刻同期。
3.2 JSON 例
[2,"6d89f","Heartbeat",{}]
応答:
[3,"6d89f",{"currentTime":"2025-08-03T09:06:28Z"}]
currentTime
を用いて CS はシステム時刻を更新します。
4. Authorize(認証)
4.1 目的
ユーザ識別子(RFID, Plug&Charge Certificate, Token など)の利用可否を確認。
4.2 JSON 例
[2,"a1b2c","Authorize",{
"idToken": {
"idToken": "04FE23...",
"type": "ISO14443"
}
}]
応答:
[3,"a1b2c",{
"idTokenInfo": {
"status": "Accepted",
"cacheExpiryDateTime": "2025-08-03T11:00:00Z"
}
}]
5. TransactionEvent
StartTransaction
と StopTransaction
が 2.0.1 で TransactionEvent に統合・拡張されました。
5.1 ステータス遷移
EventType
が Started
/ Updated
/ Ended
を示します。
5.2 開始イベント例
[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・コネクタ単位の状態変化を報告します。
[2,"sn-11","StatusNotification",{
"timestamp":"2025-08-03T09:10:01Z",
"connectorStatus":"Occupied",
"evse": {"id":1,"connectorId":1}
}]
7. MeterValues
一定間隔で電力量などの計測値を送信します。
[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 コード断片付きで紹介します。