กลับมาพบกับบทความเขียนโปรแกรมด้วยภาษา PHP กันอีกครั้ง ในบทความนี้เราจะมาเขียนโปรแกรมเพื่อใช้งานโพรโทคอล MQTT ในการสื่อสารกัน แล้วโพรโทคอล MQTT คืออะไร? .....ปกติแล้วเราจะใช้โพรโทคอล HTTP (HyperText Transfer Protocol) ในการแลกเปลี่ยนข้อมูลกันระหว่างคอมพิวเตอร์ โดยโพรโทคอลตัวนี้ถูกออกแบบมาให้มีความกระทัดรัด ทำงานได้รวดเร็วและไม่ซับซ้อน สามารถรองรับข้อมูลได้ทุกแบบ มีการแบ่งการทำงานออกเป็น 2 ฝั่ง ได้แก่ ฝั่ง Server และฝั่ง Client โดยฝั่ง Client จะทำการส่ง request ไปที่ Server เพื่อทำการประมวลและส่งข้อมูลตอบกลับ Client แต่โพรโทคอล MQTT จะมีรูปแบบการทำงานที่แตกต่างออกไป
โพรโทคอล Message Queuing Telemetry Transport หรือ MQTT เป็นโพรโทคอลที่ถูกออกแบบมาเพื่อการเชื่อมต่อแบบ M2M (machine-to-machine) หรือพูดง่าย ๆ ก็คือเป็นโพรโทคอลที่ใช้ในการสื่อสารระหว่างอุปกรณ์กับอุปกรณ์ มีน้ำหนักเบา ใช้รับส่งข้อมูลในเครือข่ายที่มีขนาดเล็ก แบ่งการทำงานออกเป็น 2 ฝั่ง ได้แก่ ฝั่ง Server และฝั่ง Client โดย
- ฝั่ง Server: คือเครื่องที่ทำหน้าที่เป็นตัวกลางคอยจัดการการรับส่งข้อมูลระหว่าง Client ต่าง ๆ ซึ่งในที่นี้จะเรียกว่า Broker
- ฝั่ง Client: คือเครื่องหรืออุปกรณ์ที่เชื่อมต่อและต้องการรับ-ส่งข้อมูลกับ Broker โดยจะแบ่งออกเป็นเครื่องที่ทำหน้าที่เป็น Publisher และเครื่องที่ทำหน้าที่เป็น Subscriber
- Publisher: เป็นเครื่องหรืออุปกรณ์ที่ทำหน้าที่คอยส่งข้อมูลไปให้ Broker
- Subscriber: เป็นเครื่องหรืออุปกรณ์ที่ทำหน้าที่คอยรับข้อมูลจาก Broker
เพื่อความเข้าใจที่มากยิ่งขึ้น เรามาดูอย่างกันดีกว่า สมมุติว่ามีเครื่อง MQTT Broker และอุปกรณ์ Client ที่เชื่อมต่อกับ Broker อยู่ 3 ตัว (ได้แก่ A1, A2 และ A3) อันดับแรก A1, A2 ทำการสมัครเป็นสมาชิกของหัวเรื่อง S1 และเมื่อ A1 ทำการส่งข้อความในหัวเรื่อง S1 ไปให้ Broker แล้ว Broker ก็จะทำการส่งข้อความนั้นไปให้กับอุปกรณ์ที่เป็นสมาชิกของหัวเรื่อง S1 นั่นคือ A2 (สาเหตุที่ A3 ไม่ได้รับข้อความด้วยเป็นเพราะ A3 ยังไม่ได้สมัครเป็นสมาชิกของหัวเรื่อง S1)
หลังจากนั้น A3 ก็ทำการสมัครเป็นสมาชิกของหัวเรื่อง S1 เมื่อ A1 ทำการส่งข้อความในหัวเรื่อง S1 ไปให้ Broker เจ้า Broker ก็จะทำการส่งข้อความต่อให้กับ A2 และ A3 ที่เป็นสมาชิกในหัวเรื่อง S1
ถึงตรงนี้เพื่อน ๆ ก็คงจะพอเข้าใจหลักการทำงานของโพรโทคอล MQTT กันอย่างคร่าว ๆ แล้ว และด้วยคุณสมบัติของเจ้าโพรโทคอลนี้ มันจึงเหมาะที่จะนำไปใช้ในเทคโนโลยี IoT (Internet of Things หรือ "อินเทอร์เน็ตของสรรพสิ่ง") ซึ่งเป็นเทคโนโลยีที่ใช้ในการติดต่อสื่อสารกันระหว่างอุปกรณ์ เช่น โทรศัพท์มือถือ รถยนต์ หลอดไฟ เป็นต้น ผ่านเครือข่ายอินเทอร์เน็ต โดยจะส่งผลให้มนุษย์เราสามารถเข้าถึงอุปกรณ์เหล่านั้นจากที่ไหนก็ได้ เพื่อเช็คสถานะหรือควบคุมสั่งการต่าง ๆ เช่น การสั่งเปิด-ปิดไฟภายในบ้านจากห้างสรรพสินค้า เป็นต้น
ติดตั้งโปรแกรม Mosquitto เพื่อใช้งานโพรโทคอล MQTT
ณ จุดนี้เพื่อน ๆ ก็คงพอจะเห็นภาพของโพรโทคอล MQTT กันไปบ้างแล้ว ถัดไปเราจะมาลองใช้งานโพรโทคอลตัวนี้กัน เพราะงั้นเราก็มาติดตั้ง MQTT Broker กันก่อน ซึ่งก็มีผู้พัฒนา MQTT Broker อยู่หลายค่าย ไม่ว่าจะเป็น HiveMQ, Mosquitto, Eclipse IoT เป็นต้น และในบทความนี้ เราจะทำการติดตั้ง Mosquitto ลงใน Server จำลอง (Virtual Machine) แต่ถ้าเพื่อน ๆ คนไหนมี Server จริงอยู่แล้วก็สามารถติดตั้งลง Server จริงได้เลย (ส่วนเพื่อน ๆ ที่ยังไม่ได้สร้าง Server จำลอง ให้ลองย้อนกลับไปอ่านบทความ วิธีสร้างคอมพิวเตอร์เสมือนด้วย VirtualBox และบทความ วิธีตั้งค่า Ubuntu Server ให้ใช้งานเป็น Web Server ก่อน)
หลังจากเปิดใช้งาน VirtualBox แล้วก็ log-in ตาม user, password ที่ได้ตั้งค่าไว้ จากนั้นพิมพ์คำสั่งตามนี้
***** หมายเหตุ: แนะนำให้ log-in ด้วย root *****
apt-add-repository ppa:mosquitto-dev/mosquitto-ppa apt-get update apt-get upgradeเพื่ออัพเดทฐานข้อมูลของแพ็กเก็จทั้งหมด จากนั้นก็พิมพ์คำสั่ง
apt-get install mosquito apt-get install mosquitto-clientsเพื่อติดตั้งโปรแกรม Mosquitto .....หลังจากติดตั้งเสร็จแล้วให้ทำการสร้าง user เพื่อเข้าใช้งาน โดยการพิมพ์คำสั่ง
mosquitto_passwd -b /etc/mosquitto/pwfile ชื่อผู้ใช้งาน รหัสผ่าน service mosquitto restartเท่านี้เราก็ติดตั้งโปรแกรม Mosquitto สำหรับเรียกใช้งานโพรโทคอล MQTT เสร็จเรียบร้อยแล้ว
เขียนโปรแกรม PHP เพื่อใช้งานโพรโทคอล MQTT
ถึงจุดนี้ เราก็พร้อมที่จะเขียนโปรแกรมด้วยภาษา PHP เพื่อใช้งานโพรโทคอล MQTT แล้ว โดยไฟล์ที่เราจะเขียนแบ่งออกเป็น 2 ไฟล์ ได้แก่ publish.php (ไฟล์ที่ทำหน้าที่เป็น publish ไว้คอยส่งข้อมูล) และ subscribe.php (ไฟล์ที่ทำหน้าที่เป็น subscribe ไว้คอยรับข้อมูล) แต่ก่อนจะเริ่มเขียนโค้ด เรามาเช็ค ip address ของเครื่องจำลองกันก่อน ด้วยคำสั่ง
ip addr show
จากตัวอย่างเป็น ip 192.168.3.238 ให้จดเอาไว้ก่อน จากนั้นให้เราเข้าไปดาวน์โหลดไฟล์ phpMQTT.php มาจาก https://github.com/bluerhinos/phpMQTT/blob/master/phpMQTT.php และเมื่อดาวน์โหลดเสร็จแล้วให้เปิดไฟล์ขึ้นมา
แล้วลบบรรทัด namespace Bluerhinos; ออกไป ถัดไปให้สร้างไฟล์ subscribe.php โดยการพิมพ์โค้ดดังนี้
<?php require("phpMQTT.php"); $server = "192.168.3.238"; Server ip address $port = 1883; $username = "yyy"; username ที่ได้สร้างไว้ตอนตั้งค่า MQTT Broker $password = "zzz"; password ที่ได้สร้างไว้ตอนตั้งค่า MQTT Broker $client_id = "Client-".rand(); $mqtt = new phpMQTT($server, $port, $client_id); if( !$mqtt->connect(true, NULL, $username, $password) ) { exit(1); } $topics['test/topic'] = array("qos" => 0, "function" => "procmsg"); $mqtt->subscribe($topics, 0); while($mqtt->proc()){ } $mqtt->close(); function procmsg($topic, $msg){ echo "Recieved at: " . date("Y-m-d H:i:s", time()) . "\n"; echo "Topic: {$topic}\n"; echo "Message: $msg\n\n"; } ?>โดยเราจะต้องรันไฟล์นี้ไว้เพื่อรอรับข้อมูลจากไฟล์ publisher และเพื่อไม่ให้เป็นการเสียเวลา เราก็มาคัดลอกโค้ดข้างล่างไปใช้สร้างไฟล์ publish.php เพื่อส่งข้อมูลกันเลย
<?php require("phpMQTT.php"); $server = "192.168.3.238"; Server ip address $port = 1883; $username = "yyy"; username ที่ได้สร้างไว้ตอนตั้งค่า MQTT Broker $password = "zzz"; password ที่ได้สร้างไว้ตอนตั้งค่า MQTT Broker $client_id = "Client-".rand(); $mqtt = new phpMQTT($server, $port, $client_id); if ($mqtt->connect(true, NULL, $username, $password)) { $mqtt->publish("test/topic", "Hello World! This is message from publisher.", 0); $mqtt->close(); } else { echo "Time out!\n"; } ?>อย่าลืมแก้ไขค่า username และ password ให้ตรงตามที่ได้ตั้งค่าไว้ตอนติดตั้ง MQTT Broker นอกจากนี้ไฟล์ phpMQTT.php, subscribe.php และ publish.php จะต้องอยู่ในพาทเดียวกัน
หลังจากที่ได้ไฟล์ครบทั้ง 3 ไฟล์เรียบร้อยแล้ว ขั้นตอนถัดไปเราก็ต้องอัพโหลดไฟล์ทั้งหมดไปยัง Server จำลอง ด้วยโปรแกรม FileZilla (เพื่อน ๆ คนไหนยังไม่ได้ติดตั้ง FileZilla ขอให้ย้อนกลับไปอ่านในบทความ วิธีติดตั้งและกำหนดค่า FTP เพื่อใช้สำหรับโอนไฟล์ ก่อนจ้าาาาา) เมื่อเชื่อมต่อกับ Server จำลองเรียบร้อยแล้วให้ย้ายไปยังพาท /var/www/html และสร้างโฟลเดอร์ที่ชื่อ test_mqtt ขึ้นมา จากนั้นก็อัพโหลดไฟล์ทั้งหมดไปยังพาทที่เพิ่งสร้างขึ้น
เมื่อเราลงโปรแกรม Mosquitto และอัพโหลดไฟล์ทั้งหมดเรียบร้อย เท่านี้ก็...ไฟล์พร้อม! Server พร้อม! ทุกอย่างพร้อม! เรามาเริ่มรันโปรแกรมเพื่อใช้งานโพรโทคอลกันเล้ยยยยย! เริ่มจากล็อกอินเข้า Server จำลองใน VirtualBox และย้ายไปยังพาทที่เก็บไฟล์ด้วยคำสั่ง
cd /var/www/html/text_mqttแล้วต่อด้วยคำสั่งสำหรับรันไฟล์ subscribe.php เพื่อให้โค้ดทำงาน
php subscribe.php
จะเห็นได้ว่าเมื่อไฟล์ subscribe.php ทำงาน ก็จะอยู่ในสภาพรอรับข้อมูลจาก publisher ก็ให้เราใช้โปรแกรม PuTTy เพื่อเชื่อมต่อเข้าไปยัง Server จำลองเพื่อสั่งทำงานไฟล์ publish.php (เพื่อน ๆ คนไหนยังไม่ได้ติดตั้ง PuTTy ก็สามารถย้อนกลับไปอ่านวิธีติดตั้งได้ที่บทความ ติดตั้งโพรโทคอล Secure Shell สำหรับเชื่อมต่อกับ Server ก่อน) เปิดโปรแกรม PuTTy ขึ้นมา กรอกค่า IP address และ Port แล้วกดเชื่อมต่อ Server
พิมพ์ username กับ password เพื่อเข้าใช้งาน Server ย้ายไปยังพาทที่เก็บไฟล์ด้วยคำสั่ง
cd /var/www/html/text_mqttแล้วต่อด้วยคำสั่งสำหรับรันไฟล์ publish.php เพื่อให้โค้ดทำงาน
php publish.php
เมื่อเราสั่งรันไฟล์ publish.php เรียบร้อยแล้ว ในหน้าจอที่รันไฟล์ subscribe.php ก็จะแสดงข้อความจากไฟล์ publish.php ขึ้นมา โดยการส่งข้อความผ่านโพรโทคอล MQTT
พอถึงตรงนี้เพื่อน ๆ น่าจะพอเข้าใจโพรโทคอล MQTT ขึ้นมาบ้างแล้ว ซึ่งในบทความนี้ได้แสดงการเขียนโปรแกรมสื่อสารกันภายในเครื่อง Server จำลองเดียวกัน (เพราะไฟล์ที่ส่งข้อมูลกับไฟล์ที่รับข้อมูลอยู่บนเครื่องเดียวกัน) ซึ่งผมคาดหวังว่าบทความนี้จะเป็นประโยชน์ ช่วยทำให้เพื่อน ๆ เข้าใจพื้นฐานการทำงานของโพรโทคอล MQTT และสามารถนำไปประยุกต์ต่อยอดเขียนโปรแกรมบนบอร์ดไมโครคอนโทรลเลอร์ให้สื่อสารกับเครื่อง Server ได้ (ฮา) สำหรับบทความนี้ก็ขอจบลงเพียงเท่านี้ ไว้พบกันใหม่บทความหน้า บ๊ายบายครับผม 😄
ถ้าจะทำระบบให้สมัครสมาชิก ใช้งาน MQTT พอจะมีตัวอย่างไหมครับ สมาชิกสามารถเข้ามากำหนด topic ได้และการเชื่อมต่ออุปกรณ์ได้เอง แบบของ netpie
ตอบลบ