アプリの認証を OCPP 中央システムに統合する方法
EV充電インフラの拡大とともに、ユーザー向けのモバイルアプリや管理用ダッシュボードの重要性が増しています。では、アプリでのユーザー認証をどのようにOCPPの中央システムと連携すればよいのでしょうか?
この記事では、アプリからの認証と制御を OCPP Central System (CSMS) に安全かつスムーズに統合する方法を解説します。
🧩 システム構成の概要
主なコンポーネント:
- モバイルアプリ / ダッシュボード – ユーザーのログインと充電制御
- Flask Central API – REST API サーバー
- OCPP WebSocket サーバー – EVSEとの通信 (OCPP 1.6)
- MongoDB – ユーザーおよび充電器情報のデータベース
📊 シーケンス図: アプリから充電開始
sequenceDiagram
participant User as Mobile App
participant API as Flask API Server
participant CSMS as OCPP Central System
participant EVSE as Charger (EVSE)
User->>API: POST /api/login (username, password)
API-->>User: JWT token + idTag
User->>API: POST /api/start_charging (evse_id, connector_id, token)
API->>CSMS: RemoteStartTransaction(idTag, connectorId)
CSMS->>EVSE: RemoteStartTransaction.req
EVSE-->>CSMS: RemoteStartTransaction.conf
CSMS-->>API: status = Accepted
API-->>User: {"status": "Accepted"}
🔑 1. JWT を用いたユーザー認証
Flask-JWT-Extended
を使用してトークンベースの認証を構築します。
パッケージインストール
pip install flask flask-jwt-extended pymongo werkzeug
認証APIの例
@flask_app.route("/api/signup", methods=["POST"])
def signup():
...
token = create_access_token(identity=user["username"])
return jsonify(access_token=token, idTag=user["idTag"])
@flask_app.route("/api/login", methods=["POST"])
def login():
...
token = create_access_token(identity=user["username"])
return jsonify(access_token=token, idTag=user["idTag"])
⚡ 2. API経由でOCPPコマンドを実行
@flask_app.route("/api/start_charging", methods=["POST"])
@jwt_required()
def start_charging():
cp = connected_charge_points.get(evse_id)
payload = call.RemoteStartTransactionPayload(id_tag=id_tag, connector_id=connector_id)
future = asyncio.run_coroutine_threadsafe(cp.call(payload), main_loop)
result = future.result(timeout=10)
return jsonify({"status": result.status})
🧠 ベストプラクティス
- パスワードは
generate_password_hash
で安全に保存 - JWTに有効期限を設定
idTag
をユーザーアカウントや車両と紐づけ- ユーザーの役割(user, admin, root)によってアクセス制御
- QRコードスキャンでEVSEとのペアリングも可能
🛠️ 使用技術
技術 | 用途 |
---|---|
Flask | REST API 開発 |
Flask-JWT | 認証トークンの生成 |
PyMongo | MongoDBとの連携 |
asyncio | 非同期処理とWebSocket制御 |
OCPP 1.6 | EVSEとの通信標準プロトコル |
🚀 発展的な機能
- QRコード:
ocpp://CP001?connector=1
を読み取ってEVSEと接続 - リモートによるファームウェア更新・診断ログ取得
- 管理画面でユーザー管理や充電記録の確認
📦 Postman用テストコレクションや、プロジェクトのスターターコードが必要な場合はお気軽にお知らせください!
Related Posts
- Wazuhを理解する:その背後にあるオープンソースプロジェクトを探る
- 初心者向けガイド:EV充電アプリはどうやって充電器と通信し、充電量と料金を計算しているのか?
- Flask[async]・WebSocket・MongoDB を使って OCPP 1.6 中央システムを構築する
- AIはOdooの会計・在庫管理システムをどう強化するのか(開発視点付き)
- JavaScriptでフルスタックのEコマースシステムを開発しよう
- Python・Langchain・OllamaでエージェンティックAIを構築する方法(eコマース & 工場自動化向け)
- PythonとOBD-IIライブデータでP0420の根本原因を診断する
- スタートアップのアイデアを正しく検証するための『The Mom Test』の活用法
- RasaとLangchain、どちらを選ぶべきか?チャットボット開発の選択基準
- OCR Document Managerのご紹介:書類を簡単にテキスト化できるWebアプリ
- まだバズっていない「売れ筋商品」をAIで発見するツールを作っています ― 興味ありますか?
- あなたのウェブサイトがリードを失っている理由 — それは「沈黙」です
- スマート農業を革新するAgentic AIとは?あなたの農場が今すぐ導入すべき理由
- LangChain + Ollama で RAGチャットボットを作る方法
- SCPI を使った EXFO 機器の自動化:実践ガイド
- レガシーコードを扱いやすくするためのデザインパターン
- 🧠 レガシーコードに安全に新機能を追加する方法
- レガシーソフトウェアを安全に近代化 — 全面リライト不要!
- OpenSearchの仕組みとは?リアルタイム検索エンジンの内部構造を解説
- DjangoでBasicとPremium機能を分けるベストな戦略とは?
Our Products
Related Posts
- Wazuhを理解する:その背後にあるオープンソースプロジェクトを探る
- 初心者向けガイド:EV充電アプリはどうやって充電器と通信し、充電量と料金を計算しているのか?
- Flask[async]・WebSocket・MongoDB を使って OCPP 1.6 中央システムを構築する
- AIはOdooの会計・在庫管理システムをどう強化するのか(開発視点付き)
- JavaScriptでフルスタックのEコマースシステムを開発しよう
- Python・Langchain・OllamaでエージェンティックAIを構築する方法(eコマース & 工場自動化向け)
- PythonとOBD-IIライブデータでP0420の根本原因を診断する
- スタートアップのアイデアを正しく検証するための『The Mom Test』の活用法
- RasaとLangchain、どちらを選ぶべきか?チャットボット開発の選択基準
- OCR Document Managerのご紹介:書類を簡単にテキスト化できるWebアプリ
- まだバズっていない「売れ筋商品」をAIで発見するツールを作っています ― 興味ありますか?
- あなたのウェブサイトがリードを失っている理由 — それは「沈黙」です
- スマート農業を革新するAgentic AIとは?あなたの農場が今すぐ導入すべき理由
- LangChain + Ollama で RAGチャットボットを作る方法
- SCPI を使った EXFO 機器の自動化:実践ガイド
- レガシーコードを扱いやすくするためのデザインパターン
- 🧠 レガシーコードに安全に新機能を追加する方法
- レガシーソフトウェアを安全に近代化 — 全面リライト不要!
- OpenSearchの仕組みとは?リアルタイム検索エンジンの内部構造を解説
- DjangoでBasicとPremium機能を分けるベストな戦略とは?