LAB3 — [M1] — Mosquitto MQTT Broker on Raspberry Pi
LAB3 — [M2] — Blynk Broker on Raspberry Pi : link
MQTT คืออะไร
MQTT ย่อมาจาก Message Queuing Telemetry Transport เป็นโปรโตคอล machine-to-machine (M2M) ใช้ในงาน IOT (Internet of Things) ออกแบบมาให้มี ขนาด package ที่มีขนาดเล็กมาก ให้ทําการ publish (ส่งข้อมูล) และ Subscribe (ติดตามข้อมูล) ไปยังตัว Server ที่เรียกกันว่า MQTT Broker ซึ่งตัว Server จะทําหน้าที่จัดคิวของข้อมูลต่างๆ ให้มีประสิทธิภาพสูงสุด
Mosquitto MQTT
สาเหตุที่เราเลือกใช้ Mosquitto MQTT และทํา Server เองนั้นก็เนื่องจากว่าจริงๆ แล้วมีการให้บริการ MQTT Server ฟรีอย่างมากมายในปัจจุบันทั้งในรูปแบบฟรีและ ไม่ฟรี ซึ่งปัญหาที่ตามมาก็คือ บาง Server มีที่ตั้งของ Server อยู่ไกลมากอีกฟากนึงของโลก การทํา Publish ข้อมูล และ Subscrite นั้นทําให้เกิดการ Delay เกิดขึ้น และ อีกสาเหตุ ก็คือ บางผู้ให้บริการ จะมีการจํากัดจํานวน Client จํากัดจํานวนการส่งข้อมูล หรือไม่ก็จํากัด การใช้งาน Application ซึ่งจะทําให้เราขยายและต่อยอด ออกไปในอนาคตไม่ได้ ส่วนสาเหตุที่เลือก ตัว Raspberry Pi เป็น Server ก็เนื่องมาจากว่า ตัว MQTT Broker นั้นทําหน้าทีคอยจัดการ messege ที่มีขนาดเล็กดังนั้นตัว Raspberry Pi จึง สามารถเชื่อมต่ออุปกรณ์ Client ได้เป็นพันๆ Client ซึ่งนับว่าค่อนข้างเยอะเลยทีเดียว ซึ่งถ้าเทียบกับการที่เราเอามาทดลองและเอามาใช้งานเองนั้น ก็ถือว่าเพียงพอต่อความต้องการของเราแล้ว
Install MQTT
- เปิด 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 “Test MQTT”
14. เราจะเห็นว่าข้อความตัวอักษร “Test MQTT” ปรากฏบนหน้าต่าง Subscribe แสดงว่าการส่งข้อมูลข้ามไปยังอีกหน้าต่างหนึ่งทำงานได้อย่างถูกต้อง ซึ่งแสดงให้เห็นว่า MQTT Server หรือ Broker นั้นทำงานอย่างถูกต้อง
15. ทดลองใช้ MQTTLens เป็น Subscribe โดยเข้า www.google.com แล้วโหลดโปรแกรม MQTTLens
หรือ ดาวน์โหลด MQTT Lens ที่นี่
16. เข้าไปใน application MQTTlens จากนั้นให้เพิ่มการเชื่อมต่อแล้วคลิกที่ Connections
17. สร้าง Publish และ Subscribe โดยกำหนดเป็น
1. name = อะไรก็ได้
2. RPi IP,Port = 1883
3. UserName = mymqtt, Password = myraspi
เมื่อกรอกเสร็จแล้ว ให้กด CREATE CONNECTION
18. เมื่อสร้างเสร็จแล้วมากำหนด Publish และ Subscribe
1. Topic = mynew/test, และกดปุ่ม Subscribe2. Topic = mynew/test, ใส่ในช่อง Massage = “ABCDEF” และกดปุ่ม Publish
จะเห็นผลลัพธ์เมื่อเรากดปุ่ม PUBLISH แล้วมันจะส่งข้อความเข้าที่ Pi ของเราที่เปิดไว้
19. กลับมาที่หน้าต่าง Terminal Publish แล้วทำการส่งข้อมูลอีกครั้ง
$ mosquitto_pub -d -u mymqtt -P myraspi -t mynew/test -m “Hello!”
จะพบว่ามีคำว่า “Hello!” ถูกส่งไปยัง MQTTLens และ Subscribe Terminal พร้อมๆ กัน
20. วิธีถอนการติดตั้ง Mosquitto MQTTBroker
$ sudo apt-get purge mosquittoor อันนี้ลบออกชัวร์ $ sudo apt-get --purge remove mosquitto
- *******เป็นอันว่าติดตั้งเครื่อง MQTT Server สมบูรณ์แล้ว********
ทดสอบ MQTT Broker
การทดลองที่ 1 Test MQTT Lens และ ESP32 โดยใช้ broker.hivemq.com
เราจะใช้ broker.hivemq.com เพื่อทดสอบการติดต่อ
ฝั่ง ESP32
- เพิ่ม Library ของ MQTT ที่ Arduino
โหลด Library ที่นี่
https://github.com/knolleary/pubsubclient/archive/v2.6.zip
หรือโหลดในโปรแกรม Arduino ไปที่ Sketch -> Include Library -> Manage Lib search = PubSubClient
2. แล้วพิมพ์โค้ดที่ให้ในโปรแกรม Arduino เพื่อทดสอบการติดต่อ
เมื่อเสร็จแล้วให้อัพโหลดลงบอร์ด ในการทดลองนี้ใช้ DOIT ESP32 DEVKIT V1
ฝั่ง MQTT Lens
3. กำหนด Host
- name = อะไรก็ได้
- Hostname = broker.hivemq.com
- Port = 1883
- กดปุ่ม CREATE CONNECTION
4. เมื่อสร้างเสร็จแล้วมากำหนด Publish และ Subscribe
1. Topic = Test_SUT, และกดปุ่ม Subscribe2. Topic = Test_SUT, ใส่ในช่อง Massage = “Hello” และกดปุ่ม Publish
เมื่อกด Subscribe แล้วจะขึ้นข้อความ hello world #1…n ไปเรื่อย ๆ ทุก ๆ 2 วินาที
นี่คือหน้า Serial Monitorของ ESP32 จะรัน Publish ส่งข้อความไปที่ MQTT Lens ไปเรื่อยๆ เช่นกัน
5. ต่อวงจรดังนี้
ถ้าเรา Publish ข้อความ “o” = LED GPIO 2 จะติด หรือ “f” LED GPIO 2 จะดับ
การทดลองที่ 2 ใช้ MQTT Lens และ ESP32 ในการทดสอบ Mosquitto MQTT Broker บน Raspberry Pi
ในการทดลองนี้เราจะทดลองในการสร้าง Broker ไว้ที่ raspberry Pi แล้วจะใช้ ESP32 และ MQTT ในการติดต่อกัน
1. เริ่มทดสอบการทำงานของ MQTT Server หรือ Mosquitto
2. Terminal หน้าต่างแรก ใช้เป็น Subscribe ที่รอรับข้อมูล Topic ชื่อ new_test
$ mosquitto_sub -d -u mymqtt -P myraspi -t new_test
3. Terminal หน้าต่างที่สอง ใช้เป็น Publish ส่งข้อมูล Topic ชื่อ new_test เพื่อทดสอบก่อน
$ mosquitto_pub -d -u mymqtt -P myraspi -t new_test -m “Test MQTT”
4. เราจะเห็นว่าข้อความตัวอักษร “Test MQTT” ปรากฏบนหน้าต่าง Subscribe แสดงว่าการส่งข้อมูลข้ามไปยังอีกหน้าต่างหนึ่งทำงานได้อย่างถูกต้อง ซึ่งแสดงให้เห็นว่า MQTT Server หรือ Broker นั้นทำงานอย่างถูกต้อง
ฝั่ง MQTT Lens
5. สร้าง Publish และ Subscribe ใน MQTT Lens โดยกำหนดเป็น
1. name = อะไรก็ได้
2. RPi IP,Port = 1883
3. UserName = mymqtt, Password = myraspi
เมื่อกรอกเสร็จแล้ว ให้กด CREATE CONNECTION
6. เมื่อสร้างเสร็จแล้วมากำหนด Publish และ Subscribe
1. Topic = new_test, และกดปุ่ม Subscribe2. Topic = new_test, ใส่ในช่อง Massage = “ABCDEF” และกดปุ่ม Publish
จะเห็นผลลัพธ์เมื่อเรากดปุ่ม PUBLISH แล้วมันจะส่งข้อความเข้าที่ Pi ของเราที่เปิดไว้
******** ดู IP server Broker server โดยพิมพ์คำสั่งนี้ใน Terminal
$ ifconfig
ฝั่ง ESP32
7. แล้วพิมพ์โค้ดที่ให้ในโปรแกรม Arduino เพื่อทดสอบการติดต่อ
เมื่อเสร็จแล้วให้อัพโหลดลงบอร์ด ในการทดลองนี้ใช้ DOIT ESP32 DEVKIT V1
เปิดดูหน้า Serial Monitorของ ESP32 จะรัน Publish ส่งข้อความไปที่ MQTT Lens เรื่อยๆ
กลับมาฝั่ง MQTT Lens
เมื่อกด Subscribe แล้วจะขึ้นข้อความ hello world #1…n ไปเรื่อย ๆ ทุก ๆ 2 วินาที
นี่คือหน้า Terminal Broker ใน raspberry Pi ก็จะแสดงข้อความด้วยเช่นกัน
8. ต่อวงจรดังนี้
ถ้าเรา Publish ข้อความ “o” = LED GPIO 2 จะติด หรือ “f” LED GPIO 2 จะดับ
คล้ายการทดลองที่ 1 เพียงจากเราใช้ Broker ของคนอื่นเปลี่ยนมาใช้ Broker server ของเราเองเพื่อป้องกันข้อมูลรั่วไหล
เอกสาร PDF สำหรับ Offline : link