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


วันจันทร์ที่ 19 มีนาคม พ.ศ. 2561

ติดตั้งโพรโทคอล Secure Shell สำหรับเชื่อมต่อกับ Server


          ห่างหายจากการเขียนบทความไปเสียนาน ช่วงนี้งานค่อนข้างเยอะทำให้ไม่มีเวลาเขียนบทความเพิ่มเลย หวังว่าเพื่อน ๆ จะยังไม่ลืมกันนะ (ฮา) สำหรับบทความนี้จะทำการติดตั้งโพรโทคอล Secure Shell (SSH) ซึ่งเป็นโพรโทคอล (Protocol) ที่ใช้ในการติดต่อสื่อสารระหว่างเครื่องคอมพิวเตอร์บนระบบเครือข่าย และอนุญาตให้ผู้ใช้งานสามารถควบคุมหรือสั่งการเครื่องคอมพิวเตอร์เครื่องนั้น ๆ ได้แม้จะไม่ได้อยู่ต่อหน้าเครื่อง

          โพรโทคอล SSH จะทำงานในลักษณะ Client และ Server ประกอบไปด้วยโปรแกรม 2 ส่วนคือ โปรแกรมส่วนของ Server ซึ่งจะติดตั้งลงบน Server หรือเครื่องที่ให้บริการ เป็นการเปิดช่องทางให้ผู้ใช้งานสามารถเข้ามาควบคุมการทำงานหรือสั่งการเครื่องที่ติดตั้งโปรแกรมนี้ได้ และโปรแกรมส่วนของ Client ซึ่งจะติดตั้งลงบนเครื่อง Client หรือเครื่องคอมพิวเตอร์ที่จะทำหน้าที่เป็นผู้เชื่อมต่อไปยังเครื่องที่ให้บริการ SSH โดยในบทความนี้เราจะใช้โปรแกรม PuTTy (ซึ่งเป็นโปรแกรมที่มีขนาดเล็ก) ทำงานในส่วนของ Client

          เริ่มต้นจากการติดตั้งโปรแกรม PuTTy ลงบนเครื่อง Client กันก่อน ให้เข้าไปดาวน์โหลดไฟล์โปรแกรมจากเว็บ Putty.org

กดเข้าที่ลิงค์ Download เพื่อไปหน้าดาวน์โหลดไฟล์
 
เลื่อนลงมาในส่วนของไฟล์ .exe แล้วเลือกไฟล์ที่ต้องการแล้วกดดาวน์โหลดโล้ด
 
พอดาวน์โหลดเสร็จจะได้ไอคอนประมาณนี้ กดใช้งานโปรแกรมได้เลย
 
หน้าตาโปรแกรมก็จะประมาณนี้
  
          หลังจากที่ทำการติดตั้ง PuTTy ลงบนเครื่อง Client เสร็จเรียบร้อยแล้ว ต่อไปจะเป็นการติดตั้งบนเครื่อง Server เพื่อไม่ให้เสียเวลางั้นเราก็มาเปิดเครื่อง Guest จาก VirtualBox และเริ่มติดตั้งกันเล้ยยยยย

หลังจากเปิดใช้งานแล้วก็ log-in ตาม user, password ที่ได้ตั้งค่าไว้ จากนั้นพิมพ์คำสั่งตามนี้
***** หมายเหตุ: แนะนำให้ log-in ด้วย root *****
 
apt-get update
apt-get upgrade
เพื่ออัพเดทฐานข้อมูลของแพ็กเก็จทั้งหมด จากนั้นก็พิมพ์คำสั่ง

apt-get install openssh-server
เพื่อติดตั้งโปรแกรม SSH ในส่วนของ Server

          หลังจากติดตั้งเสร็จแล้ว เราสามารถตั้งค่าเพื่อควบคุมการเชื่อมต่อของ SSH ในส่วน Client เพื่อเพิ่มความปลอดภัยและป้องกันผู้ไม่ประสงค์ดีเข้ามาเชื่อมต่อกับ Server ของเราได้ โดยทำการเปิดไฟล์ config ของ SSH ขึ้นมาด้วยคำสั่ง

vi /etc/ssh/sshd_config
หน้าจอจะแสดงการตั้งค่าพื้นฐานดังรูป
 

จะเห็นได้ว่ามีการตั้งค่าบางค่าไว้อยู่แล้วแต่มีการปิดไว้เป็นคอมเมนต์ด้วยตัวอักษร # นั่นหมายความว่าถ้าเราลบ # ออกก็จะเป็นการเปิดใช้งานการตั้งค่านั้น ๆ ซึ่งเราสามารถกำหนด Port ที่ใช้ในการเชื่อมต่อได้ เราจะเห็นการค่าของ Port โดยค่าตั้งต้นคือ 22 ให้เรากดคีย์บอร์ด i เพื่อเข้าสู่โหมดแก้ไขเอกสาร ทำการลบ # ออกแล้วแก้ไขตัวเลข 22 เป็น 123 จากนั้นให้เพิ่ม MaxAuthTries เท่ากับ 2 เพื่อกำหนดจำนวนครั้งในการล็อกอินผิดพลาด (ถ้าล็อกอินผิด 2 ครั้ง Server จะตัดการเชื่อมต่อออกไป) และเพิ่ม AllowUsers ตามด้วยชื่อ user ที่อนุญาตให้เชื่อมต่อ

Port หมายเลขพอร์ตที่ใช้ในการเชื่อมต่อ
MaxAuthTries จำนวนครั้งที่อนุญาตให้ล็อกอินผิด
AllowUsers ชื่อผู้ใช้งานที่อนุญาตให้เชื่อมต่อ
จากนั้นก็กดปุ่ม esc บนคีย์บอร์ดเพื่อออกจากโหมดแก้ไขเอกสาร แล้วพิมพ์ :wq เพื่อบันทึกและออกจากไฟล์ตั้งค่า หลังจากนั้นก็ให้เราพิมพ์คำสั่ง

service ssh restart
เพื่อทำการรีสตาร์ท service ให้ใช้การตั้งค่าล่าสุด ถัดไปเราก็จะใช้โปรแกรม PuTTy ในส่วน Client เข้ามาเชื่อมต่อ แต่ก่อนหน้านั้นเราต้องรู้ IP address ของเครื่อง Server ก่อน ด้วยการพิมพ์คำสั่ง

ip addr show
เพื่อแสดง IP address ที่จะใช้ในการเชื่อมต่อ


ให้เปิดโปรแกรม PuTTy ในส่วน Client ขึ้นมา

กรอกค่า IP address และแก้ไขค่า Port ให้ตรงตามค่าที่ได้กำหนดไว้เมื่อสักครู่
 
พิมพ์ username กับ password เพื่อเชื่อมต่อเข้าสู่ Server
(จะต้องใช้ Account ตามที่เราตั้งค่าไว้ในไฟล์ SSH config)

          พอเชื่อมต่อเข้าสู่ Server ได้สำเร็จ เราก็สามารถสั่งการเครื่องได้ทันที แต่การเชื่อมต่อจากภายนอกแบบนี้จะไม่สามารถใช้ Account root ในการล็อกอินได้