เราจะเขียน OCPP server อย่างไร
ตอนนี้กระแส EV กำลังมา เวลาเราไปตามปั๊มน้ำมันเราก็จะเห็นจุด charge ev กันใช่ไหมครับ เราเคยสงสัยไหมว่า จุด charge ติดต่อกับ server และ mobile app ของเราอย่างไร เค้าสื่อสารผ่าน OCPP protocol กัน เราลองมาทำความเข้าใจกันดีกว่า
OCPP ( Open Charge Point Protocol ) คือมาตรฐานการสื่อสารระหว่าง OCPP client ( charger station ) และ OCPP server ( server ที่มีหน้าที่จัดการและรับส่งข้อมูลระหว่าง OCPP client ) สำหรับคนที่ยังไม่เคยชินกับ server - client architecture จะอธิบายให้เข้าใจง่ายๆ คือ ในระบบจะแบ่งกลุ่มของหน้าที่การทำงานในระบบออกเป็น สองกลุ่ม 1. Client คือกลุ่มของผู้รับบริการจาก server 2. Server คือกลุ่มของผู้ให้บริการในระบบ
กลับมาที่ OCPP server-client ที่เรากำลังสนใจอยู่
OCPP client จะอยู่ใน Charging point โดยผ่าน OCPP protocol ( ตอนนี้ 1.6 และ 2.0.1 )
คนที่เขียน program พอจะนึกภาพออกว่า ถ้าเราจะทำให้การสื่อสารระหว่าง client - server ให้ใกล้เคียงกับ realtime เราจะต้องใช้ web socket https://simplico.net/2022/04/30/web-socket-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3/
ให้คิดง่ายๆว่า เราเขียน web socket server - client ที่มี flow การทำงาน และ message ที่แลกเปลี่ยนกันระหว่าง server - client ให้เป็นไปตาม OCPP protocol แล้วเราจะรู้ได้อย่างไรว่าจะต้องเขียนอะไรบ้าง เราก็ไปดูที่
https://openchargealliance.org/my-oca/ocpp/ เราก็เลือก version ที่เราต้องการจะเขียน
ผมขอยกตัวอย่าง sequence diagram ใน pdf นะครับ
Charge Point คือฝั่ง client และ Central System คือฝั่งของ server
Charge Point ส่ง Authorize request มา โดยใน diagram นี้อ้างอิง message ที่ส่งมาใน request คือ idTag ( id ของ Charge point ในระบบของเรา ที่จะต้องไม่ซ้ำกับเครื่องไหนเลย ) พอ central system รับ request ก็จะทำ process หลังบ้านอะไรก็ตาม ( ตรงนี้ขึ้นอยู่กับว่าเราจะเขียนอย่างไร ต้องเข้าใจว่า protocol คือการกำหนดข้อตกลงการสื่อสาร แต่ไม่ได้ระบุว่าระบบที่เราบอกว่ารองรับ protocol นั้นๆ จะมีรายละเอียดการทำงานด้านหลังการสื่อสารนั้นๆ อย่างไร
จาก digram , central system ก็จะส่ง Authorize.conf กลับไปให้ client พร้อมกับ idTagInfo แล้ว idTagInfo เราก็ต้องไปค้นหาดูใน pdf เราก็จะพบว่า
มี data field แบบนี้ สำหรับคนเขียน python ก็ให้คิดว่าเป็น dictionary datatype เราจะสนใจ field ที่ required กันก่อนนะครับ ในที่นี้คือ status เราก็ต้องดูว่าต่อว่า AuthorizationStatus มีค่าอะไรบ้าง
เริ่มพอเห็นแสงสว่างกันแล้วใช่ไหมครับ ในส่วนนี้เราก็ลองคิดง่ายๆ ว่าเราจะ implement เป็น code อย่างไรดี
ผมว่า Accepted, Blocked, … พวกนี้เราก็เขียนเป็น enum ดีกว่า
ผมใช้ project นี้ตั้งต้น https://github.com/mobilityhouse/ocpp เราลองมาดู schema ของ project นี้ดีกว่าว่าเค้าเขียน idTagInfo และ authorizationStatus อย่างไร
พอเราเริ่มเห็น message schema แล้ว ขั้นต่อไปเราจะเขียน logic code อย่างไร
Code ด้านบนเป็น code ที่ผมลองเขียนเอง ลองไปศึกษา https://openchargealliance.org/my-oca/ocpp/ แต่ code ที่สำคัญคือพวก @on(ActionName) decorator ครับ จากในภาพเช่น @on(Action.Authorize) เราก็เขียน function ที่อย่างน้อยต้อง return idTagInfo พร้อมกับ authorize status ในที่นี้ผมใช้ accepted
ถ้าเราเขียนระบบจริงๆ code ส่วนนี้เราควรจะต้องทำอะไรล่ะ อย่างแรกเลยต้องตรวจว่า id_tag นี้อยู่ในระบบของเราหรือไม่ ถ้าใช่ก็ return status = accepted ไปครับ
วันนี้ผมจะพอแค่นี้ก่อนแล้วกันครับ ผมใช้อะไรในการ simulate charging point ครับ ผมใช้ตัวนี้ครับ
https://github.com/vasyas/charger-simulator ลองไปเล่นกันดูนะครับ
Articles
- การใช้เซ็นเซอร์ในฟาร์มผลไม้: เทคโนโลยีที่ช่วยแก้ไขปัญหาและเพิ่มประสิทธิภาพ
- เทคโนโลยีการเกษตรยุคใหม่: ช่วยเกษตรกรรุ่นใหม่แก้ไขปัญหาได้อย่างไร
- การพัฒนา Plugin สำหรับ Wazuh: เพิ่มความสามารถและการใช้งานที่หลากหลาย
- การใช้งาน Wazuh ในกรณีต่างๆ: การปกป้องและการตรวจสอบระบบอย่างมีประสิทธิภาพ
- แนะนำ Wazuh: ระบบความปลอดภัยและการตรวจสอบที่ครอบคลุม
- ตอนที่ 3: การผสานรวมการติดตามแบบเรียลไทม์ การรายงาน และการวิเคราะห์
- ตอนที่ 2: เจาะลึกคุณสมบัติของระบบการจัดการยานพาหนะ
- ตอนที่ 1: แนะนำระบบการจัดการยานพาหนะสำหรับธุรกิจรีไซเคิล
- SEO ( Search Engine Optimization ) ฉบับเข้าใจง่ายๆ
- ความสามารถของระบบ SimpiEcommerce ( ECommerce System )
- เราจะทำให้ program ที่มีขั้นตอนการทำงานที่ซับซ้อน และ ต้องแบ่งงานให้กับ programmer หลายๆ คนได้อย่างไร ?
- สร้าง business workflow process system ด้วย networkx.org
- วิธีการออกแบบเพื่อลดการซับซ้อนของ software
- Facebook Pixel ทำงานอย่างไร ?
- ข้อแนะนำพัฒนา E-Commerce Website ด้วย Shopify
- บางทีความรู้ก็เป็นสิ่งที่จำกัดความคิดสร้างสรรค์ได้เหมือนกัน
- Web Socket คืออะไร
- เทคนิคที่ช่วยให้เขียน program ให้ดีขึ้นอย่างรวดเร็ว
- มาสร้าง Blockchain ของเราเองกันเถอะ ( 2 ) , Mining
- มาสร้าง Blockchain ของเราเองกันเถอะ ( 1 )
- decentralized network system คืออะไร ?
- Blockchain Technology จะช่วยแก้ปัญหาของชาวสวนและผู้บริโภคได้อย่างไร ?
- เครื่องวัดอัตราไหลของน้ำด้วย Arduino และ YF-S201 Hall Effect Water Flow Meter Sensor
- เราจะเข้าใจ code ของ project ที่มีความซับซ้อนได้อย่างไร ?
- Photogrammetry และ Metaverse
- ทำแอปประชุม online ด้วย Zoom SDK และ Ionic mobile framework
- Smart Factory หรือ Industry 4.0 คืออะไร ?
- Live Sport Engagement Technology ช่วยเพิ่มประสบการณ์ของแฟนกีฬาได้อย่างไร
- 5 ข้อ ที่เข้าใจผิดในการเขียน code
- ERP ( Enterprise Resource Planning ) คืออะไร