LAB3 — [M1] — Mosquitto MQTT Broker on Raspberry Pi

Puwanat Torcheewee
6 min readApr 15, 2020

--

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

  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 “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

  1. เพิ่ม 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

--

--