Node-RED JSON node, JSON string'leri ile JavaScript nesneleri arasında dönüşüm yapar ve msg.payload.temp ifadesinin çalışıp çalışmayacağına ya da undefined döndürüp döndürmeyeceğine karar veren parçadır. Bu rehber JSON'un MQTT üzerinden nasıl geldiğini, ayrıştırmayı ne zaman mqtt in node'una bırakacağınızı, ne zaman bunun yerine JSON node'u kullanacağınızı, payload'ları bir şemayla nasıl doğrulayacağınızı ve yaygın ayrıştırma hatalarını nasıl düzelteceğinizi gösteriyor.
MQTT Payload'larının Neden Ayrıştırılması Gerekir?
MQTT'nin kendisi JSON'dan habersizdir. Broker her payload'ı ham bayt olarak taşır; bu baytlar bir sayı, bir CSV satırı, bir Protobuf mesajı veya bir JSON belgesi olabilir. Bir sıcaklık sensörü {"temp": 22.4, "hum": 41} publish ettiğinde subscriber 26 bayt alır ve bunların ne anlama geldiğine karar vermek zorundadır.
Node-RED bu kararı vermeniz için size iki yer sunar: mqtt in node'undaki Output seçeneği ve ayrı JSON node. Her ikisi de altta aynı ayrıştırıcıyı kullanır. Fark, dönüşümün nerede gerçekleştiği ve ne kadar kontrolü elinizde tuttuğunuzdur. Broker'ların bu baytları nasıl yönlendirdiğini hatırlamak isterseniz MQTT broker'ın ne yaptığı yazısına bakın.
Seçenek 1: JSON'u mqtt in Node'una Ayrıştırtın
Herhangi bir mqtt in node'unu açın ve Output açılır menüsüne bakın. Güncel Node-RED sürümleri şunları sunar:
| Output ayarı | msg.payload neye dönüşür |
Ne için uygun |
|---|---|---|
| auto-detect (parsed JSON object, string or buffer) | Geçerli JSON ise nesne, değilse string, ikili veri için Buffer | Karışık veya bilinmeyen topic'ler |
| a parsed JSON object | Her zaman nesne; geçersiz JSON hata üretir | Her zaman JSON taşıyan, kontrolünüzdeki topic'ler |
| a UTF-8 string | String | Düz metin, CSV, kendiniz ayrıştırdığınız payload'lar |
| a Buffer | Node.js Buffer | Protobuf gibi ikili formatlar |
| a Base64 encoded string | Base64 metin | İkili veriyi yalnızca metin destekleyen sistemlerden geçirmek |
Her publisher'ın JSON gönderdiği topic'ler için "a parsed JSON object" en temiz seçimdir. Doğrudan bir nesne alırsınız ve bir cihaz hatalı davrandığında görünür bir hata elde edersiniz. Geniş bir wildcard ile subscribe olduğunuzda ve bazı topic'ler ON veya 21.5 gibi düz değerler taşıdığında auto-detect kullanışlıdır; ancak bu, sonraki node'ların her iki türle de başa çıkması gerektiği anlamına gelir.
Auto-detect payload'ı ayrıştırmayı deneyerek çalışır: geçerli JSON ise bir nesne, değilse bir string, baytlar geçerli metin değilse bir Buffer alırsınız. Bu kullanışlıdır ama parsed JSON seçeneğinden daha az katıdır.
Seçenek 2: Node-RED JSON Node'unu Kullanın
JSON node bir flow'un herhangi bir yerinde durabilir ve seçtiğiniz özelliği dönüştürür. Action ayarının üç modu vardır:
- Convert between JSON String and Object: string nesneye, nesne string'e dönüşür. Varsayılan budur ve her iki yönde de kullanışlıdır.
- Always convert to JavaScript Object: string'ler ayrıştırılır; nesneler değişmeden geçer.
- Always convert to JSON String: nesneler serileştirilir; string'ler değişmeden geçer. Girintili okunaklı çıktı için Format JSON string kutusunu işaretleyin.
Bir JSON belgesi başka bir belgenin içinde string olarak iç içe bulunduğunda Property değerini payload yerine payload.data gibi başka bir şeyle değiştirebilirsiniz. Bu desen, cihaz mesajlarını bir zarf içine saran gateway'lerde karşınıza çıkar.
Şu durumlarda mqtt in ayarı yerine JSON node'u kullanın:
- Bir wildcard ile tek seferde subscribe oluyorsunuz ama yalnızca bazı dallar JSON taşıyor. Önce bir Node-RED switch node ile yönlendirin, ardından yalnızca JSON dalını ayrıştırın.
- Şema doğrulamasına ihtiyacınız var (aşağıda ele alınıyor).
- JSON başka bir özelliğin içinde iç içe duruyor.
- JSON'u bir HTTP isteği veya dosya gibi MQTT dışındaki bir kaynaktan alıyorsunuz.
Herkese Açık Broker'da Deneyin
broker.connectmq.com adresindeki herkese açık MQTT test broker'ı, hiçbir şey kurmadan her ayarı denemenin hızlı bir yoludur. b52e yerine kendi rastgele dizenizi yazarak terminalden geçerli ve geçersiz birer payload publish edin:
mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-json-b52e \
-t "connectmq/demo/b52e/room1/env" -m '{"temp": 22.4, "hum": 41}'
mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-json-b52e \
-t "connectmq/demo/b52e/room1/env" -m '{temp: 22.4}'
Ardından bu flow'u içe aktarın. UTF-8 string olarak subscribe olur ve bir JSON node ile ayrıştırır; böylece hem başarılı yolu hem de hata yolunu görebilirsiniz.
[
{"id":"tab1","type":"tab","label":"JSON demo"},
{"id":"brk","type":"mqtt-broker","name":"ConnectMQ public","broker":"broker.connectmq.com","port":"1883","clientid":"nr-json-b52e","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true},
{"id":"in","type":"mqtt in","z":"tab1","name":"env","topic":"connectmq/demo/b52e/+/env","qos":"0","datatype":"utf8","broker":"brk","x":110,"y":100,"wires":[["json"]]},
{"id":"json","type":"json","z":"tab1","name":"parse","property":"payload","action":"obj","pretty":false,"x":270,"y":100,"wires":[["ok"]]},
{"id":"ok","type":"debug","z":"tab1","name":"parsed","active":true,"complete":"payload","x":430,"y":100,"wires":[]},
{"id":"catch","type":"catch","z":"tab1","name":"","scope":["json"],"uncaught":false,"x":110,"y":180,"wires":[["bad"]]},
{"id":"bad","type":"debug","z":"tab1","name":"parse errors","active":true,"complete":"true","x":290,"y":180,"wires":[]}
]
İlk mesaj "parsed" debug çıktısında genişletilebilir bir nesne olarak görünür. İkincisi Catch node'unu tetikler ve msg.error.message dahil tam mesaj "parse errors" altında görünür. Üretimde bu catch çıkışını bir debug node'u yerine bir sayaca veya alarm topic'ine bağlayın; böylece bir cihaz firmware güncellemesi bozuk JSON göndermeye başladığında bundan haberdar olursunuz.
Payload'ları JSON Schema ile Doğrulayın
Geçerli JSON, doğru JSON ile aynı şey değildir. Bir cihaz "temp": "22.4" değerini string olarak gönderebilir veya bir firmware değişikliğinden sonra bir alanı atlayabilir. JSON node payload'ları bir JSON Schema'ya karşı kontrol edebilir: node'dan önce msg.schema değerini bir şema nesnesine ayarlayın; geçersiz mesajlar doğrulama ayrıntıları msg.schemaError içinde olacak şekilde bir hata üretir.
Şemayı bir Change node'u veya küçük bir function ile ayarlayın:
msg.schema = {
type: "object",
required: ["temp", "hum"],
properties: {
temp: { type: "number", minimum: -40, maximum: 125 },
hum: { type: "number", minimum: 0, maximum: 100 }
},
additionalProperties: true
};
return msg;
Bunu JSON node'undan önce koyun ve demodaki Catch node'unu koruyun. Doğrulamada başarısız olan mesajlar okunabilir bir nedenle hata yoluna gider; bu, bir pano boyunca NaN değerlerinin peşine düşmekten çok daha kolay hata ayıklama sağlar. Şemanın nesne tarafında kontrol edildiğini unutmayın; dolayısıyla hem bir string ayrıştırılırken hem de payload zaten bir nesne olduğunda çalışır.
JSON'u MQTT'ye Geri Publish Etmek
mqtt out node'u nesneleri otomatik olarak serileştirir: msg.payload bir nesneyse JSON string olarak gönderilir. Çoğu flow'da publish etmeden önce bir JSON node'una ihtiyacınız yoktur. Always convert to JSON String ayarlı bir tane yalnızca belirli bir özelliğin serileştirilmesi gerektiğinde veya insanların okuyacağı biçimlendirilmiş çıktı istediğinizde ekleyin.
İnce bir nokta: 21.5 gibi bir sayıyı doğrudan publish ederseniz node 21.5 metnini gönderir. Auto-detect kullanan subscriber'lar bunu geçerli JSON olarak görüp size bir sayı verir; UTF-8 olarak ayarlanmış subscriber'lar ise bir string görür. Her topic için tek bir kural seçin ve belgeleyin.
Node-RED JSON Hatalarını Gidermek
| Belirti | Olası neden | Çözüm |
|---|---|---|
Unexpected token o in JSON at position 1 |
Payload zaten bir nesne ve yeniden ayrıştırılıyor | Fazladan JSON node'unu kaldırın veya mqtt in çıkışını string yapın |
msg.payload.temp undefined |
Payload hâlâ bir string | mqtt in'i parsed JSON yapın veya bir JSON node ekleyin |
Unexpected token } in JSON |
Cihaz firmware'inden gelen sondaki virgül veya tırnaksız anahtarlar | Publisher'ı düzeltin; JSON tırnaklı anahtarlar gerektirir ve sondaki virgüle izin vermez |
| Debug bir Buffer gösteriyor | Çıkış Buffer olarak ayarlı veya auto-detect ile ikili payload | UTF-8 string veya parsed JSON çıkışı kullanın |
| Sayılar string olarak geliyor | Publisher değerleri tırnak içine alıyor | Bir şemayla doğrulayıp firmware'i düzeltin veya bir Change node ile dönüştürün |
| Başta garip karakterler | Bazı araçlardan gelen UTF-8 bayt sırası işareti (BOM) | Bir function node ile temizleyin veya publisher'ı düzeltin |
Bunların çoğu iki kez ayrıştırmaktan ya da hiç ayrıştırmamaktan kaynaklanır. mqtt in node'unun hemen arkasına "complete msg object" olarak ayarlanmış bir debug node ekleyin; kenar çubuğu payload alanının string, nesne veya Buffer olup olmadığını gösterir.
En İyi Uygulamalar Kontrol Listesi
- Her flow için tek bir ayrıştırma noktası seçin: ya mqtt in node'u ya da bir JSON node; asla ikisi birden değil.
- Sahibi olduğunuz topic'ler için "a parsed JSON object", yalnızca karışık wildcard'lar için auto-detect kullanın.
- Kritik payload'ları bir şemayla doğrulayın ve hataları bir Catch node üzerinden yönlendirin.
- Mümkün olduğunda payload'ları küçük ve düz tutun; iç içe zarflar her tüketiciyi karmaşıklaştırır.
- Cihaz kimliğini yalnızca payload'a değil topic'e de koyun. Node-RED function node rehberimiz topic'i alanlara nasıl böleceğinizi gösterir.
- Her topic'in payload formatını topic adlandırma planınızla birlikte belgeleyin.
Yeni başlayanlar için eksiksiz bir anlatım arıyorsanız Node-RED MQTT eğitimi, broker yapılandırmasını, panoları ve alarmları tek bir flow'da ele alır. nodered.org'daki resmi mesajlarla çalışma rehberi mesaj yapısını ve JSON node'u daha derinlemesine açıklar.
JSON Flow'larınızı ConnectMQ'ya Taşıyın
Herkese açık broker paylaşımlıdır ve herkes tarafından okunabilir; bu yüzden gerçek cihaz verileri özel bir broker'da olmalıdır. ConnectMQ; 8883 portunda TLS ve her cihazın Node-RED'e ulaşmadan önce publish ettiği JSON'u birebir inceleyebileceğiniz bir portal topic gezgini sunan tam yönetilen bir MQTT hizmetidir. Kredi kartı gerektirmeyen ücretsiz Serverless plan için app.connectmq.com adresinden kaydolun, ardından oluşturulan kimlik bilgilerini broker node'unuza yapıştırın ve TLS'yi etkinleştirin. Ücretsiz plan 256 KB'a kadar mesajları destekler; bu, tipik JSON telemetrisi için fazlasıyla yeterlidir.
Sık Sorulan Sorular
mqtt in node'undan sonra bir JSON node'una ihtiyacım var mı?
mqtt in node'unun çıkışı "a parsed JSON object" veya auto-detect olarak ayarlıysa ve payload geçerli JSON ise hayır. Bunun üzerine bir de JSON node eklemek çift ayrıştırma hatalarına yol açabilir.
Node-RED'de bir nesneyi JSON string'e nasıl dönüştürürüm?
"Always convert to JSON String" eylemiyle JSON node'u kullanın; okunabilir çıktı için isteğe bağlı olarak Format JSON string seçeneğini işaretleyin. mqtt out node'u da nesneleri otomatik olarak serileştirir.
JSON node veri türlerini doğrulayabilir mi?
Evet. Node'dan önce msg.schema değerini bir JSON Schema'ya ayarlayın; eşleşmeyen mesajlar, ayrıntıları msg.schemaError içinde olan ve bir Catch node ile yönetebileceğiniz bir hata üretir.
Auto-detect neden bazen bana nesne yerine sayı veriyor?
42 veya true gibi bir payload geçerli JSON'dur; bu yüzden auto-detect onu bir sayıya veya boolean'a ayrıştırır. Her zaman bir nesne bekliyorsanız türü bir Switch node'unda kontrol edin veya bir şema kullanın.



