ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

MQTT ย่อมาจาก Message Queue Telemetry Transport เป็นโปรโตคอลประยุกต์ที่ใช้โปรโตคอล TCP เป็นรากฐาน ออกแบบมาสำหรับงานที่ต้องการ ๆ สื่อสารแบบเรียลไทม์แบบไม่จำกัดแพลตฟอร์ม หมายถึงอุปกรณ์ทุกชิ้นสามารถสื่อสารกันได้ผ่าน MQTT

MQTT จะแบ่งเป็น 2 ฝั่ง คือฝั่งเซิร์ฟเวอร์มักจะเรียกว่า MQTT Broker ส่วนฝั่งผู้ใช้งานจะเรียกว่า MQTT Client ในการใช้งานด้าน IoT จะเกี่ยวข้องกับ MQTT Client เป็นหลัก โดยจะมี MQTT Broker ทั้งแบบฟรี และเสียเงินไว้รองรับอยู่แล้ว ทำให้การสื่อสารข้อมูลผ่าน MQTT จะใช้เซิร์ฟเวอร์ฟรี หรือ MQTT Broker ฟรี เหล่านั้นเป็นตัวกลาง

ลักษณะการใช้งาน MQTT อาจะเปรียบเสมือนได้กับการใช้งานห้องแชท Line สำหรับอุปกรณ์ โดยอุปกรณ์แต่ละตัวจะมีชื่อเป็นของตนเอง มี Username Password เป็นของตัวเอง และอาจจะมีห้องลับเฉพาะของตนเอง ดังนั้นการใช้งาน MQTT ผู้เขียนจึงจะขอยกตัวอย่างของ MQTT เทียบกับห้องแชทได้ดังนี้

กลุ่มผู้ใช้ (User)

ใน MQTT จะแบ่งกลุ่มของผู้ใช้งานออกเป็น 2 ระดับ คือ

  • ระดับสูงสุด – สามารถที่จะรับ-ส่งข้อมูลกับอุปกรณ์ หรือช่องทางใด ๆ ก็ได้ในระบบ หรือเปรียบได้กับแอดมินที่สามารถเข้าไปดูข้อความได้ทุดห้องแม้จะเป็นห้องลับก็ตาม
  • ระดับทั่วไป – สามารถรับ-ส่งข้อมูลกับอุปกรณ์หรือช่องทางที่กำหนดไว้เฉพาะเท่านั้น เปรียบได้กับผู้ใช้งาน Line ที่สามารถแชทในห้องที่ตัวเองสร้างได้ หรือเป็นสมาชิกในห้อง แต่ไม่สามารถเข้าไปแชทในห้องที่ไม่ได้เป็นสมาชิก

ในการใช้งานจริง ในอุปกรณ์ต่าง ๆ ควรจะใช้งานในระดับทั่วไป เพื่อความปลอดภัยกรณีอุปกรณ์เหล่านั้นถูกแฮกแล้วไม่สร้างความเสียหายไปยังอุปกรณ์อื่น ๆ ที่อยู่ในช่องทางเฉพาะของแต่ละอุปกรณ์

เส้นทาง (Topic)

เส้นทาง เปรียบเหมือนกับหัวข้อ หรือห้องแชทที่ต้องการจะคุย และการคุยกันจะมีเฉพาะอุปกรณ์ที่อยู่ในห้องนั้น ๆ (Subscribe) ถึงจะสามารถได้รับข้อมูลที่มีการส่งไปในห้องนั้น ๆ ที่ถูกเรียกว่าเส้นทางเนื่องจากการใช้งานส่งข้อมูลและรับข้อมูลจะเหมือนกับเส้นทางในระบบไฟล์ เช่น /Room1/LED ซึ่งระบบเส้นทางนี้นอกจากอุปกรณ์จะสามารถรอการสนทนาในห้องตามเส้นทาง /Room1/LED ได้แล้ว ยังสามารถรอสนทนาเส้นทาง /Room1 ได้ด้วย หากเป็นการรอฟังในเส้นทาง (Subscribe) /Room1 จะหมายถึงการส่งข้อมูลใด ๆ ที่นำหน้าด้วย /Room1 เช่น /Room1/LED , /Room1/Value ผู้ที่รอฟัง (Subscribe) /Room1 อยู่จะได้รับข้อมูลเหล่านั้นด้วย

คุณภาพข้อมูล (QoS)

แบ่งออกเป็น 3 ระดับดังนี้

  • QoS0 – ส่งข้อมูลเพียงครั้งเดียว ไม่สนใจว่าผู้รับจะได้รับหรือไม่
  • QoS1 – ส่งข้อมูลเพียงครั้งเดียว ไม่สนใจว่าผู้รับจะได้รับหรือไม่ แต่ให้จำค่าที่ส่งล่าสุดไว้ เมื่อมีการเชื่อมต่อใหม่จะได้รับข้อมูลครั้งล่าสุดอีกครั้ง
  • QoS2 – ส่งข้อมูลหลาย ๆ ครั้งจนกว่าปลายทางจะได้รับข้อมูล มีข้อเสียที่สามารถทำงานได้ช้ากว่า QoS0 และ QoS1

การส่งข้อมูล (Publish)

การส่งข้อมลในแต่ละครั้งจะต้องประกอบไปด้วยเส้นทาง (Topic) ข้อมูล และคุณภาพข้อมูล ซึ่งการส่งข้อมูลจะเรียกว่า Publish

การรับข้อมูล (Subscribe)

การรับข้อมูลในระบบ MQTT จะรับข้อมูลได้เฉพาะเมื่อมีการเรียกใช้การ Subscribe ไปยัง Topic ที่กำหนด อาจเปรียบได้กับการ Subscribe คือการเข้าไปนั่งรอเพื่อนในกลุ่ม Line ส่งแชทมาหา เมื่อมีการส่งข้อมูลเข้ามาจะเกิดสิ่งที่เรียกว่าเหตุการณ์ (Event) ให้เรากดเข้าไปดูข้อความที่เพื่อน ๆ ส่งเข้ามา

จะเห็นได้ว่า MQTT ก็เปลี่ยนเสมือนห้องแชทของอุปกรณ์ที่จะสนทนาแลกเปลี่ยนข้อมูลกันแบบเรียลไทม์ผ่านเครือข่ายอินเตอร์เน็ต

การใช้งาน MQTT ฟรีจาก CloudMQTT

การสมัครสมาชิก

เข้าไปที่หน้าเว็บไซต์ https://www.cloudmqtt.com/ จากนั้นกดที่ Control Panel

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

หากสมัครสมาชิกไว้แล้ว สามารถข้ามขั้นตอนไปในส่วนของการใช้งาน CloudMQTT ได้เลย หากยังไม่ได้สมัครสมาชิกให้กรอกอีเมล์ลงในช่อง E-mail ตรงส่วน Sign up แล้วกดปุ่ม Sign up

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

จากนั้นจะพบข้อความแจ้งผล

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

ให้เข้าไปเช็คอีเมล์ จากนั้นคลิกลิ้งที่ส่งมาในอีเมล์

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

กรอกข้อมูลลงในฟอร์มสมัครสมาชิกให้ครบ จากนั้นกดปุ่ม Submit

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

จากนั้นระบบจะพามาหน้าจัดการ เป็นการจบการสมัครสมาชิก

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

การสร้าง Broker

กดไปที่ปุ่ม Create เพื่อสร้าง Broker ใหม่

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

ที่ช่อง Name ให้ตั้งชื่อ Broker ใหม่ เลือก Plan เป็น Cute Cat จากนั้นกดปุ่ม Create

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

หน้าเว็บจะกลับมาที่หน้าจัดการ และมีรายการ Broker ที่สร้างขึ้นมาใหม่ กดไปที่ปุ่ม Details

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

จากนั้นจะพบข้อมูลต่าง ๆ ของ Broker ซึ่งบางส่วนจะต้องนำไปใช้ในโค้ดที่จะได้ทดลองกันต่อไป สามารถอธิบายแต่ละส่วนได้ดังนี้

  • Server – ชื่อโดเมน หรือโฮสของ Broker
  • User – ชื่อผู้ใช้ในระดับสูงสุด ควรเก็บข้อมูลส่วนนี้ไว้เป็นความลับ และใช้เฉพาะการดีบัคโปรแกรมเท่านั้น
  • Password – รหัสผ่านของผู้ใช้ในระดับสูงสุด
  • Port – พอร์ตของ Broker
  • SSL Port – กรณีแพลตฟอร์มที่ใช้งานรองรับ SSL ควรใช้พอร์ตนี้ในการเชื่อมต่อ
  • Websockets Port – พอร์ตที่ใช้บนแพลตฟอร์ตเว็บไซต์
  • Connection limit – จำนวนการเชื่อมต่อพร้อมกันสูงสุด หากต้องการเพิ่ม จะต้องชำระเงินเพื่อซื้อแพลนอื่น ๆ

ซึ่งข้อมูลในส่วนนี้จะแตกต่างกันไปตามแต่ละ Broker ที่สร้างขึ้นมา

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

การจัดการผู้ใช้และสิทธิ์

ในหน้าของ CloudMQTT Console ที่ใช้จัดการ Broker  ให้เลื่อนมาที่หัวข้อ Manage Users จะมีช่องอยู่ 2 ช่อง สำหรับกรอก Username และ Password เพื่อสร้างผู้ใช้ใหม่ เมื่อใส่ข้อมูลเรียบร้อยให้กดปุ่ม Save

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

รายชื่อผู้ใช้ใหม่จะปรากฏขึ้นมา หากต้องการลบผู้ใช้ใดสามารถกดปุ่ม Delete ที่ผู้ใช้นั้น ๆ ได้เลย

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

ต่อมาให้เลื่อนมาที่หัวข้อ ACLs เพื่อเริ่มจำกัดสิทธิ์ และให้สิทธิ์ของผู้ใช้ โดยรายละเอียดการกรอกข้อมูลแต่ละช่องในหัวข้อย่อย New Rule มีดังนี้

  • User – เลือก User ที่ต้องการจัดการสิทธิ์
  • Topic – เลือกเส้นทางที่ต้องการจัดการสิทธิ์ รองรับการกรอกแบบ Wildcard เช่น หากกรอกแบบ /LED/# จะหมายถึงการจัดการสิทธ์ของเส้นทางที่นำหน้าด้วย /LED/ และหากกรอกแบบ /LED/+ จะหมายถึงจัดการสิทธิ์แบบ 1 ระดับ หมายถึง /LED/1 หรือ /LED/2 หรือ /LED/FFF จะเข้าการจัดการสิทธิ์นี้ แต่หากเป็น /LED/2/ON จะไม่ถูกนับเป็นการจัดการสิทธิ์ของเส้นทาง /LED/+
  • Read Access? – กำหนดว่าเส้นทางที่กรอกไว้ในช่อง Topic ผู้ใช้นี้มีสิทธิ์เข้าไปอ่าน หรือรับรู้ได้หรือไม่
  • Read Access? – กำหนดว่าเส้นทางที่กรอกไว้ในช่อง Topic ผู้ใช้นี้มีสิทธิ์เข้าไปเขียน หรือส่งข้อมูลได้หรือไม่

เมื่อกำหนดสิทธิ์เรียบร้อยแล้ว ให้กดปุ่ม Save ได้เลย

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

หลังจากกดปุ่ม Save จะแสดงผลการจัดการสิทธิ์ดังรูป หากต้องการยกเลิกการจัดการสิทธิ์สามารถกดปุ่ม Delete เพื่อลบได้

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

การเรียกดูข้อมูลเข้าออกแบบเรียลไทม์

ที่ส่วนด้านบนสุด ให้คลิกที่ปุ่ม Websocket UI

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

ข้อมูลที่มีการรับส่งกันผ่าน MQTT ทั้งหมดจะแสดงผลในหัวข้อ Received messages โดยใช้สิทธิ์ของผู้ใช้ระดับสูงสุด ในส่วนหัวข้อ Send message สามารถกำหนดเส้นทาง และข้อมูลที่ต้องการส่งได้ โดยคลิกปุ่ม Send เพื่อส่ง

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

การใช้งาน MQTT บน ESP32 จะใช้งานผ่านไลบารี่ PubSubClient.h จะต้องติดตั้งเพิ่มเติมโดยใช้ Library Manager ค้นหาคำว่า PubSubClient แล้วสามารถกดปุ่ม Install เพื่อติดตั้งได้เลย

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

การในการเชื่อมต่อกับ MQTT จะต้องมีการเรียกใช้ไลบารี่ PubSubClient.h ด้วยเสมอ โดยจะต้องเพิ่มคำสั่ง #include ไว้ด้านบนของไฟล์โปรแกรมเสมอ

ในการสร้างออปเจคเพื่อใช้งานคลาสของไลบารี่ PubSubClient สามารถทำได้โดยมีรูปแบบดังนี้

      PubSubClient::PubSubClient(Client &client);

ฟังก์ชั่นย่อยที่มีให้ใช้งาน จะแบ่งตามเคสได้ดังนี้

เชื่อมต่อกับ Broker – ใช้ฟังก์ชั่นย่อย .setServer() เพื่อตั้งค่า Broker ที่ต้องการเชื่อมต่อ มีรูปแบบการใช้งานดังนี้

      void PubSubClient::setServer(const char * domain, uint16_t port);

มีค่าพารามิเตอร์ดังนี้

  • (const char *) domain – ชื่อโดเมน หรือชื่อโฮสของ Broker ที่ต้องการเชื่อมต่อ
  • uint16_t port – พอร์ตของ Broker (ไม่ใช่พอร์ต SSL)

และไม่มีค่าที่ส่งกลับ

นอกจากนี้การเชื่อมต่อกับ Broker จะใช้ฟังก์ชั่นย่อย .connect() ซึ่งมีรูปแบบดังนี้

      bool PubSubClient::connect(const char *id, const char *user, const char *pass);

มีรายละเอียดของค่าพารามิเตอร์ดังนี้

  • (const char*) id – กำหนดชื่อที่ไม่ซ้ำกับผู้อื่นที่ใช้ Broker เดียวกัน เปรียบได้กับการตั้งชื่อใน Line ที่ไม่ซ้ำกับผู้อื่น
  • (const char*) user – ชื่อผู้ใช้ที่ใช้เข้าสู่ระบบ ไม่ควรใช้ Username ของผู้ใช้ระดับสูงสุด ควรใช้ Username ที่สร้างใหม่และกำหนดสิทธิ์แล้ว
  • (const char*) pass – รหัสผ่านที่ใช้เข้าสู่ระบบ

และตอบกลับมาเป็นผลการเชื่อมต่อ หากเชื่อมต่อสำเร็จจะให้ค่าเป็น True

การตรวจสอบสถานะการเชื่อมต่อจะใช้ฟังก์ชั่นย่อย .connected() ในการตรวจสอบ ซึ่งมีรูปแบบการใช้งานดังนี้

      bool PubSubClient::connected();

ไม่มีค่าพารามิเตอร์ และตอบกลับมาเป็นผลการเชื่อมต่อ หากกำลังเชื่อมต่ออยู่ให้ค่าเป็น True

การรับข้อมูล (Subscribe) – การรับข้อมูลเข้าจะทำงานด้วยเหตุการณ์ โดยจะมีการสร้างฟังก์ชั่นไว้ 1 ตัวเพื่อรอการเรียก เมื่อมีการส่งข้อมูลมาจะเข้าไปเรียกฟังก์ชั่นนั้นขึ้นมาใช้ ฟังก์ชั่นย่อยที่ใช้กำหนดชื่อฟังก์ชั่นที่จะถูกเรียกเมื่อเกิดเหตุการณ์ขึ้นคือฟังก์ชั่นย่อย .setCallback() ซึ่งมีรูปแบบการใช้งานดังนี้

      void PubSubClient::setCallback(void (*callback)(char*, uint8_t*, unsigned int));

มีค่าพารามิเตอร์ 1 ตัว คือ

  • (void *) callback – ฟังก์ชั่นที่จะถูกเรียกเมื่อเกิดเหตุการณ์ขึ้น

และไม่มีค่าตอบกลับ

ฟังก์ชั่นที่ใช้รับข้อมูล (Subscribe) จากเส้นทางที่สนใจ จะใช้ฟังก์ชั่นย่อย .subscribe() มีรูปแบบการใช้งานดังนี้

      void PubSubClient::subscribe(const char *topic);

มีค่าพารามิเตอร์ 1 ตัว คือ

  • (const char*) topic – เส้นทางที่ต้องการรับข้อมูล

และไม่มีการตอบกลับ การใช้งานฟังก์ชั่นย่อย .subscribe() มักจะเรียกใช้เมื่อมีการเชื่อมต่อกับ Broker สำเร็จแล้วเท่านั้น

การส่งข้อมูล (Publish) – ใช้ฟังก์ชั่นย่อยที่ชื่อว่า .publish() มีรูปแบบการใช้งานดังนี้

      bool PubSubClient::publish(const char *topic, const char *payload);

มีรายละเอียดของค่าพารามิเตอร์ดังนี้

  • (const char*) topic – เส้นทางที่ต้องการส่งข้อมูล
  • (const char*) payload – ข้อมูลที่ต้องการส่ง

และมีการตอบกลับเป็นข้อมูลชนิด bool ถ้าส่งข้อมูลสำเร็จจะได้ค่า True

ทดลองใช้งาน MQTT ควบคุมหลอด LED ผ่านอินเตอร์เน็ต

ก่อนอื่นให้ต่อวงจรเพิ่มเติม เนื่องจากหลอด LED ที่อยู่บนบอร์ด NodeMCU-32S ถูกใช้ไปกับการบอกสถานะการเชื่อมต่อ WiFi ดังนั้นจึงต้องต่อหลอด LED เพิ่มเพื่อใช้ในการทดลอง ซึ่งสามารถต่อวงจรได้ดังนี้

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

จากนั้น เข้าไปคัดลอกโค้ดที่ใช้ทดลองที่ลิ้ง https://goo.gl/sLpxxb แก้ไขส่วนของ WIFI_STA_NAME และ WIFI_STA_PASS ให้ถูกต้อง แก้ไขส่วนที่เกี่ยวข้องกับการเชื่อมต่อ MQTT ทั้งหมด ดังนี้

  • MQTT_SERVER – แก้ไขเป็นค่า Server ในหน้า CloudMQTT Console
  • MQTT_PORT – แก้ไขเป็นค่า Port ในหน้า CloudMQTT Console
  • MQTT_USERNAME – แก้ไขเป็น Username ที่สร้าง และมีสิทธิ์เข้าถึง /ESP32_1/LED (อ่านเพิ่มที่หัวข้อ การจัดการผู้ใช้และสิทธิ์)
  • MQTT_PASSWORD – แก้ไขเป็น Password ที่สร้างไว้
  • MQTT_NAME – แก้ไขเป็นอะไรก็ได้ หรือไม่แก้ไขก็ได้ ค่านี้จะนำไปใช้อ้างอิงเป็นชื่อใน Broker

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

หลังจากแก้ไขทุกส่วนเรียบร้อยแล้ว สามารถอัพโหลดโปรแกรมลงบอร์ด NodeMCU-32S ได้เลย เปิด Serial Monitor ขึ้นมา ปรับไปที่ 115200 แล้วรอจนกว่าจะสามารถเชื่อมต่อกับ MQTT ได้

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

ไปที่หน้า Websocket UI ตรงส่วนของ Topic ให้ใส่เป็น /ESP31_1/LED แล้วใส่ Message แล้วกด Send ผลที่ได้คือหลอด LED ที่ได้ต่อไว้เพิ่มติดสว่าง และในหน้า Serial Monitor ก็แสดงผลข้อมูลที่ได้รับออกมา

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

เมื่อทำตามขั้นตอนเดิมแต่เปลี่ยนข้อความเป็น OFF ผลคือหลอด LED ที่ต่อไว้ดับลง หมายความว่าเราสามารถควบคุมหลอด LED ผ่านอินเตอร์เน็ตได้แล้ว

สำหรับโค้ดที่ใช้ในการทดลองมีดังนี้

เนื่องจากโค้ดในส่วนของการเชื่อมต่อ WiFi มีเป็นจำนวนมาก และมีการอธิบายในหลาย ๆ ตัวอย่างแล้ว ดังนั้นในครั้งนี้จึงจะอธิบายเฉพาะส่วนของการเชื่อมต่อ MQTT เท่านั้น

บรรทัดที่ 2 เรียกใช้ไลบารี่ PubSubClient.h โดยใช้คำสั่ง #include เพื่อเตรียมเชื่อมต่อกับ MQTT Broker

บรรทัดที่ 7 กำหนดให้ MQTT_SERVER แทนที่ด้วย “m11.cloudmqtt.com” ใช้กำหนดชื่อโดเมน หรือโฮสของ Broker

บรรทัดที่ 8 กำหนดให้ MQTT_PORT แทนที่ด้วย 10384 ใช้กำหนดพอร์ตของ Broker

บรรทัดที่ 9 กำหนดให้ MQTT_USERNAME แทนที่ด้วย esp32_1

บรรทัดที่ 10 กำหนดให้ MQTT_PASSWORD แทนที่ด้วย 123456

บรรทัดที่ 15 เรียกใช้ WiFiClient เพื่อเตรียมใช้การเชื่อมต่อแบบ TCP

บรรทัดที่ 16 ส่งออปเจคของ WiFiClient ไปให้ไลบารี่ PubSubClient ใช้งานและตั้งชื่อออปเจคเป็น mqtt

บรรทัดที่ 18 สร้างฟังก์ชั่นย่อยชื่อ callback()

บรรทัดที่ 19 – 20 แปลงค่าตัวแปร topic และ payload ให้เป็นข้อมูลในรูปแบบ String แล้วนำไปเก็บใน topic_str และ payload_str ตามลำดับ

บรรทัดที่ 21 แสดงผลข้อความไปที่ Serial Monitor

บรรทัดที่ 23 ใช้ Ternary Operators เปรียบเทียบตัวแปร payload_str ว่าเป็น ON หรือไม่ ถ้าใช่ จะส่งค่า HIGH กลับไป และถ้าไม่ใช่ จะส่งค่า LOW กลับไป ค่าที่ส่งกลับไปถูกนำไปใช้เขียนข้อมูลออกขา GPIO แบบดิจิตอลด้วยฟังก์ชั่น digitalWrite()

บรรทัดที่ 24 จบคำสั่งในฟังก์ชั่นย่อย callback()

บรรทัดที่ 51 ใช้ฟังก์ชั่นย่อย .setServer() กำหนดค่าเตรียมเชื่อมต่อไปยัง MQTT Broker โดยกำหนดชื่อเมนหรือโฮสตาม MQTT_SERVER และกำหนดพอร์ตตาม MQTT_PORT

บรรทัดที่ 52 ใช้ฟังก์ชั่นย่อย .setCallback() กำหนดฟังก์ชั่นที่จะเรียกใช้เมื่อมีเหตุการณ์เกิดขึ้น โดยกำหนดให้ไปเรียกฟังก์ชั่น callback

บรรทัดที่ 56 ใช้ฟังก์ชั่นย่อย .connected() ตรวจสอบการเชื่อมต่อกับ MQTT Broker แล้วนำค่าไปเทียบในคำสั่ง if หากมีค่าเป็น False หรือไม่มีการเชื่อมต่ออยู่ จะทำคำสั่งในปีกกา

บรรทัดที่ 57 แสดงผลไปที่ Serial Monitor

บรรทัดที่ 58 ใช้ฟังก์ชั่นย่อย .connect() เชื่อมต่อไปยัง Broker โดยใช้ค่า Username และ Password ตาม MQTT_USERNAME และ MQTT_PASSWORD แล้วนำผลการเชื่อมต่อไปเช็คในคำสั่ง if หากเป็นจริง หรือสามารถเชื่อมต่อได้สำเร็จจะทำในปีกกาของ if

บรรทัดที่ 59 แสดงผลไปที่ Serial Monitor

บรรทัดที่ 60 ใช้ฟังก์ชั่น .subscribe() กำหนดให้รับข้อมูลที่เส้นทาง /ESP32_1/LED

บรรทัดที่ 61 จบคำสั่งใน if และเริ่ม else เมื่อผลการเปรียบเทียบใน if เป็นเท็จ หรือเชื่อมต่อไม่ได้ จะเข้ามาทำคำสั่งในปีกกา else

บรรทัดที่ 62 แสดงผลไปที่ Serial Monitor

บรรทัดที่ 63 หน่วงเวลา 5000 มิลลิวินาที หรือ 5 วินาที

บรรทัดที่ 64 จบคำสั่งในปีกกา else

บรรทัดที่ 65 จบคำสั่งในปีกกา if ที่ตรวจสอบการเชื่อมต่อกับ Broker หากการเปรียบเทียบใน if เป็นเท็จ หรือมีการเชื่อมต่ออยู่ จะมาทำปีกกา else

บรรทัดที่ 66 เรียกฟังก์ชั่นย่อย .loop() เพื่อให้ไลบารี่ PubSubClient สามารถทำงานต่อไปได้

ทดลองสร้าง MQTT Dashboard ด้วยแอพพลิเคชั่น MQTT Dash

ในการใช้งานจริงหากต้องการควบคุมหลอด LED ต้องทำได้อย่างสะดวก โดยเปิดแอพพลิชั่น / เว็บไซต์ขึ้นมาก็สามารถควบคุมอุปกรณ์ต่าง ๆ ได้เลย การใช้งาน MQTT เป็นตัวกลางของข้อมูลทำให้เข้าถึงเครื่องมือต่าง ๆ ที่ทำออกมาเพิ่มความสามารถให้ MQTT มากมาย หนึ่งในนั้นคือแอพพลิเคชั่น MQTT Dash ที่ใช้สร้างหน้าควบคุมและแสดงผลได้ง่าย ๆ โดยไม่ต้องพิมพ์โค้ดซักบรรทัดเดียว

จากตัวอย่างที่แล้วเราได้ทดลองควบคุมหลอด LED ผ่าน MQTT โดยใช้หน้า Websocket UI กันไปแล้ว ในการทดลองครั้งนี้จะเป็นการใช้แอพพลิเคชั่น MQTT Dash เป็นตัวกลางระหว่างผู้ใช้กับระบบเบื้องหลังทั้งหมด ก่อนอื่นให้ติดตั้งแอพพลิเคชั่น MQTT Dash ก่อน โดยค้นหาคำว่า “MQTT Dash” แล้วกดติดตั้งได้เลย

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

เมื่อเปิดแอพพลิชั่น MQTT Dash ขึ้นมาแล้ว จะต้องสร้างการเชื่อมต่อกับ Broker ชึ้นมาใหม่ โดยกดไปที่ไอค่อนรูป + ที่ด้านมุมขวาบน

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

กรอกข้อมูลแต่ละช่องตามลำดับต่อไปนี้

  • Name – ให้ตั้งชื่อของ Broker โดยชื่อที่ตั้งนี้จะแสดงผลในหน้าหลักของแอพ
  • Address – ให้กรอกชื่อโดเมน หรือโฮสของ Broker โดยใช้ค่าใน CloudMQTT Console
  • Port – แนะนำให้ใช้ค่าของ SSL Port
  • Enable connection encryption – ติ้กเลือกกรณีใช้ค่าใน SSL Port
  • User name – กรอกเป็นผู้ใช้ที่สร้างใหม่ และกำหนดสิทธิ์แล้ว
  • User password – กรอกรหัสผ่านของผู้ใช้ที่สร้างใหม่

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

จากนั้นกดไอค่อนรูปแผ่นดิสท์ที่ด้านมุมบนขวาเพื่อบันทึก

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

แอพพลิเคชั่นจะเด้งกลับมาที่หน้าหลัก แล้วกดเข้าไปที่ชื่อของ Broker ที่ตั้งไว้

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

จากนั้นรอเชื่อมต่อซักครู่ เมื่อเสร็จแล้วจะแสดงหน้า Dashboard เปล่า ๆ ขึ้นมา ให้กดไปที่ไอค่อนรูป + ด้านบนมุมขวา เพื่อสร้างวัตถุใหม่เพื่อติดต่อกับผู้ใช้

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

จากนั้นจะเลือกชนิดของวัตถุที่ต้องการเพิ่ม กรณีควบคุมอุปกรณ์ที่มีเพียง 2 สถานะ คือเปิด และปิด ควรเลือกใช้เพิ่มวัตถุแบบ Switch

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

จากนั้นจะปรากฏช่องสำหรับกรอกข้อมูลต่าง ๆ ให้เลือกกรอกดังนี้

  • Name – ตั้งชื่อของวัตถุ
  • Topic – กำหนดเส้นทางที่ต้องการรับ – ส่งข้อมูล เนื่องจากในโค้ดได้กำหนดให้สนใจข้อมูลในเส้นทาง /ESP32_1/LED ดังนั้นในช่องนี้จึงกรอกเป็น /ESP32_1/LED
  • On – ข้อมูลที่จะส่งเมื่อมีสถานะเปิด เนื่องจากเราได้กำหนดในโค้ดไว้ในตัวอย่างที่แล้วว่าหากข้อมูลเป็น ON หลอด LED จึงจะติด ดังนั้นในช่องนี้จึงกรอก ON
  • Off – กรอกเป็น OFF

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

นอกจากนี้ไอค่อนใน On และ Off สามารถกำหนดได้ โดยกดที่รูปไอค่อนแล้วเลือกเปลี่ยนได้เลย

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

จากนั้นกดที่ไอค่อนรูปแผ่นดิสท์เพื่อบันทึกข้อมูล

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

แอพพลิเคชั่นจะนำกลับมาที่หน้า Dashboard จะพบว่ามีวัตถุที่สร้างขึ้นมาแล้ว สามารถทดลองกดเพื่อส่งข้อมูลได้เลย

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

หลังจากกดแล้ว จะพบว่าหลอด LED ที่ NodeMCU-32S สามารถควบคุมได้ตามที่ต้องการได้แล้ว เมื่อเข้าไปดูที่หน้า Websocket UI จะพบข้อมูลทั้งหมดที่วิ่งจากแอพ ฯ ผ่าน MQTT Broker ไปยัง ESP32

ตาม กลไก MQTT อุปกรณ์ ใน โครง ข่าย ไอ โอ ที่ สามารถ ติดต่อ สื่อสาร ผ่าน ตัวกลาง ใด

สรุปท้ายบท

ในบทนี้เป็นเรื่องเกี่ยวกับการใช้งาน MQTT Broker เป็นตัวกลางในการสื่อสารระหว่างอุปกรณ์ต่าง ๆ ผ่านระบบอินเตอร์เน็ต การใช้งาน MQTT สามารถเลือกใช้บริการได้ทั้งแบบเสียเงิน และแบบฟรี ในการทดลองในบทนี้จะทดลองเกี่ยวกับ LED โดยมีการเปิด – ปิด หลอด LED ได้ผ่านอินเตอร์เน็ตโดยควบคุมผ่านแอพพลิเคชั่นสำเร็จรูปบนโทรศัพท์มือถือ เพื่อเตรียมต่อยอดใช้ MQTT เป็นส่วนประกอบของโครงงานอื่น ๆ ต่อไป ในบทต่อไปจะเป็นเรื่องของ มัลติทาสกิ้ง ซึ่งจะช่วยให้สามารถทำโครงงานได้สะดวกมากขึ้น

กลไกเอ็มคิวทีที (MQTT) สื่อสารผ่านตัวกลางที่เรียกว่าอะไร

โดยตัวโปรโตคอล MQTT เองไม่ได้ออกแบบให้เชื่อมต่อจากเซิร์ฟเวอร์เข้าไปยังไคลเอนต์แบบ HTTP ที่เว็บเบราว์เซอร์เชื่อมต่อกับเว็บเซิร์ฟเวอร์ แต่ MQTT อาศัยตัวกลางที่เรียกว่า broker ในการเชื่อมต่อไคลเอนต์ในระบบเข้าด้วยกัน ทำให้ไคลเอนต์แต่ละตัวสามารถรับข้อมูลจากไคลเอนต์ตัวอื่นๆ ได้

กลไกการสื่อสาร MQTT เป็นการสื่อสารโดยใช้วิธีการแบบใด

MQTT (Message Queuing Telemetry Transport) เป็นโปรโตคอลสำหรับใช้ส่งข้อความระหว่างอุปกรณ์ โดยใช้โมเดลเน็ตเวิร์คแบบ publish-subscribe ซึ่งจะแตกต่างจากโปรโตคอลอื่นๆโดยส่วนมากที่ใช้โมเดล Server-Client ในการรับส่งข้อมูล ตัวโปรโตคอลรันอยู่บนเทคโนโลยี TCP/IP จึงทำให้การส่งข้อมูลนั้นไม่มีการ loss ระหว่างทาง MQTT ถูกพัฒนาขึ้นมา ...

องค์ประกอบพื้นฐานของกลไก MQTT มีกี่องค์ประกอบ อะไรบ้าง?

ซึ่ง MQTT เป็นชื่อเรียกสำหรับโปรโตคอลนี้เท่านั้น โดยหลักการทำงานของ MQTT จริง ๆนั้นมีส่วนประกอบ 3 อย่างคือ ผู้ส่ง (publish) , ผู้รับ (subscribe) และ ตัวกลาง (MQTT broker) โดยผู้รับหรือผู้ส่งจะใช้อุปกรณ์ชนิดไหนก็ได้ ขอเพียงมีแอพพลิเคชั่นหรือโปรแกรมที่รองรับโปรโตคอล MQTT ก็เพียงพอแล้ว

ข้อตกลงระหว่างผู้ส่ง(Publisher) ผู้รับข้อมูล (MQTT Broker) ในการรับประกันการส่งข้อมูลมีกี่ระดับ อะไรบ้าง

QoS (Quality of Service) 3 ระดับ คือ ข้อตกลงระหว่างผู้ส่ง (Publisher) และผู้รับ (MQTT Broker) ในการรับประกันการส่งข้อมูล QoS Level 0 : การส่งข้อมูลที่มีการรับประกันผลในระดับต่ำสุด หรือเป็นข้อมูลที่ต้องการความรวดเร็วในการส่ง คือ ไม่ต้องการการตอบกลับว่าข้อมูลถึง MQTT Broker แล้ว