MQTT กับงาน Industrial Internet of Things (IIoT)
MQTT กับงาน Industrial Internet of Things (IIoT)
MQTT (Message Queuing Telemetry Transport) เป็นโปรโตคอลสำหรับใช้ส่งข้อความระหว่างอุปกรณ์ โดยใช้โมเดลเน็ตเวิร์คแบบ publish-subscribe ซึ่งจะแตกต่างจากโปรโตคอลอื่นๆโดยส่วนมากที่ใช้โมเดล Server-Client ในการรับส่งข้อมูล ตัวโปรโตคอลรันอยู่บนเทคโนโลยี TCP/IP จึงทำให้การส่งข้อมูลนั้นไม่มีการ loss ระหว่างทาง MQTT ถูกพัฒนาขึ้นมาเพื่อใช้ในการส่งข้อมูลจากที่ห่างไกลซึ่งใช้แบนด์วิธของเน็ตเวิร์คน้อยมาก
หลักการทำงานของ MQTT
โปรโตคอล MQTT แบ่งบทบาทของอุปกรณ์ในเน็ตเวิร์คออกเป็น 2 ประเภท ได้แก่ Message Broker และ Client
MQTT Broker เป็นเซิฟเวอร์ซึ่งทำหน้าที่รับ Message ที่ส่งจาก Client ตัวหนึ่งและนำส่ง (Route) ไปยัง Client อีกตัวหนึ่ง MQTT Broker สามารถรันได้หลาย Platform ไม่ว่าจะเป็น Window, MAC OS, Linux, Ubuntu และ Raspberry Pi โดยที่เราสามารถสร้าง Broker ขึ้นใช้งานเอง (On-premises) เนื่องจากเป็น Open Source เช่น ในบทความนี้จะใช้ตัวติดตั้งจาก https://mosquitto.org/download/ หรือจะเช่าบริการจากผู้ให้บริการบนอินเตอร์เน็ต (On cloud) ก็ได้
MQTT Client เป็นอุปกรณ์ที่ทำหน้าที่ส่งข้อความไปยัง Broker และในขณะเดียวกันก็สามารถรับข้อความจาก Broker ได้ด้วย โดย Client นั้น อาจจะเป็นอุปกรณ์ประเภทใดก็ได้ เช่น Micro controller, PLC, Arduino, โทรศัพท์มือถือ รวมไปถึงคอมพิวเตอร์ด้วย ขอให้มี Library สำหรับรัน MQTT Client ได้
ด้วยโมเดลการเชื่อมต่อแบบ Publish-Subscribe ทำให้การวางเน็ตเวิร์คสำหรับ MQTT นั้นไม่จำเป็นต้องให้อุปกรณ์ทุกตัวอยู่บนเน็ตเวิร์ควงเดียวกัน หรือทำ VPN กัน เพียงแต่ทำให้ MQTT Broker อยู่บน IP Address ที่เป็น Public เพียงตัวเดียว ส่วน Client ตัวอื่นๆ ไม่จำเป็นต้องเป็น Public IP ขอเพียงแค่สามารถเข้าถึง Internet ได้ เพียงเท่านี้ Client1 ก็จะสามารถส่งข้อความหา Client2 ได้โดยที่ Client1 ไม่จำเป็นต้องเชื่อมต่อกับ Client2 โดยตรง แต่ใช้วิธีส่งหา Broker ที่ทำหน้าที่เป็นตัวกลางในการรับ-ส่งข้อมูลแทนนั่นเอง
การทำงานของ MQTT Client
MQTT Client นั้นจะมี Command ในการส่งไปยัง Broker ทั้งหมด 4 Command ได้แก่
การนำ MQTT มาใช้ในงาน IIoT
ตัวอย่างหนึ่งของการนำเอา MQTT มาใช้ นั่นคือ การทำระบบ Monitor / Control ระบบควบคุมผ่านอินเตอร์เน็ต ในตัวอย่างนี้จะใช้ PLC รุ่น Micro820 ซึ่งเป็น PLC ราคาย่อมเยาว์จากแบรนด์ Allen Bradley โดยที่ Rockwell Automation ได้พัฒนา Library ที่ทำให้ PLC ทำหน้าที่เป็น MQTT Client ได้ และ PLC ทำการต่ออินเตอร์เน็ตด้วย 3G Router ในส่วนของ User Interface ที่ใช้ Monitor / Control จะใช้แอพพลิเคชันในโทรศัพท์มือถือ ชื่อ IoT On OFF ซึ่งสามารถโหลดมาใช้งานได้ฟรี ทั้งใน iOS และ Android
ส่วน MQTT Broker ใช้ตัวติดตั้งจาก mosquito ติดตั้งบนคอมพิวเตอร์ที่ใช้ Window10 Pro
ขั้นตอนการติดตั้ง MQTT Broker
1. ดาวน์โหลดตัวติดตั้งสำหรับ Window 64bit จาก https://mosquitto.org/download/ แล้วทำการติดตั้งตาม Installation Wizard จากนั้นเช็ค Service ของ Broker ถ้ายังไม่อยู่ในสถานะ Running ให้ทำการ Start Service
2. กำหนด Firewall Inbound Rule สำหรับ Port 1883 (ในที่นี้จะขอข้ามวิธีการตั้งค่า Firewall)
3. ถ้าใช้ Internet บ้านหรือ Office ที่มี Public IP ให้ตั้งค่า Forward Port 1883 เข้ามาที่ IP Address ของเครื่อง Broker เช่น เครื่อง Broker อยู่ที่ IP 192.168.1.100 ตั้งค่า Virtual Server ใน Router ของ TP-Link ดังรูป
2. กำหนด Firewall Inbound Rule สำหรับ Port 1883 (ในที่นี้จะขอข้ามวิธีการตั้งค่า Firewall)
3. ถ้าใช้ Internet บ้านหรือ Office ที่มี Public IP ให้ตั้งค่า Forward Port 1883 เข้ามาที่ IP Address ของเครื่อง Broker เช่น เครื่อง Broker อยู่ที่ IP 192.168.1.100 ตั้งค่า Virtual Server ใน Router ของ TP-Link ดังรูป
บริเวณช่อง Host ให้ใส่ IP Address หรือชื่อ Domain Name สำหรับ Broker ที่จะใช้งาน Port ใช้ 1883 ซึ่งเป็นค่า Default และให้ปิดการใช้งาน SSL/TLS จากนั้นกดปุ่ม Ready เมื่อการเชื่อมต่อสำเร็จ Status จะขึ้นเป็น Connected
กลับไปที่หน้า Widget จากนั้นกดปุ่ม Edit
กดรูปเฟืองที่ Widget Trend เพื่อเข้าไปตั้งค่า Topic ที่จะ Subscribe
จากรูปจะเห็นว่า subscribe ไปที่ “+/garden/+/temperature” เราจะใช้ Topic นี้ในภายหลังใน PLC เครื่องหมาย + หมายถึง “Any” คือตรงนั้นจะเป็นคำว่าอะไรก็ได้ ส่วนใหญ่จะใช้เมื่อต้องการ Subscribe ไปยัง Topic ที่รับค่ามาจากหลายๆ Client ได้ เช่น ให้เครื่องหมาย + หน้าสุดแทนด้วยชื่อ Client ที่ทำการ Publish Message มาเป็นต้น
กดรูปเฟืองที่ Widget Switch เพื่อเข้าไปตั้งค่า Topic ที่จะ Publish (เนื่องจาก Switch เป็น Input object จึงใช้สำหรับ Publish ค่าไปยัง Topic ได้)
จากรูปจะเห็นว่า Publish ไปที่ Topic “garden/sim/lights” และเลือกให้ส่ง Prefix device name ไปใน Topic ด้วย ดังนั้น Topic ที่จะ Publish จริงๆ คือ “xxxxxx/garden/sim/lights” โดยที่ xxxxxxx เป็นชื่อ Device
การตั้งค่า MQTT Client ใน PLC Micro820
ขั้นตอนแรกให้โหลด Sample Code จาก
https://www.rockwellautomation.com/en-us/support/product/product-downloads/application-code-library/sample-code.html
สำหรับบล็อก RA_DNS_RESOLVE_HOST เป็นบล็อกสำเร็จรูปที่โหลดจากเว็ปไซต์ Sample Code เช่นเดียวกัน และนำมาใส่เพิ่มในกรณีที่ MQTT Broker เป็น Address ที่ไม่ใช่ IP Address เช่น ใช้ sonictc.ddns.net เป็นชื่อ Host name ของ Broker บล็อกนี้จะช่วยแปลงกลับให้เป็นเลข IP Address เพื่อนำค่าไปใช้ในบล็อก MQTT_Connect ต่อไป
Rung 1 เป็นส่วนการเชื่อมต่อด้วย MQTT Connect Command
ตัวแปรสำคัญ คือ
1. locServer ให้ใส่ IP Address ของ MQTT Broker และ Port ที่ใช้เชื่อมต่อ
2. clientName ให้ตั้งชื่อ Client ของเรา โดยตรงนี้จะตั้งชื่ออะไรก็ได้ แต่ที่ Broker จะสามารถตั้งค่าจำกัดได้ว่า client ที่จะทำการเชื่อมต่อต้องมี prefix ว่าอะไร เพื่อเพิ่มระดับความปลอดภัย เช่น client name ต้องขึ้นต้นด้วยคำว่า secure- เท่านั้นจึงจะทำการเชื่อมต่อได้ เป็นต้น
3. connectCmd เป็น บิทสำหรับสั่งให้เชื่อมต่อไปยัง Broker ลักษณะการทำงานเป็น Pulse ขอบขาขึ้น
4. disconnectCmd เป็น บิทสำหรับสั่งให้ตัดการเชื่อมต่อไปยัง Broker ลักษณะการทำงานเป็น Pulse ขอบขาขึ้น
5. userID จะใส่เมื่อ Broker มีการกำหนดความปลอดภัยให้ใส่ user และ password ด้วย
6. userPass จะใส่เมื่อ Broker มีการกำหนดความปลอดภัยให้ใส่ user และ password ด้วย
สถานะที่สำคัญ
1. socketSts จะบอกสถานะของการเชื่อมต่อ 9 หมายถึง เชื่อมต่อสำเร็จ
2. MQTTInstance หมายเลขของการเชื่อมต่อ ถ้าตัดการเชื่อมต่อแล้วต่อใหม่จะ random เปลี่ยนไปเรื่อยๆ
3. TopicName เป็น Array 10 ช่อง เก็บค่าชื่อของ Topic ที่ Subscribe ที่มี Data เข้ามา 10 ค่าล่าสุด
4. TopicData เป็น Array 10 ช่อง เก็บค่าของ Topic ที่ Subscribe ที่มี Data เข้ามา 10 ค่าล่าสุด
5. DataPointer เป็น Index บอกตำแหน่งของ Array ของ TopicName และ TopicData ที่จะโยนค่าต่อไปเข้าไปเก็บไว้
6. ResultData เป็นสถานะของการเชื่อมต่อ
Rung 2-4 เป็นส่วนที่ทำให้ PLC เป็น Subscriber นั่นคือ Command Subscriber/Unsubscribe ไปยัง Topic ที่กำหนด
ตัวแปรที่สำคัญ
1. topicName_input ใส่ชื่อ Topic ที่ต้องการจะ Subscribe โดยการใส่เครื่องหมาย + จะแทนค่าใดๆก็ได้ เช่น +/garden/+/lights หมายถึง Topic ที่ขึ้นต้นด้วยอะไรก็ได้ตามด้วย garden ตามด้วยอะไรก็ได้และตามด้วยคำว่า lights
2. subscribe/unsubscribe เป็น บิทที่ทำการสั่ง subscribe หรือ unsubscribe ไปยัง Topic ที่กำหนด โดยการทำงานจะมีลักษณะเป็น Pulse ขอบขาขึ้น ไม่ต้องค้างไว้
หลังจากมีคำสั่ง subscribe/unsubscribe บิทชื่อ subscribeCmd จะทำให้บล็อก MQTT_Subsribe ใน Rung4 ทำงานโดยอัตโนมัติ โดยเมื่อทำสำเร็จจะขึ้น Sts_Done เป็น True
สังเกตว่า MQTT_Subscribe จะทำงานก็ต่อเมื่อ socketSts = 9 คือเชื่อมต่อสำเร็จแล้วเท่านั้น
Rung 5-6 ทำให้ PLC ทำหน้าที่เป็น Publisher ข้อความไปยัง Broker
ตัวแปรที่สำคัญ
1. publish เป็น บิทสำหรับสั่งให้ทำการส่งข้อความไปยัง Broker
2. pubTopic_In ใส่ชื่อ Topic ที่ต้องการจะส่งข้อความไป ในตัวอย่างให้ใส่ micro800/garden/sim/temperature
3. pubData_In ใส่ข้อความที่ต้องการจะส่ง โดยที่ข้อความจะอยู่ในรูปแบบของ STRING เท่านั้น
หลังจากมีคำสั่ง publish แล้ว บิท publishCmd จะสั่งให้บล็อก MQTT_Publish ทำงาน
ก่อนจะดาวน์โหลดโปรแกรมลง PLC สิ่งสำคัญที่ทำให้ PLC ของเราเชื่อมต่ออินเตอร์เน็ตได้ก็คือ ใส่ IP Address ของ 3G Router ที่ Gateway setting ของ PLC ด้วย
ทดสอบการทำงานของ Application
1. Toggle Tag connectCmd และรอจน socketSts เป็น 9
2. ใส่ค่า pubTopic_In = “micro800/garden/sim/temperature” และ pubData_In = 20
จากนั้น Toggle Tag publish เพื่อส่งค่าไปยังมือถือ
3. ในแอพพลิเคชั่นจะแสดงค่า 20.0 C
4. ตั้งค่า topicName_input = “+/garden/+/lights” จากนั้น Toggle Tag subscribe
5. ทดลอง Toggle Switch เปิดปิด
6. ค่าที่ Subscribe จะเข้าไปอยู่ที่ Array Tag TopicData
จากตัวอย่าง จะเห็นว่าการประยุกต์ใช้ MQTT ใน PLC นั้นไม่ได้ยุ่งยากอย่างที่คิด และด้วยการลงทุนที่ต่ำ ทำให้ MQTT สามารถเป็นจุดเริ่มต้นในการพัฒนาเครื่องจักรให้ทันยุคสมัย ในยุคเทคโนโลยี 4.0 ด้วยข้อดีในแง่การใช้แบนด์วิธที่ต่ำ มีความคล่องตัวสูง และยังตอบโจทย์ในด้านความปลอดภัยของการรับ-ส่งข้อมูล โดยสามารถเพิ่มระดับ Security เข้าไปที่ Broker ได้ หรือจะประยุกต์ใช้ Cloud มาตรฐานอย่าง Microsoft Azure IoT hub หรือ Amazon AWS Greengrass ก็จะยิ่งเพิ่มความน่าเชื่อถือของระบบมากยิ่งขึ้นอีกด้วย
PLC ในท้องตลาดปัจจุบันยังไม่ค่อยมีรุ่นที่ทำออกมาเพื่อรองรับ MQTT โดยเฉพาะ แต่จะใช้เป็นลักษณะ Block สำเร็จรูปจากผู้ผลิต นำมาประยุกต์ให้ Ethernet Port สามารถสื่อสารด้วย MQTT ได้ หรือถ้าต้องการใช้ลดเวลาที่ใช้ในการเขียนโปรแกรม อาจพิจารณาใช้ Module เสริมสำหรับ PLC เช่น
Prosoft MVI56E-LDM ก็เป็นอีกหนึ่งโมดูลสำหรับ PLC รุ่น ControlLogix ที่รองรับการใช้งาน MQTT ได้
https://www.prosoft-technology.com/Products/Rockwell-Automation-In-chassis/Platform/ControlLogix/Linux-Development-Module-for-ControlLogix