Node-RED'deki Sparkplug B desteği, low-code bir akışın gerçek bir endüstriyel edge node gibi davranmasını sağlar: metriklerini birth sertifikalarıyla duyurur, kompakt Protobuf verisi yayınlar, bağlantısı koptuğunda death durumunu bildirir ve komut kabul eder. Bu rehberde simüle edilmiş bir CNC makinesi için bir Sparkplug B edge node'u oluşturacak, verileri ikinci bir akışta tüketip çözecek ve sonucu Sparkplug'ı anlayan bir broker'da kontrol edeceksiniz. Bu süreçte spesifikasyonun en sık takılınan ayrıntılarını da öğreneceksiniz.
Kısaca Sparkplug B
Sparkplug B, Eclipse Foundation'ın MQTT üzerine oturan bir spesifikasyonudur. Düz MQTT, topic yapısı veya payload formatı hakkında hiçbir şey söylemez; Sparkplug her ikisini ve ek olarak oturum durumunu tanımlar, böylece farklı üreticilerin ekipmanları SCADA ve MES uygulamalarıyla kutudan çıktığı gibi birlikte çalışır.
Temel fikirler:
- Topic namespace:
spBv1.0/<group_id>/<message_type>/<edge_node_id>/[<device_id>]. - Payload: Her biri ad, veri tipi, değer ve zaman damgası içeren bir metrik listesine sahip Google Protocol Buffers.
- Oturum farkındalığı: bir edge node bağlandığında
NBIRTHyayınlar ve MQTT Last Will olarak birNDEATHkaydeder. Arkasındaki cihazlarDBIRTHveDDEATHyayınlar. - İstisna bazlı raporlama: birth sonrasında
DDATAmesajları yalnızca değişen metrikleri içerir. - Komutlar: uygulamalar, bir "Rebirth" isteği de dahil olmak üzere
NCMDveDCMDmesajları gönderir.
| Mesaj | Yön | Anlam |
|---|---|---|
| NBIRTH / DBIRTH | Edge'den broker'a | Tipler ve mevcut değerlerle tam metrik listesi |
| NDATA / DDATA | Edge'den broker'a | Yalnızca değişen metrikler |
| NDEATH / DDEATH | Edge'den broker'a (NDEATH Last Will ile) | Node veya cihaz çevrimdışı |
| NCMD / DCMD | Uygulamadan edge'e | Bir metrik yazma veya rebirth isteme |
| STATE | Primary host uygulaması | Host uygulamasının çevrimiçi olup olmadığı |
Tam topic grameri için Sparkplug topic namespace rehberine, birth ve death mesajlarının durumu nasıl tutarlı tuttuğu için Sparkplug birth ve death sertifikaları yazısına bakın.
Sparkplug Node'larını Kurun
Node-RED için en kapsamlı Sparkplug uygulaması node-red-contrib-mqtt-sparkplug-plus'tır. Palette manager'dan veya komut satırından kurun:
cd ~/.node-red
npm install node-red-contrib-mqtt-sparkplug-plus
# ardından Node-RED'i yeniden başlatın
Üç node ve bir yapılandırma node'u ekler:
- mqtt sparkplug device: edge node'un arkasındaki bir cihazı temsil eder. DBIRTH, DDATA, DDEATH ve DCMD'yi sizin için yönetir.
- mqtt sparkplug in: Sparkplug topic'lerine abone olur ve Protobuf payload'unu bir JavaScript nesnesine çözer.
- mqtt sparkplug out: tam kontrole ihtiyaç duyduğunuzda ham Sparkplug mesajları yayınlar.
- Sparkplug broker config: MQTT bağlantısı ile Sparkplug Group ID ve Edge Node ID. NBIRTH'ü otomatik olarak yayınlar ve NDEATH'i kaydeder.
Bir Node-RED Sparkplug B Edge Node'u Oluşturun
Adım 1: Broker'ı ve kimliği yapılandırın
Bir mqtt sparkplug device node'u ekleyin ve yeni bir broker yapılandırması oluşturun:
- Sunucu: benzersiz bir client ID ile
broker.connectmq.com, port1883. Bu, ücretsiz herkese açık MQTT broker'dır; yayınladığınız her şeyi başkaları okuyabilir, bu yüzden yalnızca simüle edilmiş veri kullanın. - Group ID:
demo-a7f3k2. Sparkplug topic'lerispBv1.0ile başlamak zorunda olduğundan burada alışılmışconnectmq/demo/...önekini kullanamazsınız. Bunun yerinea7f3k2yerine kendi rastgele dizenizi koyarak group ID'yi benzersiz yapın. - Edge Node ID:
line1.
Ardından device node'unda cihaz adını cnc1 olarak ayarlayın. Cihaz spBv1.0/demo-a7f3k2/DDATA/line1/cnc1 topic'ine yayın yapacaktır.
Adım 2: Metrikleri tanımlayın
Device node'una adları ve Sparkplug veri tipleriyle metrikler ekleyin:
| Metrik adı | Veri tipi | Anlam |
|---|---|---|
spindle/speed |
Int32 | rpm cinsinden iş mili hızı |
spindle/load |
Float | Yüzde cinsinden iş mili yükü |
coolant/temperature |
Float | °C cinsinden soğutma sıvısı sıcaklığı |
running |
Boolean | Makine çalışıyor |
partCount |
Int64 | Kümülatif parça sayacı |
Tipleri bildirmek önemlidir: DBIRTH her tüketiciye ne bekleyeceğini söyler ve bir host uygulaması daha sonra tip değiştiren veriyi reddeder veya yanlış yorumlar. Node varsayılan olarak DBIRTH yayınlamadan önce her metriğin bir değer almasını bekler; bu da boş değerlerle dolu bir birth sertifikasını önler.
Adım 3: Veri besleyin
Her 2 saniyede bir tekrarlanan bir inject node'u, makineyi simüle eden bir function node'unu besler. Device node'u, ad ve değer çiftlerinden oluşan bir dizi olarak msg.payload.metrics bekler:
// Function node "simulate cnc1" -> mqtt sparkplug device
let parts = context.get("parts") || 0;
const running = Math.random() > 0.1;
if (running) {
parts += 1;
}
context.set("parts", parts);
msg.payload = {
metrics: [
{ name: "spindle/speed", value: running ? Math.round(11800 + Math.random() * 400) : 0 },
{ name: "spindle/load", value: running ? Math.round(450 + Math.random() * 200) / 10 : 0 },
{ name: "coolant/temperature", value: Math.round((21 + Math.random() * 3) * 10) / 10 },
{ name: "running", value: running },
{ name: "partCount", value: parts }
]
};
return msg;
Deploy edin. Broker yapılandırması line1 için NBIRTH, cihaz cnc1 için DBIRTH yayınlar ve bundan sonra DDATA mesajlarında yalnızca değişen metrikler gönderilir.
Adım 4: Komutları işleyin
Bir uygulama spBv1.0/demo-a7f3k2/DCMD/line1/cnc1 topic'ine bir DCMD gönderdiğinde, device node'u bunu çıkışında istenen metrikleri içeren bir mesaj olarak verir. Çıkışı, isteği doğrulayan ve ona göre işlem yapan bir function node'una bağlayın; örneğin parça sayacını sıfırlamak için:
// Function node "handle DCMD" (device node çıkışından bağlanır)
const metrics = (msg.payload && msg.payload.metrics) || [];
for (const m of metrics) {
if (m.name === "partCount" && Number(m.value) === 0) {
flow.set("cnc1_reset_requested", true);
node.warn("Part counter reset requested");
} else {
node.warn("Ignored command for metric " + m.name);
}
}
return null;
Simülatörün sıfırlamayı uygulaması için simülatörde flow context'ten cnc1_reset_requested değerini okuyun ve parts değerini sıfıra çekin. Rebirth istekleri, birth sertifikalarını yeniden yayınlayan node'un kendisi tarafından işlenir.
Node-RED'de Sparkplug B Tüketme ve Çözme
Sparkplug payload'ları ikilidir. spBv1.0/# üzerindeki normal bir mqtt in node'u size Protobuf baytlarıyla dolu bir Buffer verir. mqtt sparkplug in node'u bunları çözer:
- Kendi benzersiz client ID'sine sahip ayrı bir broker yapılandırması kullanan bir mqtt sparkplug in node'u ekleyin.
spBv1.0/demo-a7f3k2/+/line1/#topic'ine abone olun.- Bunu tam mesajı gösterecek şekilde ayarlanmış bir debug node'una bağlayın.
timestamp, bir seq numarası ve bir metrics dizisi içeren nesneler göreceksiniz. Veriyi Sparkplug kullanmayan tüketiciler için kullanışlı hale getirmek üzere metrik başına bir düz MQTT topic'ine düzleştirin:
// Function node "sparkplug to plain topics"
// msg.topic: spBv1.0/<group>/<type>/<edge>/<device>
const t = msg.topic.split("/");
const type = t[2];
if (type !== "DDATA" && type !== "DBIRTH") {
return null;
}
const group = t[1];
const edge = t[3];
const device = t[4];
const out = [];
for (const m of msg.payload.metrics || []) {
// Sparkplug metrik adlarında "/" kullanımına izin verir; her metriği tek topic seviyesinde tut
const metric = String(m.name).replace(/\//g, "_");
let value = m.value;
if (value !== null && typeof value === "object" && typeof value.toNumber === "function") {
value = value.toNumber(); // 64 bitlik tam sayılar Long nesneleri olarak gelebilir
}
out.push({
topic: `connectmq/demo/a7f3k2/${group}/${edge}/${device}/${metric}`,
payload: { value: value, ts: Number(m.timestamp) || Date.now() },
retain: true
});
}
return [out];
Bunu topic ve retain alanları boş bir mqtt out node'una bağlayın. Artık bir pano, bir betik veya bir hesap tablosu aracı Protobuf hakkında hiçbir şey bilmeden connectmq/demo/a7f3k2/demo-a7f3k2/line1/cnc1/spindle_speed topic'ine abone olabilir. Bu, Sparkplug B ve Unified Namespace yazısında anlatılan Sparkplug artı UNS mimarisiyle aynı fikirdir.
Veriyi Sparkplug'ı Anlayan bir Broker'da Kontrol Edin
Debug node'ları Node-RED'in kendi mesajlarını çözebildiğini kanıtlar, ancak bağımsız bir araçla kontrol etmeye değer. ConnectMQ, hem Protobuf hem de JSON Sparkplug B payload'larını çözer; böylece portalda ham baytlar yerine her DBIRTH ve DDATA mesajının metriklerini görebilirsiniz. Ayrıca Sparkplug verilerini ISA-95 topic'lerine yeniden yayınlayabilir; örneğin spBv1.0/factory1/DDATA/line1/cnc1, connectmq/factory1/production/line1/cnc1/telemetry olur. Bu, function node'unu kendiniz sürdürmeden yukarıdaki düzleştirme adımını size sağlar.
Denemek için ConnectMQ portalında ücretsiz bir broker oluşturun, Node-RED'deki Sparkplug broker yapılandırmasını o broker'ın host'una, TLS ile port 8883'e ve üretilen kullanıcı adı, parola ve client ID'ye göre değiştirin. Ardından canlı topic gezginini açın ve birth ve veri mesajlarının çözülmüş olarak gelişini izleyin.
Yaygın Sparkplug Tuzakları
- Client ID'leri yeniden kullanmak. Aynı MQTT client ID'sine sahip iki edge node birbirini sürekli bağlantıdan düşürür ve her yeniden bağlanma yeni bir NDEATH ve NBIRTH üretir. Her edge node benzersiz bir client ID'ye ihtiyaç duyar.
- Metrik tiplerini değiştirmek. Int32 olarak bildirilen bir metrik daha sonra float taşımamalıdır. Bunun yerine tanımı düzeltin ve bir rebirth tetikleyin.
- Tüketicilerde eksik birth'ler. Birth'ten sonra başlayan bir tüketici yalnızca değişen metrikleri içeren DDATA görür. Kendi görünümüne güvenmeden önce bir Rebirth NCMD göndermeli veya retained durumu başka bir yerden okumalıdır.
- Sıra numaralarını yok saymak.
seqalanı 0'dan 255'e gider ve başa döner. Bir boşluk, bir mesajın kaybolduğu ve bir rebirth isteğinin uygun olduğu anlamına gelir. - Topic seviyeleri. Group, edge ve device ID'leri tek topic seviyeleridir ve
/,+veya#içermemelidir. - QoS beklentileri. Veri mesajları genellikle QoS 0 kullanırken NDEATH ve STATE QoS 1 kullanır. Broker planınızın QoS 1'i desteklediğinden emin olun.
Pilottan Üretime
Bir Sparkplug mimarisi her edge node'u, host uygulamasını ve historian'ı broker üzerinde toplar; bu nedenle broker kritik altyapı haline gelir. TLS üzerinden kimlik doğrulamalı bağlantılar, kimlik bilgilerine bağlı benzersiz client ID'ler ve hem tesisten hem buluttan erişilebilir kalan bir broker kullanın. Bir bulut MQTT broker çok tesisli dağıtımlara uygundur ve bir yönetilen MQTT broker onu kendiniz çalıştırmanın operasyonel yükünü ortadan kaldırır. Sparkplug'ı mevcut kontrolörlerden beslemek için bu akışı veri kaynağı olarak Node-RED OPC UA ile birleştirin. MQTT node'larında yeniyseniz Node-RED MQTT rehberiyle başlayın.
Sparkplug Edge Node'larınızı ConnectMQ'da Çalıştırın
app.connectmq.com adresinde kredi kartı gerektirmeyen ücretsiz Serverless planıyla kaydolun. Bir broker oluşturun, Node-RED Sparkplug yapılandırmanızı üretilen kimlik bilgileriyle ona yönlendirin ve dakikalar içinde portalda çözülmüş birth, veri ve death mesajlarını inceleyin.
Sık Sorulan Sorular
Hangi Node-RED paketi Sparkplug B'yi destekler?
node-red-contrib-mqtt-sparkplug-plus en kapsamlı seçenektir. Birth, death, sıra numaraları, rebirth istekleri ve Protobuf kodlama ile çözmeyi sizin için yönetir.
Sparkplug B mesajlarını normal bir mqtt in node'uyla okuyabilir miyim?
Ham Protobuf baytlarını bir Buffer olarak alırsınız. Bunları okunabilir metriklere dönüştürmek için mqtt sparkplug in node'unu veya bir function node'unda bir Protobuf çözücü kullanın.
Node-RED NDEATH'i otomatik olarak gönderir mi?
Evet. Sparkplug broker yapılandırması bağlandığında NDEATH'i MQTT Last Will olarak kaydeder; böylece edge node beklenmedik şekilde bağlantıyı kaybederse broker bunu yayınlar.
DDATA mesajlarımda neden yalnızca bazı metrikler var?
Sparkplug istisna bazlı raporlar: DDATA yalnızca değişen metrikleri taşır. Tam liste ve mevcut değerler DBIRTH içindedir; bu yüzden tüketiciler sonraki verileri yorumlamak için birth'ü saklamalıdır.



