
Preskúmajte, ako použiť MQTT s Node.js na vytvorenie príkazovej aplikácie pre real‑time messaging v IoT projektoch.
MQTT je ľahký publish/subscribe messaging protokol. Je navrhnutý tak, aby sa jednoducho používal a mal minimálnu spotrebu zdrojov. Práve táto efektivita prispela k jeho širokému využitiu v IoT (Internet of Things).
Princíp MQTT je jednoduchý. Vystupujú v ňom tri základné roly: broker, publisher a subscriber.
Broker je zodpovedný za sprostredkovanie (distribúciu) dát od publishera k subscriberom.
Publisher posiela aktualizácie brokerovi. Publisherov môže byť veľa a môžu posielať rôzne typy dát.
Subscriber je klient, ktorý chce prijímať hodnoty publikované publisherom cez brokera. Publisher a subscriber o sebe nemusia nič vedieť – sú voči sebe anonymní a priamo spolu nekomunikujú.
Vo všeobecnosti broker prijme správu od publishera a okamžite ju prepošle subscriberom bez ukladania ("forward & forget"). Identifikácia správ prebieha cez odoberanie (subscribe) konkrétneho topicu.
V kontexte MQTT je topic niečo ako adresa alebo URL. Publisher publikuje dáta na konkrétny topic a subscriber sa na tento topic prihlási, aby dostával aktualizácie od brokera vždy, keď sa na ňom objavia nové dáta.
V MQTT je možné nastaviť úrovne QoS (Quality of Service). Publisher môže posielať správy na topic s inou QoS než subscriber odoberajúci ten istý topic. MQTT podporuje viacero úrovní, no vo väčšine prípadov postačí QoS 0, pri ktorom broker doručí správu raz bez potvrdenia.
Najskôr potrebujeme brokera. Mosquitto je open‑source broker, ktorý implementuje MQTT protokol. Je ľahký a vhodný na použitie na rôznych zariadeniach – od low‑power počítačov až po plnohodnotné servery.
Mosquitto sa dá veľmi jednoducho nasadiť pomocou Docker Compose:
services:
mosquitto:
image: eclipse-mosquitto:2.0.18
container_name: mqtt-broker
restart: always
volumes:
- ./mosquitto.conf:/mosquitto/config/mosquitto.conf
ports:
- "1883:1883"
V predvolenom nastavení Mosquitto kontajner používa konfiguračný súbor na ceste:
/mosquitto/config/mosquitto.conf
Konfiguračný súbor môžete upraviť priamo v bežiacom Docker kontajneri alebo ho pripojiť (mount) z hostiteľského systému – ako v našom prípade. Pre lokálnu implementáciu zmeníme nasledovné nastavenia:
listener 1883
allow_anonymous true
Aby sme vedeli s brokerom komunikovať, vytvoríme nový Node.js projekt a nainštalujeme MQTT knižnicu mqtt.
npm init -y # Automatically agree to default settings
npm install mqtt
Knižnicu použijeme na implementáciu publishera v súbore publisher.js:
const mqtt = require("mqtt");
var client;
const topic = "temperature";
const brokerUrl = `mqtt://127.0.0.1:1883`;
function connectToBroker() {
client = mqtt.connect(brokerUrl, {
keepalive: 60,
clientId: "publisherId",
protocolId: "MQTT",
protocolVersion: 4,
clean: true,
reconnectPeriod: 1000,
connectTimeout: 30 * 1000,
});
client.on("error", (err) => {
console.log("Error: ", err);
client.end();
});
client.on("connect", () => {
console.log("Client connected to broker");
});
}
function publishMessage() {
// Publish a message every 3 seconds
setInterval(() => {
const temperature = (Math.random() * 100).toFixed(2);
client.publish(topic, temperature.toString());
console.log();
}, );
}
();
();
Po spustení vyššie uvedeného kódu bude publisher každé 3 sekundy v cykle publikovať náhodné číslo na topic temperature.
Na implementáciu subscribera použijeme rovnakú knižnicu a vytvoríme nový súbor subscriber.js:
const mqtt = require("mqtt");
var client;
const topic = "temperature";
const brokerUrl = `mqtt://127.0.0.1:1883`;
const clientOptions = {
keepalive: 60,
clientId: "subscriberUniqueClientId",
protocolId: "MQTT",
protocolVersion: 4,
clean: true,
reconnectPeriod: 1000,
connectTimeout: 30 * 1000,
}; // Client options for connecting to the broker
function connectToBroker() {
client = mqtt.connect(brokerUrl, clientOptions);
client.on("error", (err) => {
console.log("Error: ", err);
client.end();
});
client.on("connect", () => {
console.log("Client connected to broker");
});
}
function subscribeToTopic() {
client.subscribe(topic, (err) => {
if (!err) {
// Subscribe to the topic
client.on("message", (topic, message) => {
// Message is of type Buffer and needs to be converted into a string
.(
);
});
} {
.();
}
});
}
();
();
Po spustení vyššie uvedeného kódu sa subscriber prihlási na topic temperature a pri každej aktualizácii vypíše aktuálnu hodnotu do konzoly.
MQTT je kľúčový protokol v IoT ekosystéme, ktorý umožňuje ľahkú a efektívnu publish/subscribe komunikáciu medzi zariadeniami. V tomto návode sme si prešli základné koncepty MQTT, ukázali sme si nastavenie Mosquitto brokera a implementovali jednoduchého publishera a subscribera v Node.js. Jednoduchá integrácia MQTT s Node.js z neho robí výbornú voľbu pre vývojárov, ktorí chcú posunúť svoje IoT riešenia ďalej.
Ak vám tento návod pomohol, zvážte jeho zdieľanie s ďalšími, ktorým by sa mohol hodiť. Spätná väzba a návrhy na zlepšenie sú vždy vítané – pokojne zanechajte komentár alebo napíšte, čo si o tom myslíte.