วันศุกร์ที่ 18 กันยายน พ.ศ. 2558

Node-RED : MQTT ตามที่ผมเข้าใจ

 

MQTT (Message Queuing Telemetry Protocol)

ผมได้เขียนเนื้อหาเกี่ยวกับการฝากและดึงข้อมูล เพื่อทำให้ Iot devices สามารถทำงานได้โดยอิสระจากการที่จะต้องผูกติดกับ PC ที่บ้าน ทำให้การรีโมทมาที่ devices สามารถกระทำได้ทุกที่ที่ต้องการ ถ้ายังจำได้ผมได้ใช้ dweet.io เป็นที่ฝากข้อมูล และ Phant ทำหน้าที่เดียวกันแต่เป็นแบบ inhouse

สำหรับ MQTT เป็นชื่อเรียกโปรโตคอล มาตรฐานในการฝากและดึงข้อมูลคล้ายกับ Dweet.io และ Phant ส่วนของ MQTT เป็นมาตรฐานที่ IBM เป็นผู้ริเริ่ม (ผมขอไม่พูดถึงประวัติความเป็นมา ไม่ถนัดที่จะเล่าเรื่องที่มาที่ไปนัก) เพื่อควบคุมระบบสัญญานและข้อมูลในโรงงานอุตสาหกรรม ซึ่งเกิดขึ้นก่อน IoT นานพอควร แต่ด้วยสอดคล้องกับ IoT จึงได้รับความนิยม

Dweet.io เป็น MQTT broker แบบ lite คือ นำเอาเฉพาะส่วนสำคัญมาใช้ สุดๆก็คือ Dweet.io ที่แทบจะไม่ต้องทำอะไรเลย คือไม่ต้องสมัคร เพียงวางรูปแบบให้ถูกต้องตามที่กำหนด ก็สามารถทำงานได้แล้ว

ในส่วนของ Phant จะเต็มรูปแบบที่เราสามารถนำมาติดตั้งไว้ในเครื่องของเราได้ ก็คือไม่ต้องไปเสียเงินซื้อแพ็คเกจ

ความเห็นส่วนตัวผมชอบที่จะใช้บริการมากกว่าจะมาวางไว้ในเครื่อง ซึ่งเราต้องคอยดูแลให้มันทำงานได้ตลอดเวลา ซึ่งจุดนี้ควรจะให้ผู้เชี่ยวชาญดูแลให้เราดีกว่า

MQTT จะใช้หลักการของการ dispatch ข้อมูลที่มีการเปลี่ยนแปลงออกไป ในส่วนของผู้ใช้งานก็จะเขียนโปรแกรมในลักษณะรอรับข้อมูล event driven หรือ Asynchronous หลักการก็คือ ทำการระบุเหตุการณ์หรือ event ให้หน่วยบริการหรือ handler คอยเฝ้าดูแทนเรา เมื่อใดที่พบเห็นเหตุการณ์ที่ระบุไว้ ให้แจ้ง เมื่อได้รับแจ้ง CPU จะละงานที่กำลังทำอยู่ ไปทำงานในรูทีนที่กำหนด

ดังนั้น CPU ไม่ต้องทำการหยุดรอข้อมูล หรือต้องเข้ามาดึงข้อมูลตามที่ตั้งเวลาแน่นอนไว้ ทั้งที่อาจจะไม่ได้มีข้อมูลใหม่เข้ามา เมื่อฝากเรื่องไว้กับ handler แล้ว CPU สามารถไปทำงานอื่นๆได้โดยอิสระ

ข้อมูลที่ได้รับจะเป็นข้อมูลที่ทันสมัยตลอดเวลา CPU ทำงานได้เต็มประสิทธิภาพ การเขียนโปรแกรมแบบ event driven หรือ Asynchronous ง่ายกว่าแบบ polling มากๆ

จากที่ได้ติดตามเห็นการทดลองของเพื่อนๆในกลุ่มที่ได้ทดลองกับ ESP8266 โดยการใช้ HTTP client ที่เป็นรูปแบบของการเขียนโปรแกรมในลักษณะ polling คือวนลูปเพื่อตรวจสอบว่ามีการร้องขอข้อมูลหรือไม่ เมื่อเปรียบเทียบกับการเขียนโปรแกรมแบบ HTTP server ที่จะตอบสนองเมื่อเกิด event หรือเหตุการณ์ที่พ้องกับที่เรากำหนดไว้ จะมีประสิทธภาพสูงกว่า

ตัวอย่างการเขียนโปรแกรมแบบ HTTP server ผมได้เขียนไว้ในหัวข้อ ESP8266 กับ Webconfig คำสำคัญที่ใช้คือ server.on(“event”, subroutine);

สำหรับเนื้อหาตอนนี้จะนำเอาวิธีใช้งาน MQTT Broker กับ NodeRED

สำหรับ NodeRED มี MQTT node ทั้งแบบ in และ out สำหรับส่วนของจุดบริการฝากข้อมูล ซึ่งถูกเรียกว่า MQTT Broker มีแบบที่ให้ใช่ฟรีโดยมีข้อจำกัด ถ้ายอมเสียเงินก็จะมีอะไรให้ใช้เพิมขึ้น

ผมทดลองสมัครใช้งานแบบฟรีกับ CloudMQTT ใช้ Cute Cat package

image

จะถูกจำกัดที่ 10 connections และความเร็วในการถ่ายโอนอยู่ที่ 10Kbit/s ถ้าใช้แล้วติดใจ ก็ควรสนับสนุนไปใช้ package ที่สูงขึ้นได้ตามความเหมาะสม

ส่วนของจ้าวอื่นยังไม่ได้ค้นหา ใครพบว่ามีที่ไหนบ้าง ก็นำไปโพสต์ไว้ในเฟส NodeRED Siam ได้ครับ จะได้แชร์ให้เพื่อนๆ

 

image

สมัครกันเลย เข้าที่ https://www.cloudmqtt.com/ เลือก Plan เลือก Cute Cat กรอกรายละเอียด รอ email เพื่อ confirm จากนั้นก็ทำการ Log-In

image

กดที่ + Create

image

ตั้งชื่อ เลือก Data center และแน่นอน Plan ให้เลือก Cute Cat ทำการ Save

เมื่อกลับไปที่หน้า CloudMQTT Instances ให้กดปุ่ม Details

image

จะพบกับข้อมูลสำคัญที่ต้องนำไปใช้กับ NodeRED คือ Server, User, Password และ Port สังเกตุุค่า Connection limit อยู่ที่ 10 ผมยังไม่ชัดเจนนักกับคำว่า connections ว่าหมายถึงอะไร

ก่อนจะไปที่ NodeRED มาทดลองใช้งานเครื่องมือที่ CloudMQTT ให้มาก่อน

image

* ในรูปผมจะลบชื่อ User ที่ต่อท้ายคำว่า Console ออก  ส่วนของผู้อ่านเองจะเห็น User ที่ระบบกำหนดแสดงไว้ที่ตำแหน่งนั้น

จากนั้นให้กดปุ่ม Webservice UI

image

Websocket ที่กำลังจะใช้เพื่อการทดสอบการฝากและดึงข้อมูล มีการแบ่งเป็นส่วน Send message และ Received messages

ในภาพจะเห็นข้อมูลในส่วน Received messages ที่ส่งมาจาก FRED (NodeRED แบบ online ยังจำกันได้หรือป่าว) ขณะที่เขียนผมไม่ได้เปิดใช้งาน FRED แต่ flow ที่ได้เขียนไว้ยังทำงานอยู่ตลอดเวลา เป็นการยืนยันว่า flow ที่ active อยู่จะทหน้าที่ของมัน แม้ว่าเราจะปิด browser ไปแล้ว

ตอนนี้ให้ทดลองใส่ข้อมูลใน Topic ซึ่งสามารถจัดกลุ่มของข้อมูลได้ด้วย สำหรับตัวอย่างที่เห็นในด้าน Received messages จะมีกลุ่ม livingroom ที่ประกอบด้วย temperature และ humidity เป็นสมาชิก ซึ่งจะเป็นข้อมูลแต่ละตัว เครื่องหมาย / จะคั่นระหว่างกลุ่มกับตัวข้อมูล

ทดลองพิมพ์ livingroom/temperature ในช่อง Topic และ 25 ในช่อง Message และ กดปุ่ม Send

image

* ในภาพผมได้ทำให้ flow ที่ active อยู่ หยุดทำงาน และ refresh browser จะเห็นด้าน Received messages จะถูกเคลียร์

จะเห็นข้อมูลเดียวกันที่ฝั่ง Received messages แทบจะทันที่ นั่นก็คือ handler แจ้ง CPU ว่ามีข้อมูลใหม่เข้ามา CPU ดำเนินการอ่านข้อมูลและนำค่าที่ได้มาแสดง

ด้าน Received messsages จะแสดงข้อมูลทั้งหมดที่มีการส่ง

สำหรับการเลือกอ่านข้อมูล จะมีรูปแบบที่ใช้เครื่องหมาย # เป็น wildcard คืออะไรก็ได้ ตัวอย่างเช่น ถ้าเราตั้งกลุ่ม livingroom และมีสมาชิกเป็น temperature และ humidity

ถ้าต้องการรับค่าเฉพาะสมาชิก ให้เขียนรูปแบบ

livingroom/temperature หรือ livingroom/humidity

แต่ถ้าจะรับค่าได้กับสมาชิกทุกตัว ก็ให้เขียนรูปแบบ

livingroom/#

แต่ต้องทำโปรแกรมเพื่อแยกข้อมูลเอง

 

ถีงตอนนำเอาทุกอย่างมารวมกัน ให้เข้าใช้งาน https://fred.sensetecnic.com/red/# เพื่อสร้าง flow จากนั้นวาง node MQTT in หนึ่งตัว out สองตัว Inject node สองตัวและ debug node หนึ่งตัว ตามภาพ

ส่วนของการสร้าง flow ถ้าไม่คุ้นเลย แสดงว่าอ่านข้ามโพสต์ในส่วนนั้นมา ให้ย้อนไปศึกษาในโพสต์ก่อนหน้าเสียก่อน

image

ตั้งค่า MQTT in node ดับเบิ้บ คลิ๊กที่ตัว node

image

กดที่รูปปากกาเพื่อตั้งค่า mqtt-broker

image

ป้อนข้อมูลที่ได้จาก CloudMQTT Instance Info ,

Server ในช่อง Broker

User ป้อนในช่อง Client ID และ Username

Password ในช่อง Password

จากนั้นให้กดปุ่ม Add

สังเกตุตำว่า Add ความหมายคือ เราสามารถสร้าง MQTT Broker ได้หลายตัวใน flow ที่กำลังใช้งานอยู่ โดยเลือก Broker ที่ต้องการใช้ใน MQTT in หรือ out node

* mqtt-broker ที่เพิ่งสร้างนี้จะถูกนำไปใช้กับ MQTT node out ด้วย

เมื่ออกจากการเพิ่ม MQTT Broker เรียบร้อย ทำการเลือก Broker และทำการป้อน Topic เป็น livingroom/# (เป็นการรับข้อมูลทุกตัวที่ขึ้นต้นด้วย livingroom)

image

mqtt node out 2 ตัว ให้ตั้งค่า Topic เป็น livingroom/temperature กับ livingroom/humidity โดยเลือกใช้ Broker ตัวเดียวกันกับ mqtt node in

สำหรับช่อง Name จะใส่หรือไม่ก็ได้

image

สำหรับ inject node ทั้งสองตัวให้เลือกรูปแบบ String และใส่ข้อความในช่องถัดมาเป็นอะไรก็ได้ ให้แตกต่างกัน จะได้เห็นผลลัพธฺ์ที่ชัดเจน สำหรับผมใช้ temperature : 25.3 กับ Humidity : 50

image

ส่วนของ Debug node

image

หลังจาก deploy ให้ทดลองกดที่ inject node แต่ละตัว ดูผลที่ debug

ถ้ายังเปิด Websocket อยู่ จะเห็นผลเดียวกันแสดงในฝั่ง Received message ด้วย

จะเห็นว่าเมื่อเรามี user และ password แล้ว ไม่จำเป็นต้องทำอะไรอีก ก็สามารถใช้งาน MQTT ได้ทันที ยังไงก็ตาม ขอให้ทดลองปรับเปลี่ยนเพิ่มเติมในส่วนต่างๆ เพื่อให้สามารถนำไปประยุกต์ใช้งานในขั้นกว่าได้

สุดท้ายขอเน้นว่าทั้งหมดเป็น MQTT ที่ผมเข้าใจ และยังคงยืนยันคอนเซ็ปที่เนื้อหาที่เข้าใจได้ง่าย และสามารถนำไปปรับใช้ได้

สำหรับผู้ที่ติดตามอ่านแล้ว ติดขัดไม่เข้าใจตรงไหน สามารถโพสต์ในเฟส Node-RED Siam เพื่อให้เพื่อนๆได้แลกเปลี่ยนความรู้กันได้ครับ

1 ความคิดเห็น:

  1. How do I make money from playing games and earning
    These are the three most popular forms of gambling, and are explained งานออนไลน์ in a very aprcasino concise and jancasino.com concise manner. 바카라 사이트 The most common forms of sol.edu.kg gambling are:

    ตอบลบ