Skip to content

OCPP ゲートウェイ

OCPP(Open Charge Point Protocol)は、充電ステーションと中央管理システムを接続するためのオープンな通信プロトコルであり、電気自動車充電インフラ向けの統一通信標準の提供を目的としています。OCPP ゲートウェイはプロトコル変換器として機能し、OCPP と MQTT プロトコル間の橋渡しを行うことで、これらのプロトコルを使用するクライアント同士の通信を可能にします。

EMQX は OCPP 1.6-J に対応したプロトコルゲートウェイを追加しており、OCPP 仕様に準拠した様々なブランドの充電ステーション機器と接続可能です。ルールエンジン、データ統合、REST API などを通じて管理システム(Central System)と連携し、ユーザーが迅速に電気自動車充電インフラを構築できるよう支援します。

本ページでは、EMQX における OCPP ゲートウェイの設定および利用方法を紹介します。

OCPP ゲートウェイの有効化

EMQX の OCPP ゲートウェイは、ダッシュボード、REST API、設定ファイル base.hocon を通じて設定および有効化が可能です。本節ではダッシュボードによる設定例を用いて操作手順を説明します。

EMQX ダッシュボードの左ナビゲーションメニューで 管理 -> ゲートウェイ をクリックします。ゲートウェイ ページにはサポートされているすべてのゲートウェイが一覧表示されます。OCPP を探し、操作 列の 設定 をクリックすると、OCPP 初期化 ページに遷移します。

TIP

EMQX をクラスターで運用している場合、ダッシュボードや REST API で行った設定はクラスター全体に影響します。特定のノードのみ設定を変更したい場合は、base.hocon で設定してください。

設定を簡略化するために、EMQX は ゲートウェイ ページのすべての必須項目にデフォルト値を用意しています。大幅なカスタマイズが不要であれば、以下の3ステップで OCPP ゲートウェイを有効化できます。

  1. 基本設定 タブで 次へ をクリックし、すべてのデフォルト設定を受け入れます。
  2. 続いて表示される リスナー タブでは、EMQX がポート 33033 で Websocket リスナーを事前設定しています。ここでも 次へ をクリックして設定を確定します。
  3. 最後に 有効化 ボタンをクリックして OCPP ゲートウェイを起動します。

ゲートウェイの有効化が完了すると、ゲートウェイ ページに戻り、OCPP ゲートウェイのステータスが 有効 と表示されます。

OCPP ゲートウェイが有効化された状態

上記の設定は REST API でも可能です。

実行例:

bash
curl -X 'PUT' 'http://127.0.0.1:18083/api/v5/gateways/ocpp' \
  -u <your-application-key>:<your-security-key> \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "ocpp",
  "enable": true,
  "mountpoint": "ocpp/",
  "listeners": [
    {
      "type": "ws",
      "name": "default",
      "bind": "33033",
      "websocket": {
        "path": "/ocpp"
      }
    }
  ]
}'

OCPP クライアントとの連携

OCPP ゲートウェイが稼働したら、OCPP クライアントツールを使って接続テストや動作確認を行えます。

ここでは実例として ocpp-go を用い、EMQX の OCPP ゲートウェイに接続する方法を紹介します。

  1. まず、OCPP ゲートウェイと連携する MQTT クライアントを準備します。例えば MQTTX を使い、EMQX に接続してトピック ocpp/# をサブスクライブする設定を行います。

    MQTT 接続の作成
  2. ocpp-go クライアントを起動し、OCPP ゲートウェイに接続します。

    注意:以下のコマンド内の <host> は EMQX サーバーのアドレスに置き換えてください。

    shell
    docker run -e CLIENT_ID=chargePointSim -e CENTRAL_SYSTEM_URL=ws://<host>:33033/ocpp -it --rm --name charge-point ldonini/ocpp1.6-charge-point:latest

    接続成功時には以下のようなログが出力されます。

    css
    INFO[2023-12-01T03:08:39Z] connecting to server logger=websocket
    INFO[2023-12-01T03:08:39Z] connected to server as chargePointSim logger=websocket
    INFO[2023-12-01T03:08:39Z] connected to central system at ws://172.31.1.103:33033/ocpp
    INFO[2023-12-01T03:08:39Z] dispatched request 1200012677 to server logger=ocppj
  3. MQTTX で以下のようなメッセージを受信することを確認します。

    json
    Topic: ocpp/cp/chargePointSim
    {
      "UniqueId": "1200012677",
      "Payload": {
        "chargePointVendor": "vendor1",
        "chargePointModel": "model1"
      },
      "Action": "BootNotification"
    }

    このメッセージは ocpp-go クライアントが OCPP ゲートウェイに接続し、BootNotification リクエストを送信したことを示します。

  4. MQTTX でトピック ocpp/cs/chargePointSim に対し、以下の内容のメッセージを作成して送信します。

    注意UniqueId は前のメッセージで受信したものに置き換えてください。

    json
    {
      "MessageTypeId": 3,
      "UniqueId": "***",
      "Payload": {
        "currentTime": "2023-12-01T14:20:39+00:00",
        "interval": 300,
        "status": "Accepted"
      },
      "Action": "BootNotification"
    }
  5. その後、MQTTX は StatusNotification ステータスレポートを受信します。これは OCPP クライアントが正常に OCPP ゲートウェイと接続を確立したことを示しています。

    json
    Topic: ocpp/cp/chargePointSim
    Payload:
    {
      "UniqueId": "3062609974",
      "Payload": {
        "status": "Available",
        "errorCode": "NoError",
        "connectorId": 0
      },
      "MessageTypeId": 2,
      "Action": "StatusNotification"
    }

OCPP ゲートウェイのカスタマイズ

デフォルト設定に加え、EMQX はさまざまな設定オプションを提供しており、特定のビジネス要件に合わせた調整が可能です。本節では ゲートウェイ ページで設定可能な各項目について詳しく解説します。

基本設定

ゲートウェイページの OCPP ゲートウェイの 操作 列にある 設定 ボタンをクリックすると、基本設定 タブで以下の項目を設定できます。

ocpp-basic-conf

  • MountPoint:パブリッシュやサブスクライブ時にすべてのトピックの前に付与される文字列です。異なるプロトコル間でメッセージルーティングの分離を実現するために利用します。例:ocpp/

  • デフォルトハートビート間隔:ハートビートのデフォルト間隔、デフォルト値は 60s

  • ハートビートチェック回数のバックオフ:ハートビートチェック回数のバックオフ値、デフォルトは 1

  • メッセージフォーマットチェック:メッセージのフォーマットの妥当性チェックを有効にするかどうか。EMQX はアップロードストリームおよびダウンロードストリームのメッセージフォーマットを json-schema で定義された形式に対して検証します。チェックに失敗した場合、EMQX は対応する応答メッセージを返します。設定可能な値は以下の通りです。

    • disable:メッセージのチェックを行わない(デフォルト)
    • upstream_only:アップロードストリームのメッセージのみチェック
    • dnstream_only:ダウンロードストリームのメッセージのみチェック
    • all:すべてのメッセージをチェック
  • JSON スキーマディレクトリ:OCPP メッセージ定義の JSON スキーマディレクトリ、デフォルトは ${application}/priv/schemas

  • JSON スキーマ ID プレフィックス:OCPP メッセージスキーマの ID プレフィックス、デフォルトは urn:OCPP:1.6:2019:12:

  • アイドルタイムアウト:非アクティブ状態が続いた場合に接続を切断するまでの最大待機時間(秒)

  • アップストリーム:アップロードストリームの設定グループ

    • トピック:アップロードストリームの Call Request メッセージ用トピック、デフォルトは cp/${cid}
    • 返信トピック:アップロードストリームの返信メッセージ用トピック、デフォルトは cp/${cid}/Reply
    • エラートピック:アップロードストリームのエラーメッセージ用トピック、デフォルトは cp/${cid}/Reply
    • トピックオーバーライドマッピング:メッセージ名によるアップロードストリームのトピックオーバーライドマッピング
  • ダウンストリーム:ダウンロードストリームの設定グループ

    • トピック:EMQX からリクエストや制御メッセージを受信するためのダウンロードストリームトピック。これは接続されたすべてのチャージポイントがサブスクライブするワイルドカードトピック名です。デフォルトは cs/${cid}
    • 最大メッセージキュー長:ダウンロードストリームのメッセージ配信における最大メッセージキュー長、デフォルトは 100

リスナーの追加

ポート 33033 で名前が default の Websocket リスナーがすでに設定されており、プール内の最大アセプター数は16、最大同時接続数は1,024,000です。より詳細な設定を行う場合は 設定 をクリックし、リスナーを削除したい場合は 削除 をクリック、新規リスナーを追加する場合は + リスナー追加 をクリックしてください。

TIP

OCPP ゲートウェイは Websocket および TLS 上の Websocket タイプのリスナーのみサポートしています。

リスナー追加 ページでは以下の設定項目を指定できます。

基本設定

  • 名前:リスナーの一意識別子を設定します。
  • タイプ:プロトコルタイプを選択します。OCPP では ws または wss が選択可能です。
  • バインド:リスナーが接続を受け付けるポート番号を設定します。
  • MountPoint:パブリッシュやサブスクライブ時にすべてのトピックの前に付与される文字列で、異なるプロトコル間でのメッセージルーティング分離に利用します。

リスナー設定

  • パス:接続アドレスのパスプレフィックスを設定します。クライアントは接続時にこの完全なアドレスを指定する必要があります。デフォルトは /ocpp
  • アセプター:アセプタープールのサイズを設定します。デフォルトは 16
  • 最大接続数:リスナーが処理可能な同時接続の最大数を設定します。デフォルトは 1024000
  • 最大接続レート:リスナーが1秒あたりに受け入れる新規接続の最大レートを設定します。デフォルトは 1000
  • プロキシプロトコル:EMQX が ロードバランサー の背後にある場合に、プロトコル V1/V2 を有効化します。
  • プロキシプロトコルタイムアウト:非アクティブ状態でプロキシプロトコルパッケージを待機する最大時間(秒)を設定し、デフォルトは 3s

TCP 設定

  • ActiveN:ソケットの {active, N} オプションを設定します。これはソケットが積極的に処理可能な受信パケット数を示します。詳細は Erlang ドキュメント - setopts/2 を参照してください。
  • バッファ:受信および送信パケットを格納するバッファサイズを KB 単位で設定します。
  • TCP_NODELAYTCP_NODELAY フラグを有効化するかどうかを設定します。これはクライアントが前のデータのアックを待たずに追加データを送信できるかどうかを制御します。デフォルトは false、選択肢は true または false
  • SO_REUSEADDR:ローカルのポート番号再利用を許可するかどうかを設定します。
  • 送信タイムアウト:非アクティブ状態で送信タイムアウトが発生するまでの最大待機時間(秒)、デフォルトは 15s
  • 送信タイムアウト時の切断:送信タイムアウト時に接続を切断するかどうかを設定します。

SSL 設定(wss リスナーのみ)

TLS 検証の有効化はトグルスイッチで設定可能ですが、その前に関連する TLS 証明書TLS キーCA 証明書 の情報をファイル内容の入力または ファイル選択 ボタンからアップロードして設定する必要があります。詳細は SSL/TLS 接続の有効化 を参照してください。

続いて以下の設定が可能です。

  • SSL バージョン:サポートする SSL バージョンを設定します。デフォルトは tlsv1.3tlsv1.2tlsv1.1tlsv1
  • ピア証明書なしの場合の拒否:クライアントが空の証明書を送信した場合に接続を拒否するかどうかを設定します。デフォルトは false、選択肢は true または false
  • 中間証明書の深さ:ピア証明書に続く有効な認証パスに含まれる自己発行でない中間証明書の最大数を設定します。デフォルトは 10
  • キーのパスワード:秘密鍵がパスワード保護されている場合に使用するパスワードを設定します。

認証の設定

OCPP プロトコルの接続メッセージにはすでにユーザー名とパスワードの概念が定義されているため、OCPP は以下のような多様な認証方式をサポートしています。

OCPP ゲートウェイは Websocket ハンドシェイクメッセージの Basic Authentication 情報を利用してクライアントの認証フィールドを生成します。

  • クライアント ID:固定パスプレフィックス以降の接続アドレス部分の値
  • ユーザー名:Basic Authentication のユーザー名
  • パスワード:Basic Authentication のパスワード

REST API を使って OCPP ゲートウェイ用の組み込みデータベース認証を作成することも可能です。

実行例:

bash
curl -X 'POST' \
  'http://127.0.0.1:18083/api/v5/gateways/ocpp/authentication' \
  -u <your-application-key>:<your-security-key> \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "backend": "built_in_database",
  "mechanism": "password_based",
  "password_hash_algorithm": {
    "name": "sha256",
    "salt_position": "suffix"
  },
  "user_id_type": "username"
}'

TIP

MQTT プロトコルとは異なり、ゲートウェイは認証方式の作成のみをサポートし、認証方式の一覧(または認証チェーン)の作成はサポートしていません

認証方式が有効化されていない場合、すべての OCPP クライアントのログインが許可されます。