วันอังคารที่ 27 มีนาคม พ.ศ. 2561

[PHP] รับ-ส่งข้อมูลผ่านโพรโทคอล MQTT


          กลับมาพบกับบทความเขียนโปรแกรมด้วยภาษา 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
          หลักการทำงานคือ อุปกรณ์ Client จะทำการเชื่อมต่อกับ Broker จากนั้นก็ทำการ subscribe หัวเรื่อง (Topic) หนึ่ง อุปกรณ์นั้นก็กลายเป็น Subscriber คอยรับข้อความจาก Broker เมื่ออุปกรณ์ตัวหนึ่งต้องการส่งข้อความไปหา Broker อุปกรณ์ตัวนั้นก็จะทำตัวเป็น Publisher ส่งข้อความไปให้ Broker โดยระบุหัวเรื่องติดไปด้วย เมื่อ Broker ได้รับข้อความก็จะทำการส่งข้อความเหล่านั้นไปให้ Client ที่ทำการสมัครหัวเรื่องนั้น ๆ ไว้อยู่

          เพื่อความเข้าใจที่มากยิ่งขึ้น เรามาดูอย่างกันดีกว่า สมมุติว่ามีเครื่อง 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 ได้ (ฮา) สำหรับบทความนี้ก็ขอจบลงเพียงเท่านี้ ไว้พบกันใหม่บทความหน้า บ๊ายบายครับผม 😄


Share:

1 ความคิดเห็น:

  1. ถ้าจะทำระบบให้สมัครสมาชิก ใช้งาน MQTT พอจะมีตัวอย่างไหมครับ สมาชิกสามารถเข้ามากำหนด topic ได้และการเชื่อมต่ออุปกรณ์ได้เอง แบบของ netpie

    ตอบลบ