Node-RED

MQTT Yönlendirme için Node-RED Switch Node ve Change Node

MQTT trafiğini topic ve değere göre ayırmak için Node-RED switch node'unu kullanın, ardından yeniden yayınlamadan önce her dalı change node ile şekillendirin. İçe aktarılabilir bir akış ve ücretsiz bir broker üzerinde test planı içerir.

MQTT mesajlarını change node'larını ve bir MQTT out node'unu besleyen üç çıkışa ayıran Node-RED switch node'u
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Node-RED switch node'u, her MQTT mesajını doğru yola göndermenin en basit yoludur: sıcaklıklar bir dala, nem başka bir dala, aralık dışı değerler bir uyarıya. Bu rehberde mesajları topic'e ve değere göre yönlendirmek, JavaScript yazmadan payload'ları yeniden şekillendirmek ve temiz uyarıları bir broker'a yeniden yayınlamak için switch node'unu change node ile birleştireceksiniz. Sonunda iki dakikada test edebileceğiniz içe aktarılabilir bir akışınız olacak.

MQTT Mesajları Neden Node-RED İçinde Yönlendirilmeli

sensors/# gibi bir wildcard'a abone olan tek bir mqtt in node'u, o seviyenin altındaki her şeyi alır. Tek bir abonelik düzinelercesinin yerini aldığı için bu kullanışlıdır, ancak aşağı akıştaki her node'un her mesajı gördüğü anlamına gelir. Yönlendirme olmadan, kimsenin bakımını yapmak istemediği if ifadeleriyle dolu büyük bir function node'u yazmak zorunda kalırsınız.

Switch node'u bunu bildirimsel olarak çözer. Mesajın bir özelliğini bir kural listesine göre değerlendirir ve mesajı eşleşen porttan dışarı gönderir. Change node'u ise her daldaki mesajı düzenler: yeni bir topic belirler, bir alanı taşır, gürültüyü siler veya bir JSONata ifadesiyle bir değer hesaplar. Birlikte yönlendirme işlerinin çoğunu karşılarlar ve mantık, bir iş arkadaşının bir bakışta okuyabileceği editörde görünür kalır.

Editörün kendisinde yeniyseniz Node-RED MQTT rehberiyle başlayın ve çalışan bir broker bağlantınız olduğunda buraya geri dönün.

Node-RED Switch Node Nasıl Çalışır

Bir switch node'u açtığınızda önemli olan üç ayar görürsünüz.

  1. Property. Test edilecek değer. Varsayılanı msg.payload'dur, ancak msg.topic, msg.payload.value gibi iç içe bir alan, bir flow veya global context değişkeni ya da bir JSONata ifadesi olabilir.
  2. Rules. Her kural bir çıkış portu oluşturur. Kurallar sırayla değerlendirilir.
  3. Kontrol modu. "Checking all rules" mesajı eşleşen her porttan gönderir. "Stopping after first match" yalnızca ilk eşleşmeden gönderir. Yönlendirme için neredeyse her zaman ikinci seçeneği istersiniz; böylece bir değer yanlışlıkla iki dala düşmez.

En sık kullanacağınız kural tipleri aşağıda listelenmiştir.

Kural Neyi kontrol eder Tipik MQTT kullanımı
==, != Tam eşitlik ON veya OFF gibi cihaz durumu
<, <=, >, >= Sayısal karşılaştırma Eşik uyarıları
is between Kapsayıcı aralık Normal çalışma bandı
contains Alt dize Topic /alarm/ içeriyor
matches regex Düzenli ifade Topic /temperature ile bitiyor
is true / is false Boolean Kapı açık bayrakları
is null / is not null Eksik değerler Eksik okumaları atma
is of type string, number, object, buffer... Bozuk payload'ları reddetme
has key Nesnenin bir özelliği var İsteğe bağlı alanlar
JSONata exp true döndüren herhangi bir ifade Çok alanlı koşullar
otherwise Başka hiçbir şey eşleşmedi Her şeyi yakalama ve kayıt

Sona her zaman bir otherwise kuralı ekleyin. Hiçbir maliyeti yoktur ve bir mesaj kaybolmuş gibi göründüğünde ilk bakacağınız yer orasıdır.

Change Node Nasıl Çalışır

Change node'u, mesaja sırayla bir işlem listesi uygular:

  • Bir özelliği bir dizeye, sayıya, boolean'a, JSON'a, başka bir mesaj özelliğine, bir context değerine, bir zaman damgasına veya bir JSONata ifadesine Set eder.
  • Bir dizenin bir kısmını düz metin veya düzenli ifadeyle Change eder; topic'leri yeniden yazmak için kullanışlıdır.
  • Bir özelliği Delete eder; örneğin bir cihazın her mesaja eklediği bir debug alanını.
  • Bir özelliği yeni bir konuma Move eder; örneğin msg.payload.value değerini msg.payload'a yükseltmek gibi.

Change node'unu güçlü kılan JSONata'dır. Bir ifadenin içinde payload ve topic, msg.payload ve msg.topic'i ifade eder; bu nedenle $round(payload.value * 9 / 5 + 32, 1) Celsius'u Fahrenheit'a çevirir ve $split(topic, "/")[4] beşinci topic seviyesini çıkarır. Function node'u kullanmadan ve görsel editörden ayrılmadan hesaplanmış değerler elde edersiniz.

Örnek Akış: Önce Topic'e, Sonra Değere Göre Yönlendirme

İçe aktarmak üzere olduğunuz akış şunları yapar:

  1. Herkese açık MQTT test broker'ında payload tipi parsed JSON olarak ayarlanmış şekilde connectmq/demo/a7f3k2/sensors/# topic'ine abone olur.
  2. İlk Node-RED switch node'u msg.topic'e göre yönlendirir: sıcaklık, nem veya başka bir şey.
  3. İkinci switch node'u sıcaklıkları msg.payload.value üzerinden üç banda ayırır.
  4. Düşük ve yüksek bantlar bir uyarı topic'i ve payload'u oluşturan bir change node'undan geçer, ardından bir mqtt out node'u bunu yayınlar.
  5. Normal okumalar, nem ve bilinmeyen topic'ler debug node'larına gider.

Deploy etmeden önce a7f3k2 değerini her yerde kendi rastgele dizenizle değiştirin. Herkese açık broker'ı herkes okuyabilir; benzersiz bir önek test trafiğinizi ayrı tutar ve oraya asla hassas veri göndermemelisiniz. Client ID de benzersiz ve boş olmamalıdır.

[
  {"id":"cmq_broker","type":"mqtt-broker","name":"ConnectMQ public","broker":"broker.connectmq.com","port":"1883","clientid":"nr-switch-a7f3k2","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true},
  {"id":"in_all","type":"mqtt in","name":"all sensors","topic":"connectmq/demo/a7f3k2/sensors/#","qos":"1","datatype":"json","broker":"cmq_broker","nl":false,"rap":true,"rh":0,"inputs":0,"x":140,"y":160,"wires":[["sw_topic"]]},
  {"id":"sw_topic","type":"switch","name":"by measurement","property":"topic","propertyType":"msg","rules":[{"t":"regex","v":"/temperature$","vt":"str","case":false},{"t":"regex","v":"/humidity$","vt":"str","case":false},{"t":"else"}],"checkall":"false","repair":false,"outputs":3,"x":350,"y":160,"wires":[["sw_temp"],["dbg_hum"],["dbg_other"]]},
  {"id":"sw_temp","type":"switch","name":"temperature band","property":"payload.value","propertyType":"msg","rules":[{"t":"lt","v":"5","vt":"num"},{"t":"btwn","v":"5","vt":"num","v2":"30","v2t":"num"},{"t":"gt","v":"30","vt":"num"},{"t":"else"}],"checkall":"false","repair":false,"outputs":4,"x":560,"y":100,"wires":[["chg_alert"],["dbg_ok"],["chg_alert"],["dbg_other"]]},
  {"id":"chg_alert","type":"change","name":"build alert","rules":[{"t":"delete","p":"payload.debug","pt":"msg"},{"t":"set","p":"payload","pt":"msg","to":"{\"room\": $split(topic, \"/\")[4], \"value\": payload.value, \"level\": payload.value > 30 ? \"high\" : \"low\", \"fahrenheit\": $round(payload.value * 9 / 5 + 32, 1)}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"\"connectmq/demo/a7f3k2/alerts/\" & payload.room","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":60,"wires":[["out_alert","dbg_alert"]]},
  {"id":"out_alert","type":"mqtt out","name":"publish alert","topic":"","qos":"1","retain":"false","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"cmq_broker","x":1000,"y":40,"wires":[]},
  {"id":"dbg_alert","type":"debug","name":"alert","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":990,"y":90,"wires":[]},
  {"id":"dbg_ok","type":"debug","name":"normal temperature","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":800,"y":120,"wires":[]},
  {"id":"dbg_hum","type":"debug","name":"humidity","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":560,"y":200,"wires":[]},
  {"id":"dbg_other","type":"debug","name":"unrouted","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":800,"y":240,"wires":[]}
]

Menu → Import ile içe aktarın, JSON'u yapıştırın ve ardından Deploy'a tıklayın. mqtt in node'unun altında birkaç saniye içinde yeşil bir "connected" durumu görünmelidir.

Change node'undaki iki ayrıntıya dikkat edin. Önce payload yeniden oluşturulur, ardından topic kuralı yeni payload'dan payload.room değerini okur. Kural sırası önemlidir: her kural mesajı bir önceki kuralın bıraktığı haliyle görür. Ayrıca mqtt out node'unun topic alanının boş olduğuna dikkat edin; böylece change node'unun belirlediği msg.topic neyse oraya yayın yapar. Node'daki topic alanını doldurursanız msg.topic'i geçersiz kılar ve dinamik yönlendirmeniz sessizce çalışmayı bırakır.

Yönlendirmeyi Komut Satırından Test Edin

Mosquitto istemcileriyle birkaç test mesajı yayınlayın. Her komut kendi client ID'sini kullanır.

# Normal temperature -> "normal temperature" debug output
mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-a7f3k2-1 \
  -t connectmq/demo/a7f3k2/sensors/room1/temperature -m '{"value": 22.5}'

# High temperature -> alert published to connectmq/demo/a7f3k2/alerts/room1
mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-a7f3k2-2 \
  -t connectmq/demo/a7f3k2/sensors/room1/temperature -m '{"value": 34.2, "debug": "fw-1.2"}'

# Humidity -> "humidity" debug output
mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-a7f3k2-3 \
  -t connectmq/demo/a7f3k2/sensors/room1/humidity -m '{"value": 48}'

# Unknown measurement -> "unrouted" debug output
mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-a7f3k2-4 \
  -t connectmq/demo/a7f3k2/sensors/room1/co2 -m '{"value": 640}'

İkinci bir terminalde, change node'unun beklediğiniz mesajı oluşturduğunu doğrulamak için uyarı topic'ini izleyin:

mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-a7f3k2 -v \
  -t 'connectmq/demo/a7f3k2/alerts/#'

debug alanı kaldırılmış olarak {"room":"room1","value":34.2,"level":"high","fahrenheit":93.6} görmelisiniz. Bu testte her QoS ayarının teslimata ne yaptığından emin değilseniz MQTT QoS seviyeleri rehberi akışın uyarılar için neden QoS 1 kullandığını açıklar.

Yeniden Kullanmaya Değer Yönlendirme Desenleri

Temel akış çalıştığında bu desenler gerçek projelerin çoğunu karşılar:

  • Bir topic seviyesiyle cihaz tipine göre yönlendirme. Regex yerine switch özelliğini $split(topic, "/")[3] JSONata ifadesine ayarlayın ve == kurallarıyla karşılaştırın. Topic'ler katı bir hiyerarşi izlediğinde bu, regex'ten daha hızlı okunur.
  • Yönlendirmeden önce doğrulama. mqtt in'in hemen arkasına "is of type: object" kuralına sahip bir switch node'u koyun. Bozuk payload'lar otherwise portuna gider; orada daha sonra bir function node'unu çökertmelerine izin vermek yerine onları kaydedebilirsiniz.
  • Durum değişikliklerinde tekrarları ayıklama. Switch node'unu bir filter node'uyla (report-by-exception modu) eşleştirin; böylece her saniye open yayınlayan bir kapı sensörü dalınızı yalnızca değer değiştiğinde tetikler.
  • Birimleri erken normalleştirme. Birimleri dönüştürmek ve alanları yeniden adlandırmak için yönlendirmenin hemen ardından bir change node'u kullanın; böylece aşağı akıştaki her şey tek bir şema görür.
  • Context ile zenginleştirme. Bir change node'u msg.payload.limit değerini flow.limits[room]'dan ayarlayabilir ve sonraki switch node'u sabit kodlanmış bir sayı yerine msg.payload.limit ile karşılaştırabilir. Eşikler böylece tek bir yerde durur.

Koşullar birkaç kuralın ötesine geçtiğinde veya döngüler ve durum gerektirdiğinde function node'u daha iyi bir araçtır. Node-RED function node rehberi bu adımı ele alır ve JSON node rehberi dize ve nesne payload'larının bu yönlendirme kurallarıyla nasıl etkileştiğini açıklar.

Switch ve Change Node'larında Sorun Giderme

Belirti Olası neden Çözüm
Switch node'undan hiçbir şey çıkmıyor Payload nesne değil, dize mqtt in çıktısını "a parsed JSON object" yapın veya bir JSON node'u ekleyin
Sayısal kural hiç eşleşmiyor Değer "34.2" (dize) olarak geliyor Bir change node'uyla dönüştürün: $number(payload.value)
Mesaj iki dalda görünüyor "Checking all rules" seçili "stopping after first match" seçeneğine geçin
Uyarılar yanlış topic'e gidiyor mqtt out üzerinde topic alanı dolu msg.topic kullanılması için boş bırakın
Debug kenar çubuğunda JSONata hatası İfade msg.payload'a başvuruyor JSONata içinde msg.payload değil payload kullanın
Regex fazla eşleşiyor Eksik çapa Desenleri $ ile bitirin, örneğin /temperature$

Faydalı bir alışkanlık: her switch ve change node'una açıklayıcı bir ad verin. Debug kenar çubuğu node adını gösterir ve "temperature band" adını izlemek "switch" adından çok daha kolaydır.

Akışı Özel bir Broker'a Taşıma

Herkese açık broker öğrenmek için idealdir, ancak üretimdeki yönlendirme akışları kimlik bilgileri ve TLS ile kendi broker'ınıza karşı çalışmalıdır. ConnectMQ portalında bir broker oluşturun, ardından mqtt-broker yapılandırma node'unu düzenleyin:

  • Sunucu: portalda gösterilen host, port 8883, Use TLS etkin.
  • Security sekmesi: YOUR_USERNAME ve YOUR_PASSWORD.
  • Client ID: YOUR_CLIENT_ID; çünkü ConnectMQ client ID'leri verdiği kimlik bilgilerine bağlar.

Her mqtt in ve mqtt out node'u bu yapılandırma node'unu paylaşır; bu yüzden yönlendirme mantığının kendisi değişmez. Ardından connectmq/demo/a7f3k2 önekini kaldırıp site/area/line/device/measurement gibi düzgün bir hiyerarşi kullanabilirsiniz. Akışı tam yönetilen bir MQTT hizmetinde çalıştırmak, Node-RED'in yanında bir broker sürecini yamalamak ve izlemek zorunda kalmadığınız anlamına da gelir.

Node-RED Akışlarınızı ConnectMQ'da Çalıştırın

Switch ve change node'larınız, siz geliştirmeye devam ederken ayakta kalan bir broker'ı hak ediyor. app.connectmq.com adresinde kaydolun, ücretsiz Serverless planını seçin (kredi kartı gerekmez), bir broker oluşturun ve üretilen kullanıcı adı, parola ve client ID'yi Node-RED yapılandırma node'unuza yapıştırın. Portalın canlı topic gezgini uyarı topic'lerinizin gerçek zamanlı gelişini gösterir; bu da yönlendirme mantığını kontrol etmeyi çok hızlandırır.

Sık Sorulan Sorular

Node-RED'de switch node ile change node arasındaki fark nedir?

Switch node'u, bir özelliği kurallara göre test edip bir çıkış portu seçerek mesajın nereye gideceğine karar verir. Change node'u ise özellikleri ayarlayarak, değiştirerek, silerek veya taşıyarak mesajın kendisini değiştirir.

Node-RED switch node'u msg.topic'e göre yönlendirme yapabilir mi?

Evet. Özelliği msg.topic olarak ayarlayın ve "matches regex", "contains" veya == kurallarını kullanın. Bu, tek bir wildcard MQTT aboneliğinden gelen trafiği ayırmanın standart yoludur.

Sayısal switch kuralım neden MQTT değerleriyle eşleşmiyor?

MQTT payload'ları, mqtt in node'u onları ayrıştırmadıkça metin olarak gelir. Node'un parsed JSON nesnesi ürettiğinden emin olun ve karşılaştırmadan önce dize alanlarını bir change node'unda $number() ile dönüştürün.

Switch ve change node'ları yerine function node mu kullanmalıyım?

Yönlendirme ve basit dönüşümler için switch ve change node'larını kullanın, çünkü okunmaları ve gözden geçirilmeleri daha kolaydır. Döngülere, karmaşık duruma veya birkaç kuraldan fazlasını gerektirecek bir mantığa ihtiyaç duyduğunuzda function node'una geçin.

İlgili yazılar

ISA-95 Topic'leriyle Node-RED OPC UA İstemcisinden MQTT'ye

Bir PLC veya simülasyon sunucusundaki OPC UA değişkenlerine node-red-contrib-opcua ile abone olun, node ID'lerini ISA-95 tarzı MQTT topic'lerine eşleyin ve değerleri kalite bilgisi ve zaman damgalarıyla yayınlayın.

8 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.