Bu Node-RED MQTT eğitimi; Node-RED'i bir broker'a nasıl bağlayacağınızı, mesajları nasıl alıp yayımlayacağınızı, ham JSON'u canlı bir dashboard'a nasıl dönüştüreceğinizi ve değerler bir eşiği aştığında nasıl uyarı tetikleyeceğinizi gösterir. broker.connectmq.com adresindeki ücretsiz public broker üzerinde içe aktarılabilir bir akışla başlayacak, ardından tek bir yapılandırma node'unu değiştirerek aynı akışı TLS ile şifrelenmiş özel bir broker'a geçireceksiniz. Buradaki her şey bir dizüstü bilgisayarda, Raspberry Pi'de veya Docker container'ında çalışır.
Node-RED ve MQTT Neden Birbirine Uyar?
Node-RED akış tabanlı bir programlama aracıdır: node'ları bir tarayıcı editöründe birbirine bağlarsınız ve her mesaj kablolar boyunca msg adlı bir JavaScript nesnesi olarak ilerler. MQTT ise client'ların topic'ler kullanarak bir broker üzerinden mesaj alışverişi yaptığı bir publish/subscribe protokolüdür. İkisi aynı zihinsel modeli paylaşır. Bir mqtt in node'u bir akışa mesaj enjekte eden bir abonedir, bir mqtt out node'u ise kendisine ulaşan her şeyi gönderen bir yayıncıdır.
Bu, Node-RED'i bir MQTT sisteminin etrafında doğal bir yapıştırıcı katman yapar. Tipik görevler şunlardır:
- Farklı payload formatları konuşan cihazlar arasında çeviri yapmak.
- Bir front-end projesi olmadan hızlı operatör dashboard'ları oluşturmak.
- Eşikleri izlemek ve e-posta veya sohbet uygulaması üzerinden bildirim göndermek.
- Telemetriyi bir zaman serisi veritabanına yazmak.
- Modbus, OPC UA veya HTTP gibi protokolleri MQTT topic'lerine köprülemek.
Önce broker'lar, topic'ler ve wildcard'lar hakkında hafızanızı tazelemeniz gerekiyorsa bir MQTT broker'ın ne yaptığını okuyun. Bu rehberin geri kalanı, +'nın tek bir topic seviyesiyle, #'nin ise bir seviyenin altındaki her şeyle eşleştiğini bildiğinizi varsayar.
Node-RED'i Kurun
Makinenize uyan kurulum yöntemini seçin. Güncel her Node-RED 4.x sürümü MQTT node'larını içerir; bu eğitim için dashboard adımına kadar ek pakete ihtiyacınız yoktur.
# Seçenek 1: npm (Node.js 18 veya üzeri gerekir)
sudo npm install -g --unsafe-perm node-red
node-red
# Seçenek 2: Docker
docker run -d --name nodered -p 1880:1880 -v node_red_data:/data nodered/node-red:4.0
# Seçenek 3: Raspberry Pi OS / Debian, resmî kurulum betiği
bash <(curl -sL https://github.com/node-red/linux-installers/releases/latest/download/update-nodejs-and-node-red)
Bir tarayıcıda http://localhost:1880 adresini (veya Pi'nin adresini) açın. Servis kurulumu, yükseltmeler ve Windows'a özgü ayrıntılar için adım adım Node-RED kurulumu rehberimize bakın; container tercih ediyorsanız Node-RED'i Docker'da çalıştırma yazısı volume'ları ve yeniden başlatma politikalarını ele alır. Resmî Node-RED belgeleri her çekirdek node için başvuru kaynağıdır.
Adım 1: MQTT Broker Node'unu Yapılandırın
Node-RED'deki her MQTT node'u, mqtt-broker tipinde paylaşılan bir yapılandırma node'unu gösterir. Onu bir kez yapılandırın ve tüm akışlarda yeniden kullanın; Node-RED bu durumda broker'a tek bir bağlantı tutar. Bu, hesap başına bağlantıları sınırlayan broker'larda önemlidir.
Tuvale bir mqtt in node'u sürükleyin, çift tıklayın ve yeni bir broker eklemek için Server yanındaki kalem simgesine tıklayın:
| Alan | Public broker için değer | Notlar |
|---|---|---|
| Server | broker.connectmq.com |
Yalnızca hostname, mqtt:// öneki yok |
| Port | 1883 |
Daha sonra TLS ile 8883 kullanın |
| Protocol | MQTT V5 | V3.1.1 de çalışır |
| Client ID | nodered-7f3a (kendinizinkini seçin) |
Boş olmamalı ve benzersiz olmalıdır |
| Keep Alive | 60 |
Saniye |
| Use clean start | İşaretli | Çoğu dashboard için uygundur |
Messages sekmesinde bir birth mesajı (connectmq/demo/nr-7f3a/status, payload online, retained, QoS 1) ve aynı topic'te offline değerli bir will mesajı ayarlayın. Artık diğer client'lar Node-RED instance'ınızın çalışıp çalışmadığını görebilir.
Client ID'yi neden kendiniz doldurmalısınız? Boş bırakırsanız Node-RED bir tane üretir; bu bir test broker'ında sorun değildir. Client ID'leri kimlik bilgilerine bağlayan bir production broker'ında ise size verilen ID'yi tam olarak girmeniz gerekir. Aynı client ID'ye sahip iki Node-RED instance'ı (örneğin dizüstü bilgisayarınız ve Pi'niz) birbirinin bağlantısını sürekli keser.
Adım 2: Çalışan Bir Akışı İçe Aktarın
Öğrenmenin en hızlı yolu eksiksiz bir akışı içe aktarıp parçalarına ayırmaktır. Editörde menüyü açın, Import'u seçin, aşağıdaki JSON'u yapıştırın ve Import'a tıklayın. Bu Node-RED MQTT eğitiminin diğer okuyucularıyla topic paylaşmamak için önce her nr-7f3a ifadesini kendi rastgele son ekinizle değiştirin.
[
{ "id": "tab_mqtt", "type": "tab", "label": "MQTT tutorial" },
{
"id": "cmq_broker", "type": "mqtt-broker", "name": "ConnectMQ public",
"broker": "broker.connectmq.com", "port": "1883", "clientid": "nodered-7f3a",
"autoConnect": true, "usetls": false, "protocolVersion": "5", "keepalive": "60",
"cleansession": true, "autoUnsubscribe": true,
"birthTopic": "connectmq/demo/nr-7f3a/status", "birthQos": "1", "birthRetain": "true", "birthPayload": "online", "birthMsg": {},
"closeTopic": "connectmq/demo/nr-7f3a/status", "closeQos": "1", "closeRetain": "true", "closePayload": "offline", "closeMsg": {},
"willTopic": "connectmq/demo/nr-7f3a/status", "willQos": "1", "willRetain": "true", "willPayload": "offline", "willMsg": {},
"userProps": "", "sessionExpiry": ""
},
{
"id": "inj_tick", "type": "inject", "z": "tab_mqtt", "name": "every 5 s",
"props": [{ "p": "payload" }], "repeat": "5", "crontab": "", "once": true, "onceDelay": "1",
"topic": "", "payload": "", "payloadType": "date", "x": 120, "y": 80, "wires": [["fn_sim"]]
},
{
"id": "fn_sim", "type": "function", "z": "tab_mqtt", "name": "simulate sensor",
"func": "const base = 25 + 6 * Math.sin(Date.now() / 60000);\nmsg.payload = {\n temperature: Math.round((base + Math.random()) * 10) / 10,\n humidity: Math.round(40 + Math.random() * 10),\n ts: Date.now()\n};\nreturn msg;",
"outputs": 1, "x": 310, "y": 80, "wires": [["out_tel"]]
},
{
"id": "out_tel", "type": "mqtt out", "z": "tab_mqtt", "name": "publish telemetry",
"topic": "connectmq/demo/nr-7f3a/line1/sensor1/telemetry", "qos": "0", "retain": "false",
"broker": "cmq_broker", "x": 530, "y": 80, "wires": []
},
{
"id": "in_tel", "type": "mqtt in", "z": "tab_mqtt", "name": "all sensors",
"topic": "connectmq/demo/nr-7f3a/+/+/telemetry", "qos": "1", "datatype": "auto-detect",
"broker": "cmq_broker", "nl": false, "rap": true, "rh": 0, "inputs": 0,
"x": 130, "y": 180, "wires": [["fn_alert", "dbg_tel"]]
},
{
"id": "fn_alert", "type": "function", "z": "tab_mqtt", "name": "alert on crossing 30 C",
"func": "const t = Number(msg.payload.temperature);\nif (Number.isNaN(t)) return null;\nconst key = msg.topic;\nconst wasHigh = context.get(key) || false;\nconst isHigh = t > 30;\ncontext.set(key, isHigh);\nif (isHigh === wasHigh) return null;\nmsg.topic = msg.topic.replace(/telemetry$/, 'alert');\nmsg.payload = { level: isHigh ? 'high' : 'normal', temperature: t, ts: Date.now() };\nreturn msg;",
"outputs": 1, "x": 360, "y": 180, "wires": [["out_alert", "dbg_alert"]]
},
{
"id": "out_alert", "type": "mqtt out", "z": "tab_mqtt", "name": "publish alert",
"topic": "", "qos": "1", "retain": "true", "broker": "cmq_broker", "x": 590, "y": 160, "wires": []
},
{
"id": "dbg_tel", "type": "debug", "z": "tab_mqtt", "name": "telemetry", "active": true,
"tosidebar": true, "console": false, "complete": "payload", "x": 340, "y": 240, "wires": []
},
{
"id": "dbg_alert", "type": "debug", "z": "tab_mqtt", "name": "alerts", "active": true,
"tosidebar": true, "console": false, "complete": "true", "x": 580, "y": 220, "wires": []
}
]
Deploy'a tıklayın. Birkaç saniye içinde her MQTT node'unun altındaki küçük durum göstergesi "connected" yazısıyla yeşile döner ve debug kenar çubuğu telemetri nesnelerini göstermeye başlar. Mesajların gerçekten broker üzerinden geçtiğini bir terminalden doğrulayın:
mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-cli-7f3a -v -t "connectmq/demo/nr-7f3a/#"
Önce retained status mesajını, ardından her beş saniyede bir telemetri mesajını ve simüle edilen sıcaklık 30'u her geçtiğinde bir uyarıyı görmelisiniz.
Adım 3: mqtt in ve mqtt out Node'larını Anlayın
İçe aktarılan akış her MQTT node'unu belirli bir şekilde kullanır ve en sık değiştireceğiniz ayarlar bunlardır.
mqtt in node'u
- Topic wildcard kabul eder.
connectmq/demo/nr-7f3a/+/+/telemetry, önekinizin altındaki her hattaki her sensörden telemetri alır vemsg.topichangisinin gönderdiğini söyler. - auto-detect olarak ayarlanan Output, JSON payload'larını nesnelere ayrıştırır, düz metni dize olarak bırakır ve ikili veriyi bir Buffer olarak geçirir. Bir cihaz bazen hatalı JSON gönderiyorsa, hataları yakalayabilmek için bunun yerine a String seçin ve bir JSON node'u ile kendiniz ayrıştırın.
- QoS, almak istediğiniz maksimum QoS'tur. Broker, yayıncının ve abonenin QoS'larından düşük olanıyla teslim eder.
- Dinamik abonelik: node'u girdi kabul edecek şekilde ayarlayın ve ona
msg.topicile birliktemsg.action = "subscribe"gönderin. Bu, tek bir akışın yalnızca çalışma zamanında bilinen topic'leri izlemesini sağlar; Node-RED'de dinamik MQTT abonelikleri rehberinde eksiksiz bir örnek var.
mqtt out node'u
- Node'un Topic alanı boşsa
msg.topic'e yayın yapar. Uyarı dalı buna dayanır: function node'u topic'i.../telemetry'den.../alert'e yeniden yazar. - Topic alanı doluysa
msg.topic'i geçersiz kılar. Yeni başlayanların sık yaptığı bir hata, ikisini birden ayarlayıp mesajların neden yanlış topic'e düştüğünü merak etmektir. msg.payloadiçindeki nesneler otomatik olarak JSON'a dönüştürülür. Sayılar ve boolean'lar dizeye dönüşür.- Uyarı ve durum topic'lerinde Retain, daha sonra abone olan her client'ın en son değeri hemen görmesi demektir. Yüksek frekanslı telemetride kapalı bırakın.
Dizeleri nesnelere ve geri dönüştürmek dahil daha derin JSON işleme için Node-RED JSON node'u yazısına bakın. Uyarı fonksiyonu gibi mantık yazmak için ise context depolama, çoklu çıkışlar ve hata yönetimini ele alan Node-RED function node'u yazısını okuyun.
Adım 4: Bir Node-RED MQTT Dashboard'u Oluşturun
Ham debug çıktısı bir operatöre verebileceğiniz bir şey değildir. Dashboard 2.0, Node-RED için güncel ve aktif olarak geliştirilen dashboard'dur. Manage palette üzerinden @flowfuse/node-red-dashboard aratarak veya komut satırından kurun:
cd ~/.node-red
npm install @flowfuse/node-red-dashboard
# ardından Node-RED'i yeniden başlatın
Ardından akışınızı genişletin:
all sensorsmqtt in node'undan sonra aşağıdaki kodu içeren bir function node'u ekleyin. Her telemetri nesnesini grafiğe uygun mesajlara böler.- İlk çıkışını bir ui-gauge'a (aralık 0 ile 50, etiket "Temperature") ve ayrıca bir ui-chart'a (tip line, X ekseni zaman) bağlayın.
- İkinci çıkışı nem için ikinci bir ui-gauge'a bağlayın.
- İlk widget'ı eklediğinizde Node-RED sizden bir sayfa ve bir grup oluşturmanızı ister; varsayılanları kabul edin.
- Deploy edin ve
http://localhost:1880/dashboardadresini açın.
// Gauge'lar ve grafikler için telemetriyi metrik başına bir mesaja böl
const sensor = msg.topic.split("/").slice(-2, -1)[0]; // ör. "sensor1"
const p = msg.payload;
if (typeof p !== "object" || p === null) return null;
return [
{ topic: `${sensor} temperature`, payload: Number(p.temperature) },
{ topic: `${sensor} humidity`, payload: Number(p.humidity) }
];
Bu function node'unu Setup sekmesinde iki çıkışa ayarlayın. msg.topic içinde sensör adını kullanmak, daha fazla cihaz eklediğinizde tek bir grafiğin otomatik olarak sensör başına bir çizgi çizmesi demektir.
Bir cihazı dashboard'dan kontrol etmek için açık ve kapalı payload'ları ON ve OFF olan bir ui-switch ekleyin ve onu connectmq/demo/nr-7f3a/line1/fan1/set gibi bir topic'e ve QoS 1'e sahip bir mqtt out node'una bağlayın. En iyi uygulama, anahtarın gösterilen durumunu tıklamadan değil cihazın kendi durum topic'inden yürütmektir; böylece dashboard donanımın ulaşmadığı bir durumu asla göstermez. Düzenler, temalar ve çok sayfalı dashboard'lar Node-RED Dashboard 2.0 rehberimizde ele alınıyor; uzun geçmişi saklamak ise InfluxDB ile Node-RED yazısının konusu.
Adım 5: Uyarılar ve Otomasyon
İçe aktarılan akıştaki alert on crossing 30 C fonksiyonu bilerek bir kenar dedektörü olarak yazılmıştır. Önceki durumu topic başına node context'inde saklar ve yalnızca durum değiştiğinde bir mesaj üretir. Bu olmadan 31 derecede duran bir sensör her beş saniyede bir uyarı tetikler ve gelen kutunuzu doldururdu.
Uyarı topic'inden herhangi bir bildirim kanalına dağıtım yapabilirsiniz:
node-red-node-emailnode'u ile e-posta; bkz. Node-RED'den e-posta uyarıları gönderme.- Bir bot ile anlık telefon bildirimleri için Telegram; bkz. Node-RED Telegram uyarıları.
- Bir siren, ışık kulesi veya başka bir sistem tarafından tüketilen başka bir MQTT topic'i.
Uyarının kendisi MQTT'ye retained bir mesaj olarak geri yayımlandığı için tek tüketici Node-RED değildir. +/alert'e abone olan her dashboard, mobil uygulama veya betik aynı olayı görür; bu da otomasyon mantığınızı tek bir yerde, bildirim kanallarınızı ise ayrışık tutar.
Daha büyük kurulumlar için yararlı bir kalıp, ISA-95'ten esinlenen site/area/line/cell/device/metric gibi hiyerarşik bir topic yapısıdır. Node-RED'de tek bir wildcard aboneliğinin bütün bir hattı veya bütün sahayı kapsamasını sağlar ve MQTT, Sparkplug B ve Unified Namespace yazısında anlatılan Unified Namespace yaklaşımının temelini oluşturur.
Adım 6: TLS ile Özel Bir Broker'a Geçin
Public broker paylaşımlıdır ve herkes tarafından okunabilir; bu yüzden yalnızca test içindir. Gerçek akışlar için şifreleme ve kimlik bilgileri olan kendi broker'ınızı kullanın. Kendiniz çalıştırabilirsiniz, ancak tam yönetilen bir MQTT servisi yamaları, sertifikaları ve çalışma süresini yapılacaklar listenizden çıkarır. ConnectMQ ile kaydolur, bir plan seçer, bir broker oluşturur ve üretilen kullanıcı adını, parolayı ve client ID'yi portaldan kopyalarsınız.
ConnectMQ public yapılandırma node'unu açın ve şu şekilde değiştirin:
| Ayar | Yeni değer |
|---|---|
| Server | broker.connectmq.com |
| Port | 8883 |
| Use TLS | İşaretli; Verify server certificate etkin ve sertifika dosyası olmayan bir TLS yapılandırması ekleyin |
| Client ID | Portaldaki YOUR_CLIENT_ID |
| Security sekmesi: Username / Password | YOUR_USERNAME / YOUR_PASSWORD |
| Topic'ler | connectmq/demo/nr-7f3a yerine kendi namespace'inizi yazın, örneğin acme/plant1 |
Broker herkesçe güvenilen bir Let's Encrypt sertifikası kullanır; bu yüzden Node-RED onu yerleşik CA deposuyla doğrular ve hiçbir CA dosyası yüklemezsiniz. Kimlik bilgileri akış JSON'unda değil, Node-RED'in şifreli kimlik bilgileri dosyasında saklanır; dışa aktarılan akışların asla parola içermemesinin nedeni budur. Node-RED'i başka bir makineye taşıdıktan sonra bu dosyanın okunabilir kalması için settings.js içinde bir credentialSecret ayarlayın.
Client sertifikaları, özel CA'lar ve yaygın el sıkışma hataları gibi ayrıntılar TLS üzerinden Node-RED MQTT yazısında. Editörün kendisini de kilitleyin: giriş gerektirmeyen, açığa çıkmış bir Node-RED editörü, sunucunuzda fiilen uzaktan kod çalıştırma demektir. Node-RED'i güvenceye alma yazısı adminAuth, HTTPS ve ağa açılmayı açıklar.
Node-RED MQTT Eğitimi Sorun Giderme
Bir node sonsuza dek "disconnected" veya "connecting" gösterdiğinde bu kontrol listesini izleyin:
- Hostname yazım hatası veya protokol öneki. Server alanı
mqtt://broker.connectmq.comdeğil,broker.connectmq.comalır. - TLS için yanlış port. 1883 portu düz TCP'dir, 8883 ise Use TLS onay kutusunu gerektirir. Bunları karıştırmak sessiz zaman aşımlarına neden olur.
- Yinelenen client ID. Aynı ID'yi kullanan başka bir Node-RED instance'ı, bir test betiği veya MQTT Explorer bağlantıyı birkaç saniyede bir düşürür.
- Hatalı kimlik bilgileri veya client ID uyuşmazlığı. Node logu "Connection refused: Not authorized" gösterir. Üç değeri de portaldan yeniden kopyalayın.
- Giden portlar engelli. Node-RED host'undan
nc -vz broker.connectmq.com 8883çalıştırın. Docker container'ları ayrıca doğru DNS ayarlarına ihtiyaç duyabilir. - Mesajlar geliyor ama yanlış görünüyor. mqtt in Output ayarını kontrol edin; debug kenar çubuğunda bir Buffer görmek node'un ikili moda ayarlandığı anlamına gelir.
- Hız veya boyut limitleri. Public broker'da her client'ı saniyede 10 mesajın ve mesaj başına 64 KB'ın altında tutun; çok kısa aralıklara ayarlanmış inject node'ları bu sınıra hızla takılır.
Bunların her birinin log seviyesinde teşhisi için özel Node-RED MQTT bağlanmıyor rehberimiz tam hata mesajlarını adım adım ele alır.
Node-RED ile Sırada Ne Var?
Temeller oturduğunda bu rehberler aynı broker bağlantısını gerçek projelere genişletir:
- Endüstriyel veri: Node-RED ve Modbus ile PLC register'larını okuyun veya Node-RED ve Sparkplug B ile birth ve data mesajlarını çözün.
- Temiz topic tasarımı: dağınık cihaz topic'lerini Node-RED MQTT topic eşleme ile yeniden yapılandırın.
- Yeniden kullanılabilir mantık: tekrarlanan node'ları Node-RED subflow'ları olarak paketleyin.
- Üretim metrikleri: bir Node-RED OEE dashboard'u oluşturun.
Node-RED Akışlarınızı ConnectMQ Üzerinde Çalıştırın
Mantığı Node-RED üstlenir; akışlarınız, cihazlarınız ve dashboard'larınız arasındaki her mesajı ise broker taşır. ConnectMQ'nun ücretsiz Serverless planı kredi kartı gerektirmez ve size 8883 portunda TLS, MQTT 5, 25 bağlantıya kadar destek ve geliştirirken topic'leri incelemek için tarayıcı içi bir MQTT client'ı içeren özel bir broker verir. Akışlarınız büyüdüğünde ücretli Serverless, birkaç Node-RED instance'ı arasında yük dengeleme için paylaşımlı abonelikler ekler; Dedicated planlar ise size izole bir küme sunar. app.connectmq.com adresinde ücretsiz broker'ınızı oluşturun, kimlik bilgilerini broker node'unuza yapıştırın ve deploy edin. Barındırma seçeneklerini daha ayrıntılı tartmak için bulutta MQTT broker çalıştırma rehberimizi okuyun veya hemen public MQTT test broker'ında test etmeye başlayın.
Sık Sorulan Sorular
Node-RED bir MQTT broker içeriyor mu?
Hayır. Node-RED yalnızca MQTT client node'larıyla gelir. Bunları barındırılan bir broker veya kendi çalıştırdığınız bir Mosquitto instance'ı gibi harici bir broker'a bağlarsınız; topluluk tarafından geliştirilmiş broker node'ları mevcuttur, ancak production için önerilmez.
Node-RED MQTT için kaç bağlantı kullanır?
Kaç tane mqtt in ve mqtt out node'u paylaşırsa paylaşsın, mqtt-broker yapılandırma node'u başına bir bağlantı. Bağlantı limitleri içinde kalmak için tek bir yapılandırma node'unu yeniden kullanın.
mqtt in node'um neden nesne yerine dize çıktısı veriyor?
Output ayarı muhtemelen a String olarak ayarlanmıştır veya payload geçerli bir JSON değildir. auto-detect veya a parsed JSON object seçeneğine geçin ya da açıkça ayrıştırmak için bir JSON node'u ekleyin.
Node-RED MQTT 5 özelliklerini kullanabilir mi?
Evet. mqtt in ve mqtt out node'larından user property'ler, mesaj süre sonu, response topic'leri ve oturum süre sonu gibi özellikleri kullanmak için broker node'unda protokolü MQTT V5 olarak ayarlayın.
Public broker'ı Node-RED ile kullanmak güvenli mi?
Öğrenme ve demolar için uygundur, ancak public topic'leri herkes okuyabilir. Benzersiz topic önekleri kullanın, hassas veri göndermeyin ve gerçek ekipmanı bağlamadan önce TLS'li özel bir broker'a geçin.



