วิธีเชื่อมต่อระบบยืนยันตัวตนจากแอปกับ OCPP Central System

ในยุคที่สถานีชาร์จรถยนต์ไฟฟ้ากำลังขยายตัว แอปมือถือและแดชบอร์ดผู้ดูแลเป็นเครื่องมือสำคัญในการควบคุมระบบ แต่เราจะ ยืนยันตัวตนผู้ใช้ และเชื่อมโยงการสั่งงานของผู้ใช้กับสถานีชาร์จ (EVSE) อย่างปลอดภัยได้อย่างไร?

บทความนี้จะแนะนำวิธีผสานระบบยืนยันตัวตนจากแอปเข้ากับ OCPP Central System (CSMS) ได้อย่างราบรื่น


🧩 ภาพรวมของระบบ

องค์ประกอบหลัก:

  • แอปมือถือ / แดชบอร์ด – ผู้ใช้ล็อกอินและควบคุมการชาร์จ
  • Central System API (Flask) – REST API สำหรับเชื่อมต่อกับระบบ
  • OCPP WebSocket Server – ติดต่อกับ EVSE ผ่าน OCPP 1.6
  • MongoDB – เก็บข้อมูลผู้ใช้และสถานีชาร์จ

📊 แผนภาพ Sequence Diagram: เริ่มชาร์จจากแอป

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 สำหรับจัดการ token authentication

ติดตั้ง

pip install flask flask-jwt-extended pymongo werkzeug

ตัวอย่างโค้ด API /signup และ /login:

@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 ไปยัง EVSE

@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 พร้อมกำหนดอายุ token
  • ใช้ idTag เชื่อมโยงกับบัญชีผู้ใช้หรือยานพาหนะ
  • ใช้สิทธิ์ผู้ใช้ (role: user, admin, root) ควบคุมการเข้าถึง
  • ใช้ QR code สำหรับจับคู่กับ EVSE

🛠️ เครื่องมือที่ใช้

เครื่องมือ หน้าที่
Flask พัฒนา REST API
Flask-JWT จัดการ token auth
PyMongo เชื่อมต่อ MongoDB
asyncio ประมวลผล async / WebSocket
OCPP 1.6 ติดต่อกับสถานีชาร์จ (EVSE)

🚀 ฟีเจอร์เพิ่มเติมที่คุณสามารถเพิ่มได้

  • สแกน QR code เพื่อเชื่อมต่อ EVSE → ocpp://CP001?connector=1
  • ส่งคำสั่ง update firmware หรือขอ diagnostic log
  • รองรับหลาย role: ผู้ใช้ทั่วไป, เจ้าหน้าที่, แอดมิน

ต้องการ source code ตัวอย่าง, Postman collection หรือให้เราช่วย set up โปรเจกต์ของคุณ?
แค่แจ้งมา แล้วเราจะช่วยต่อยอดให้คุณได้ทันที! 🙌



Get in Touch with us

Chat with Us on LINE

iiitum1984

Speak to Us or Whatsapp

(+66) 83001 0222

Related Posts

Our Products