Thanapon Tapala

Backend Developer

Embedded Developer

Smart Farmer

Maker

Thanapon Tapala

Backend Developer

Embedded Developer

Smart Farmer

Maker

Blog Post

[MQTT] ลอง MQTT บน NodeJS เถอะครับ

November 17, 2019 MQTT, NodeJs, SONOFF
[MQTT] ลอง MQTT บน NodeJS เถอะครับ

ก่อนอื่นต้องบอกต้องอธิบายโปรโตคอล MQTT ก่อนนะครับว่าคืออะไร สำหรับคนที่เคยเล่นพวก IoT อะไรพวกนี้คงจะรู้จักดีเลยครับเพราะ MQTT กับตัว ESP32 หรือ ESP8266 นี้คือของคู่กันเลยครับ

MQTT คืออะไร

MQTT (Message Queueing Telemetry Transport protocol)คือโปรโตคอลที่ใช้สำหรับสื่อสารกันระหว่าง m2m หรือ machine to machine ซึ่งถูกออกแบบมาเพื่อรับส่งข้อมูลกันโดยจะมีตัวกลางในการรับส่งนั้นก็คือ MQTT Broker นั้นเองครับ ภายในโปรโตคอลจะมีรูปแบบการส่งแบบ publish(ผู้ส่ง) และ subscribe(ผู้รับ) การทำงานคือ ทั้ง subscribe และ publish จะต้องทำการเข้าร่วม topic เดียวกันก่อน ซึ่งสมมติ ผมเป็น publish เข้าร่วม topic ที่ชื่อว่า test, subscribe จะต้องเข้าร่วม topic ชื่อว่า test เช่นกัน ส่วนการส่งนั้น publish ก็แค่ทำหน้าที่ publish message ออกมาแล้ว message ก็จะถูกส่งไปหาตามผู้ที่ subscribe topic นั้นทั้งหมดเองครับ

MQTT จะแบ่ง QOS สำหรับการรับส่งได้เป็น 3 ประเภทคือ

  • QOS0 : (at most once) คือส่งไปอย่างเดียวจะไม่รอรับ ACK จากปลายทาง
  • QOS1 : (at least once) คือหลังจากส่งไปแล้วจะรอรับ ACK ก่อนแล้วค่อยลบ message
  • QOS2 : (exactly once) หลังจากส่งข้อมูลไปแล้วจะรอรับ ACK จากปลายทางก่อนแล้วหลังจากนั้นจะทำการส่ง recheck flag ไปอีกรอบหนึ่ง

และเนื่องด้วยความสามารถทางด้าน physical ของ MQTT ที่มีขนาดเล็กอีกทั้งยังใช้ bandwidth ที่ต่ำกว่าพวก HTTP ทำให้ MQTT นั้นจะถูกประยุกต์ใช้กับอุปกรณ์ IoT ด้วยครับ

Mosquitto MQTT Broker

เมื่อพูดถึง MQTT Broker ทางด้านสาย IoT เราจะต้องนึกถึง Mosquitto เป็นอันดับต้นๆเสมอครับโดย Mosquitto นั้นเป็น MQTT Broker ซึ่งจะเป็นตัวจัดการ Data Broker Middleware สำหรับ Publish และ Subscribe โดยที่เราไม่ต้องไปยุ่งยากทำอะไรกับข้อมูลของเรา แค่ทำการติดตั้งแล้วก็สามารถใช้งานได้เลยครับ

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

  • อันดับแรกให้เราติดตั้งผ่าน terminal นะครับโดยเครื่องที่ผมจะติดตั้งเป็น Ubuntu OS นะครับ
sudo apt-get install mosquitto mosquitto-client
  • จากนั้นทำการทดสอบ subscribe topic โดยให้ทำการเปิดหน้า terminal ขึ้นมา 2 หน้าต่างด้วยกันนะครับซึ่งจะตั้งให้ terminal ตัวที่ 1 subscribe topic “test” ส่วนอีก terminal ตัวที่ 2 ให้ทำการ publish message “hello world” ผ่าน topic “test”
//terminal 1
mosquitto_sub -h localhost -t test
//terminal 2
mosquitto_pub -h localhost -t test -m "hello world" 

ผลลัพท์ที่ได้คือ terminal ตัวที่ 1 จะมี message “hello world” ขึ้นมานะครับ

var mqtt = require('mqtt');

const MQTT_SERVER = "Your Server Address";
const MQTT_PORT = "1883";
//if your server don't have username and password let blank.
const MQTT_USER = ""; 
const MQTT_PASSWORD = "";

// Connect MQTT
var client = mqtt.connect({
    host: MQTT_SERVER,
    port: MQTT_PORT,
    username: MQTT_USER,
    password: MQTT_PASSWORD
});

client.on('connect', function () {
    // Subscribe any topic
    console.log("MQTT Connect");
    client.subscribe('test', function (err) {
        if (err) {
            console.log(err);
        }
    });
});

// Receive Message and print on terminal
client.on('message', function (topic, message) {
    // message is Buffer
    console.log(message.toString());
});

setInterval(() => {
    client.publish("test", "hello from NodeJS");
}, 5000);
  • จากโปรแกรมด้านบนจะเป็นตัวอย่างสำหรับเชื่อมต่อเข้ากับ MQTT Broker ซึ่งหลังจากที่ MQTT เชื่อมต่อเข้ากับ Broker เสร็จแล้วตัวโปรแกรมจะทำการ subscribe topic “test” แล้วทำการวนลูปส่งข้อความ “hello from NodeJS” ทุกๆ 5 วินาทีครับ
Image for post
  • ซึ่งการทำงานของ MQTT จากรูปด้านบนเราจะเห็นได้ว่า ไม่ว่าตัวไหนก็ตามที่ทำการ subscribe topic นั้นๆ ใครที่ส่งข้อมูลอะไรมาก MQTT ก็จะทำการ broadcast ข้อมูลออกไปยังเครื่องที่ subscribe ไว้ไม่ว่าจะเป็น 10 เครื่อง หรือ 100 เครื่องก็จะได้รับข้อมูลทั้งหมดนะครับ

ก็เสร็จสิ้นสำหรับการส่งข้อความผ่าน MQTT กันนะครับผม สำหรับการประยุกต์ใช้ MQTT นั้นจริงๆจะมีอยู่มากมายเลยครับไม่ว่าจะเป็น Smart home โดยใช้ ESP32 หรือ ESP8266 ทำหน้าที่เป็น microcontroller ควบคุม relay ผ่าน MQTT ซึ่งใครที่มีพื้นฐานที่เป็น web developer หน่อยก็สามารถทำ web application สำหรับควบคุมไฟฟ้าในบ้านได้ง่ายๆด้วย MQTT + กับ Tasmota firmware จากเรื่องคราวก่อนด้วยนะครับเพราะเนื่องจากว่า Tasmota firmware รองรับ MQTT อยู่แล้วด้วยเพียงแค่เราเข้าไปตั้งค่าตรงหัวข้อ configuration แล้วชี้มายัง MQTT Broker ของเราเท่านี้ก็สามารถใช้งาน MQTT ควบคุมได้แล้วครับ

สำหรับวันนี้ขอบคุณและสวัสดีครับ 🙂

[ESP8266-Sonoff] มาลอง TASMOTA firmware สำหรับ Sonoff กันครับ

พอดีได้มีโอกาสไปลองเล่น Sonoff มา ซึ่งรุ่นที่ได้ลองจะเป็น Module Sonoff Basic ลักษณะจะคล้ายๆกับบัลลาสต์เลยครับแต่ขนาดตัวจะเล็กกว่าประมาณครึ่งเลยที่เดียวครับ

mqtt

MQTT.js is a client library for the MQTT protocol, written in JavaScript for node.js and the browser.
Taggs: