Node-RED ile MQTT birbirini doğal olarak tamamlar: MQTT mesajları cihazlar arasında taşır, Node-RED ise bu mesajları tam bir uygulama yazmadan dashboard’lara, veritabanlarına, alarmlara ve API’lere bağlamanızı sağlar. Node-RED kutudan çıktığı haliyle iki MQTT node’u içerir — mqtt in ve mqtt out — ve bunlara ek olarak ortak kullanılan bir broker config node. Bu rehber üçünü de ele alıyor ve içe aktarabileceğiniz hazır bir flow ile bitiyor.
Node-RED’i çalıştırın
Henüz Node-RED kurulu değilse en hızlı seçenekler npm veya Docker’dır:
# Node.js kuruluysa
npm install -g --unsafe-perm node-red
node-red
# veya Docker ile
docker run -it -p 1880:1880 -v node_red_data:/data --name nodered nodered/node-redTarayıcınızda http://localhost:1880 adresini açın. Node-RED yalnızca client tarafıdır — yine de bir broker’a ihtiyacınız var. Yerel geliştirme için yanına Docker’da Mosquitto çalıştırın; hızlı bir test için ise herkese açık HiveMQ broker’ı hiçbir kurulum gerektirmeden çalışır.
MQTT broker node’unu yapılandırın
Canvas’a bir mqtt in node’u sürükleyin, üzerine çift tıklayın ve Server alanının yanındaki kalem simgesine tıklayarak bir broker yapılandırması oluşturun. Aynı config node’u kullanan tüm MQTT node’ları tek bir bağlantıyı paylaşır.
| Sekme / alan | Ne girilmeli |
|---|---|
| Connection — Server, Port | Yalnızca host adı (örneğin broker.hivemq.com); düz TCP için port 1883, TLS için 8883 |
| Connection — Use TLS | 8883 portu için etkinleştirin; broker’ınız özel bir CA kullanıyorsa CA sertifikasıyla bir TLS yapılandırması ekleyin |
| Connection — Protocol | MQTT V3.1.1 veya MQTT V5 |
| Connection — Client ID | Otomatik oluşturulması için boş bırakın ya da benzersiz bir değer girin |
| Connection — Keep Alive | 60 saniye makul bir varsayılandır |
| Security — Username, Password | Broker kimlik bilgileriniz (Node-RED’in şifrelenmiş credentials dosyasında saklanır) |
| Messages — Birth, Close, Will | İsteğe bağlı durum mesajları; örneğin retained bir online/offline topic’i |
Messages sekmesindeki Will mesajı, MQTT’nin Last Will özelliğidir — bkz. Last Will and Testament. Deploy ettikten sonra her MQTT node’unun altında yeşil bir connected etiketi görüyorsanız broker bağlantıyı kabul etmiş demektir. Broker’ınızın hangi portu kullandığından emin değil misiniz? MQTT portları rehberine göz atın.
mqtt in node’u ile abone olun
Abone olunacak Topic’i girin — wildcard (joker karakter) kullanılabilir, dolayısıyla testmqtt/nodered-demo/+/telemetry tüm odalardan gelen telemetriyi alır. Gelen her mesaj, şu alanlara sahip bir Node-RED msg nesnesine dönüşür:
msg.payload— mesaj gövdesimsg.topic— mesajın geldiği somut topicmsg.qosvemsg.retain— teslimat ayrıntıları
Deploy etmeden önce topic filtrelerinizi MQTT topic eşleştirici ile test edin. Output seçeneği msg.payload’un tipini belirler:
- auto-detect (string or buffer) — metin string’e dönüşür, binary veri Buffer olarak kalır.
- a parsed JSON object — node sizin yerinize
JSON.parseçalıştırır, böylecemsg.payload.tempdoğrudan kullanılabilir. Geçersiz JSON, bir catch node’u ile yakalayabileceğiniz bir hata üretir. - auto-detect (parsed JSON object, string or buffer) — mümkünse JSON’u ayrıştırır, değilse string’e geri döner.
İsterseniz varsayılan çıktıyı koruyup mqtt in’in ardından bir json node’u ekleyebilirsiniz; bu node JSON string’ini nesneye, nesneyi de JSON string’ine dönüştürür.
Dinamik abonelikler
mqtt in node’unun topic tipini Dynamic subscription olarak ayarladığınızda node’a bir giriş eklenir. Çalışma zamanında kontrol etmek için ona msg.action değeri subscribe (topic ise msg.topic içinde), unsubscribe, connect veya disconnect olan bir mesaj gönderin — cihaz listesi değiştiğinde oldukça işe yarar.
mqtt out node’u ile publish edin
mqtt out node’u msg.payload’u yayınlar. Payload bir nesneyse otomatik olarak JSON string’ine dönüştürülür. Node’un alanları yedek değer olarak çalışır:
- Topic —
msg.topic’in kullanılması için boş bırakın. Dinamik topic’lere, örneğin cihaz başına bir topic’e, bu şekilde publish edersiniz. - QoS ve Retain —
msg.qosvemsg.retaindeğerlerinin mesajdan alınması için boş bırakın.
Topic’i her mesaj için oluşturmanın en basit yolu bir function node’udur:
const room = msg.payload.room || 'unknown';
msg.topic = 'testmqtt/nodered-demo/' + room + '/telemetry';
msg.payload = { temp: msg.payload.temp, ts: Date.now() };
msg.qos = 1;
return msg;Retained durum ve birth mesajları
Broker config node’u bağlandığında bir Birth mesajı, temiz bir bağlantı kesilmesinden önce bir Close mesajı ve bağlantı koparsa bir Will mesajı yayınlayabilir. Üçünü de tek bir retained topic’e, örneğin online ve offline değerleriyle nodered/status’a yönlendirmek, diğer sistemlere Node-RED instance’ınızın ayakta olup olmadığını görmeleri için güvenilir bir yol sunar. Retained mesajlar MQTT retained mesajlar yazısında anlatılıyor.
Protokol MQTT V5 olarak ayarlandığında node’lar message expiry, content type, user properties ve No Local, Retain As Published ile Retain Handling abonelik bayrakları gibi ek seçenekler sunar.
İçe aktarılacak örnek flow
Bu flow her 10 saniyede bir rastgele bir sıcaklık okumasını testmqtt/nodered-demo/room1/telemetry topic’ine yayınlar, JSON ayrıştırma açıkken tüm odalara abone olur ve 24 °C’nin üzerindeki okumaları debug kenar çubuğuna yazar. Kopyalayın, menüyü açın, Import’u seçin, yapıştırın ve deploy edin.
[
{
"id": "b1a1c0de00000001",
"type": "mqtt-broker",
"name": "HiveMQ public",
"broker": "broker.hivemq.com",
"port": "1883",
"clientid": "",
"autoConnect": true,
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true
},
{
"id": "b1a1c0de00000002",
"type": "inject",
"name": "every 10 s",
"props": [{ "p": "payload" }],
"repeat": "10",
"once": true,
"onceDelay": "1",
"payload": "",
"payloadType": "date",
"x": 130,
"y": 80,
"wires": [["b1a1c0de00000003"]]
},
{
"id": "b1a1c0de00000003",
"type": "function",
"name": "build reading",
"func": "msg.topic = 'testmqtt/nodered-demo/' + 'room1' + '/telemetry';\nmsg.payload = { temp: +(18 + Math.random() * 8).toFixed(1), ts: msg.payload };\nreturn msg;",
"outputs": 1,
"x": 320,
"y": 80,
"wires": [["b1a1c0de00000004"]]
},
{
"id": "b1a1c0de00000004",
"type": "mqtt out",
"name": "publish",
"topic": "",
"qos": "1",
"retain": "false",
"broker": "b1a1c0de00000001",
"x": 510,
"y": 80,
"wires": []
},
{
"id": "b1a1c0de00000005",
"type": "mqtt in",
"name": "subscribe",
"topic": "testmqtt/nodered-demo/+/telemetry",
"qos": "1",
"datatype": "json",
"broker": "b1a1c0de00000001",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 140,
"y": 160,
"wires": [["b1a1c0de00000006"]]
},
{
"id": "b1a1c0de00000006",
"type": "switch",
"name": "temp > 24",
"property": "payload.temp",
"propertyType": "msg",
"rules": [{ "t": "gt", "v": "24", "vt": "num" }],
"checkall": "true",
"outputs": 1,
"x": 330,
"y": 160,
"wires": [["b1a1c0de00000007"]]
},
{
"id": "b1a1c0de00000007",
"type": "debug",
"name": "too warm",
"active": true,
"tosidebar": true,
"complete": "true",
"x": 510,
"y": 160,
"wires": []
}
]Mesajların gerçekten broker’a ulaştığını doğrulamak için aynı mesajları Node-RED dışından izleyin:
Node-RED mesajlarınızı canlı izleyin
Sorun giderme
- “Connecting” durumunda takılı kalıyor — port veya TLS ayarı yanlış ya da Server alanı
mqtt://içeriyor. Yalnızca host adını girin. - Bağlanıp döngü halinde kopuyor — başka bir client aynı client ID’yi kullanıyor; bu genellikle flow’u kopyalanmış ikinci bir Node-RED instance’ıdır. Alanı temizleyin.
- Hiç mesaj gelmiyor — abonelik topic’i publish topic’iyle eşleşmiyor (büyük/küçük harf önemli) veya broker’daki bir ACL buna izin vermiyor. Ayrıntılar için MQTT bağlantı hataları rehberine bakın.
Mantığı ileride Node-RED’den bir script’e mi taşıyacaksınız? MQTT kod üreteci, kendi broker ayarlarınız için Python, JavaScript ve diğer dillerde client kodu üretir; online MQTT client ise flow’larınızı geliştirirken topic’leri kurcalamak için oldukça kullanışlıdır.
Sıkça sorulan sorular
Node-RED bir MQTT broker’ı içeriyor mu?
Hayır. Node-RED MQTT client node’larıyla (mqtt in ve mqtt out) gelir, ancak bir broker içermez. Bu node’ları Mosquitto, EMQX, yönetilen bir broker veya herkese açık bir test broker’ı gibi mevcut bir broker’a bağlarsınız. Topluluk eklenti node’ları bir broker gömebilir, ancak yaygın kurulum ayrı bir broker kullanmaktır.
Node-RED’de MQTT topic’ini dinamik olarak nasıl ayarlarım?
mqtt out node’unun Topic alanını boş bırakın ve msg.topic değerini önceki bir node’da, örneğin bir change veya function node’unda ayarlayın. Node bu durumda her mesajı msg.topic içindeki topic’e publish eder. QoS ve retain de aynı şekilde msg.qos ve msg.retain üzerinden gelebilir.
Node-RED MQTT node’um neden disconnected gösteriyor?
Broker config node’unu kontrol edin: host, port ve TLS ayarı broker listener’ı ile eşleşmeli, kimlik bilgileri Security sekmesine girilmeli ve client ID benzersiz olmalı ya da boş bırakılmalıdır. Aynı client ID’yi kullanan iki node veya instance birbirlerinin bağlantısını sürekli koparır.