การติดตั้ง Mosquitto ให้กับ Raspberry Pi 3 Model B+ เพื่อใช้เป็น MQTT Server

MQTT คืออะไร ?

MQTT ย่อมาจาก Message Queuing Telemetry Transport เป็น Protocol ที่ออกแบบมาเพื่อการเชื่อมต่อแบบ M2M (machine-to-machine) หรือก็คืออุปกรณ์กับอุปกรณ์ด้วยกันเอง MQTT ถูกออกแบบโดยใช้สถาปัตยกรรมแบบ Client/Server ซึ่งมี topology แบบ hub-and-spoke ผ่านเครือข่าย TCP/IP เป็นหลัก ทำให้สามารถเชื่อมโยงการสื่อสารกับอุปกรณ์ต่าง ๆ ได้ผ่านเครือข่ายอินเทอร์เน็ต โดยที่ MQTT Protocol นี้จะมีน้ำหนักเบามากกว่าการใช้ HTTP Protocol มากเพราะออกแบบมาเพื่อใช้งานกับอุปกรณ์อิเล็กทรอนิกส์ขนาดเล็กโดยเฉพาะ ใช้ Bandwidth ต่ำ โดยใช้หลักการ Publisher / Subscriber ผ่านตัวกลางที่เรียกว่า Broker

ภาพแสดงความสำพันธ์ระหว่าง Publish, Broker, Subscribe

จากภาพ เราจะมีอุปกรณ์วัดค่าอุณหภูมิที่ลงทะเบียนเป็น Publish ชื่อว่า Temperature กับ MQTT-Broker (มันก็จะคล้าย ๆ Web Server นะแหละ) แล้วมีอุปกรณ์สองตัวคือ Laptop กับ Mobile device ที่ทำการ Subscribe กับ Publish ที่ชื่อว่า Temperature นี้ เมื่อตัวอุปกรณ์วัดค่าอุณหภูมิได้ค่ามา 21 องศา ก็จะทำการส่งข้อมูลนี้ไปที่ MQTT-Broker จากนั้น MQTT-Broker ก็จะส่งค่าอุณหภูมินี้ไปยังอุปกรณ์ทุกตัว ที่ทำการ Subscribe กับ Publish ที่ชื่อว่า Temperature นี้ หรือก็คือ Laptop กับ Mobile device ก็จะได้รับข้อมูลอุณหภูมินี้เหมือนกัน

Client => Publish/Subscribe
Server => Broker

Mosquitto คืออะไร ?

Eclipse Mosquitto เป็น open source (EPL/EDL licensed) ที่ใช้สำหรับทำเป็น Broker ในระบบ MQTT Protocal ซึ่งติดตั้งและใช้งานได้ง่าย ซึ่งปัจจุบันอยู่ที่เวอร์ชั่น 3.1.1 (05/09/2018)

https://mosquitto.org/

มาเริ่มติดตั้งกันเลย

  1. เปิด Terminal

2. กำหนดค่า repository ของ mosquitto โดยพิมคำสั่ง

sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-stretch.list

3. ทำการ update ระบบ

sudo apt-get update
sudo apt-get upgrade

4. ตรวจสอบว่าพบ mosquitto package ไหม

sudo apt-cache search mosquitto

5. ติดตั้ง mosquitto

sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients

6. แก้ไขไฟล์คอนฟิกเกอเรชั่น โดยพิมพ์

sudo nano /etc/mosquitto/mosquitto.conf 

แล้วกดปุ่ม Enter จะปรากฏหน้าต่าง Text Editor กดปุ่ม ↓ บนคีย์บอร์ด จนกระทั่งเคอร์เซอร์ เลื่อนลงไปอยู่บรรทัดสุดท้ายในไฟล์ แล้วลบบรรทัดสุดท้ายทิ้งไป (include config.d) แล้วป้อนบรรทัดใหม่ 3 บรรทัดดังนี้

allow_anonymous false
password_file /etc/mosquitto/pwfile
listener 1883

7. บันทึกการเปลี่ยนแปลงในไฟล์ โดยกดปุ่ม Ctrl+O เมื่อปรากฏชื่อไฟล์ ให้กดปุ่ม Enter เพื่อยอมรับ แล้วออกจากเทกซ์อิดิทเตอร์ โดยกดปุ่ม Ctrl+X จะปรากฏบรรทัดรอรับคำสั่ง

8. สร้างยูสเซอร์ชื่อ mymqtt และกำหนดพาสเวิร์ดเป็น myraspi หรือพาสเวิร์ดอื่นๆ เก็บไว้ใน pwfile โดยป้อนคำสั่ง

sudo mosquitto_passwd -c /etc/mosquitto/pwfile mymqtt
Password: myraspi
Reenter password: myraspi

9. ติดตั้ง Mosquitto เสร็จเรียบร้อยแล้ว แต่จะต้องบูทเครื่องใหม่ เพื่อให้ Mosquitto เริ่มทำงาน โดยป้อนคำสั่ง

sudo reboot

10. เริ่มทดสอบการทำงานของ MQTT Server หรือ Mosquitto

11. เปิด Terminal มา 2 หน้าต่าง

12. Terminal หน้าต่างแรก ใช้เป็น Subscribe ที่รอรับข้อมูล Topic ชื่อ mynew/test

mosquitto_sub -d -u mymqtt -P myraspi -t mynew/test

13. Terminal หน้าต่างที่สอง ใช้เป็น Publish ส่งข้อมูล Topic ชื่อ mynew/test

mosquitto_pub -d -u mymqtt -P myraspi -t mynew/test -m “ทดสอบ”

14. เราจะเห็นว่าข้อความตัวอักษร “ทดสอบ” ปรากฏบนหน้าต่าง Subscribe แสดงว่าการส่งข้อมูลข้ามไปยังอีกหน้าต่างหนึ่งทำงานได้อย่างถูกต้อง ซึ่งแสดงให้เห็นว่า MQTT Server หรือ Broker นั้นทำงานอย่างถูกต้อง

15. ทดลองใช้ Mobile เป็น Subscribe โดยเข้า Play Store แล้วโหลดโปรแกรม MQTT Dashboard

16. สร้าง Session โดยกำหนดเป็น

Client ID: myhome
Server: 192.168.1.101
Port: 1883
User Name: mymqtt
Password: myraspi
แล้วเลือก Create

17. กดเข้าไปยัง Session myhome แล้วสร้าง Subscribe โดยกำหนดค่าดังนี้

Friendly name: test mqtt
Topic: mynew/test
แล้วเลือก Create

18. กลับมาที่หน้าต่าง Terminal Publish แล้วทำการส่งข้อมูลอีกครั้ง

mosquitto_pub -d -u mymqtt -P myraspi -t mynew/test -m “ทดสอบ”

จะพบว่ามีคำว่า ทดสอบ ถูกส่งไปยัง Subscribe Mobile และ Subscribe Terminal พร้อมๆ กัน

19. เป็นอันว่าติดตั้งเครื่อง MQTT Server สมบูรณ์แล้ว

>>ต่อ NodeMCU เป็น Publish ติดต่อกับ Raspberry Pi (MQTT Server)