Sparkplug B ve Unified Namespace, MQTT üzerine kurulan neredeyse her Endüstriyel IoT projesinde gündeme gelen iki fikirdir. Bu yazıda Unified Namespace'in ne olduğunu, ISA-95 hiyerarşisinin nasıl bir topic yapısına dönüştüğünü, Sparkplug B topic namespace'inin ve payload'unun nasıl çalıştığını ve iki yaklaşımın birbirini nasıl tamamladığını öğreneceksiniz. Bu arada broker.connectmq.com'a gerçek ISA-95 ve Sparkplug B mesajları da yayınlayacaksınız.
MQTT temelleri size yeniyse önce MQTT broker'ın ne olduğunu okuyun.
Sorun: Noktadan Noktaya Spagetti
Tipik bir tesiste PLC'ler, SCADA, bir MES, bir historian, bir kalite sistemi ve bir ERP bulunur. Geleneksel olarak her sistem diğerleriyle kendi noktadan noktaya bağlantısı üzerinden konuşur. Yeni bir dashboard ekleyin, üç yeni entegrasyona ihtiyacınız olur. Bir PLC tag'ini değiştirin, aşağı akışta bir şeyler bozulur.
MQTT taşıma tarafını çözer: her üretici bir broker'a yayın yapar, her tüketici abone olur. MQTT'nin sizin yerinize karar vermediği şey ise topic'lerin nasıl adlandırılacağı ve payload'ların nasıl biçimlendirileceğidir. Unified Namespace ve Sparkplug B tam olarak bu boşluğu doldurur.
Unified Namespace Nedir?
Unified Namespace (UNS), tüm işletmenin mevcut durumunun tek, olay güdümlü ve hiyerarşik bir görünümüdür. Her sistemden veri istemek yerine her sistem bildiğini broker üzerindeki ortak bir topic ağacına yayınlar ve her tüketici ihtiyaç duyduğu kısma abone olur.
İyi bir UNS'yi üç özellik tanımlar:
- Tek doğruluk kaynağı. Her makinenin, hattın ve siparişin en güncel değeri tek bir yerde yaşar.
- İşletmeye göre yapılandırılmış. Topic'ler fiziksel ve organizasyonel hiyerarşiyi izler; böylece insanlar bir tag listesine ihtiyaç duymadan veriyi bulabilir.
- İstisna bazlı raporlama. Üreticiler bir şey değiştiğinde yayın yapar; retained message'lar da yeni subscriber'lara mevcut durumu anında verir.
Topic Yapısı Olarak ISA-95
Bir UNS'yi yapılandırmanın en yaygın yolu ISA-95 ekipman hiyerarşisidir. Her seviye bir topic seviyesi olur:
Enterprise / Site / Area / Line / WorkCell / <data class>
acme / izmir / machining / line1 / cnc1 / telemetry
Topic Tasarım Tablosu
| ISA-95 seviyesi | Örnek değer | Topic seviyesi | Tasarım ipucu |
|---|---|---|---|
| Enterprise (Kurum) | acme | 1 | Sabit, kısa şirket tanımlayıcısı |
| Site (Saha) | izmir | 2 | Tesis veya lokasyon başına bir tane |
| Area (Alan) | machining | 3 | Departman veya üretim alanı |
| Line (Hat) | line1 | 4 | Üretim hattı veya proses hücresi |
| WorkCell (İş hücresi) | cnc1 | 5 | Makine, robot veya istasyon |
| Veri sınıfı | telemetry, state, alarms, cmd | 6 | Hızlı veriyi olaylardan ve komutlardan ayırır |
Birkaç pratik kural:
- Küçük harfli ASCII kullanın, boşluk kullanmayın ve görünen adlar yerine kalıcı ID'ler tercih edin.
- Derinliği öngörülebilir tutun. Tüketiciler bir sahadaki tüm alarmları almak için
acme/izmir/+/+/+/alarmsgibi wildcard'lara güvenir. - Komutları kendi dallarında (
cmd) tutun; böylece telemetriden ayrı olarak güvenceye alınıp denetlenebilirler. - Yeni bir dashboard'un mevcut değeri anında görmesi için durum mesajlarını retained olarak yayınlayın.
Deneyin: ISA-95 JSON Mesajı Yayınlayın
broker.connectmq.com'un public alanı en fazla 8 topic seviyesine izin verir; bu yüzden uzun bir önek yerine kısa ve rastgele bir önek kullanın. Bir terminalde abone olun:
mosquitto_sub -h broker.connectmq.com -p 1883 -i uns-a1b2-sub \
-t "a1b2/acme/#" -v
Başka bir terminalden bir makine ölçümü yayınlayın:
mosquitto_pub -h broker.connectmq.com -p 1883 -i uns-a1b2-cnc1 -q 1 \
-t "a1b2/acme/izmir/machining/line1/cnc1/telemetry" \
-m '{"spindleSpeed":12000,"temperature":41.7,"status":"RUNNING"}'
Subscriber topic'i ve JSON payload'u yazdırır. Public alandaki her şey herkes tarafından okunabilir; bu yüzden orada asla gerçek üretim verisi yayınlamayın.
Sparkplug B Nedir?
Sparkplug B, Eclipse Foundation bünyesinde sürdürülen ve MQTT'nin açık bıraktığı üç şeyi tanımlayan açık bir spesifikasyondur: sabit bir topic namespace'i, ikili (binary) bir payload formatı ve bir durum yönetimi modeli. SCADA ve host uygulamalarının cihazları otomatik olarak keşfedebilmesi ve verinin güncel mi yoksa bayat mı olduğunu her zaman bilebilmesi için tasarlanmıştır.
Sparkplug B Topic Namespace'i
Her Sparkplug B topic'i şu deseni izler:
spBv1.0/{group_id}/{message_type}/{edge_node_id}/{device_id}
group_id edge node'ları gruplar (örneğin bir tesis), edge_node_id gateway veya edge cihazıdır, isteğe bağlı device_id ise o edge node'un arkasındaki bir PLC veya sensördür.
| Mesaj türü | Gönderen | Amaç |
|---|---|---|
| NBIRTH | Edge node | Node çevrimiçi olur ve tüm metriklerini bildirir |
| NDEATH | Broker (Will olarak) | Node beklenmedik şekilde çevrimdışı oldu |
| DBIRTH | Edge node | Node'un arkasındaki bir cihaz metrikleriyle çevrimiçi olur |
| DDEATH | Edge node | Bir cihaz çevrimdışı oldu |
| NDATA / DDATA | Edge node | Node veya cihaz için değişen metrik değerleri |
| NCMD / DCMD | Host uygulaması | Bir node'a veya cihaza yazma komutları |
| STATE | Host uygulaması | Birincil host'un çevrimiçi olup olmadığını duyurur |
NDEATH mesajı, edge node bağlandığında MQTT Last Will olarak kaydedilir; böylece bağlantı koparsa broker onu otomatik olarak yayınlar. Tüketiciler de o node'un tüm verisini bayat olarak işaretler.
Payload: Protobuf, Alias'lar ve Sıra Numaraları
Sparkplug B payload'ları Google Protocol Buffers ile kodlanır. Bir payload bir zaman damgası, bir sıra numarası ve bir metrik listesi içerir; her metriğin bir adı, isteğe bağlı sayısal bir alias'ı, bir veri tipi, bir zaman damgası ve bir değeri vardır.
Temel mekanizmalar:
- Doğum sertifikaları. NBIRTH ve DBIRTH, her metriği tam adı ve veri tipiyle içerir. Sonraki DDATA mesajları yalnızca sayısal alias'ı ve yeni değeri gönderebilir; bu da paketleri küçük tutar.
- Sıra numaraları. Bir edge node'dan gelen her mesaj, 0'dan 255'e kadar giden ve başa saran bir
seqdeğeri taşır. Host bir boşluk görürse bir mesajın kaybolduğunu anlar ve yeni doğum sertifikaları istemek için bir rebirth komutu (NCMD) gönderebilir. - bdSeq. Bir doğum/ölüm sıra numarası, her NDEATH'i aynı oturumun NBIRTH'üne bağlar; böylece eski bir ölüm sertifikası daha yeni bir oturumu silemez.
Yukarıdaki ölçümün aynısı, bir Sparkplug B DDATA payload'unun JSON gösterimi olarak:
{
"timestamp": 1760600000000,
"seq": 1,
"metrics": [
{ "name": "temperature", "timestamp": 1760600000000, "dataType": "Double", "value": 41.7 }
]
}
Sparkplug B ve Unified Namespace: Rakip Değil, Tamamlayıcı
| Boyut | Sparkplug B | ISA-95 Unified Namespace |
|---|---|---|
| Topic yapısı | Sabit: spBv1.0/group/type/node/device |
Serbest, işletme hiyerarşisine göre modellenir |
| Payload | Tipli metriklerle Protobuf | Genellikle sizin tanımladığınız JSON |
| Durum farkındalığı | Yerleşik (birth, death, STATE) | Bir gelenek, genellikle retained message'lar |
| Okunabilirlik | Bir decoder gerektirir | İnsan tarafından okunabilir topic'ler ve payload'lar |
| En uygun olduğu yer | Edge'den SCADA'ya, cihaz keşfi, güvenilir durum | Kurum genelinde erişim, analitik, BT tüketicileri |
Pratikte birçok tesis ikisini birlikte kullanır. Edge node'lar Sparkplug B konuşur; çünkü makinelere yakın noktada güvenilir durum ve verimli payload'lar sağlar. Veri daha sonra okunabilir JSON olarak ISA-95 yapısındaki bir namespace'e yeniden yayınlanır; MES, dashboard'lar ve BT uygulamaları da onu Protobuf'a hiç dokunmadan tüketir. İşin zor kısmı bu çeviri katmanıdır ve broker'ın yardımcı olabileceği yer de tam burasıdır.
ConnectMQ, Sparkplug B ve ISA-95 Topic'lerini Nasıl Ele Alır?
ConnectMQ, Endüstriyel IoT desteği yerleşik olan yönetilen bir MQTT broker'dır:
- ISA-95 algılama. Trafiğinizdeki ISA-95 ve Unified Namespace topic yapılarını tanır.
- Sparkplug B çözme. Sparkplug B mesajlarını algılar ve hem Protobuf hem de JSON payload'ları çözer.
- ISA-95'e yeniden yayınlama. Sparkplug B verisi bir ISA-95 yapısına yeniden yayınlanabilir; örneğin
spBv1.0/factory1/DDATA/line1/cnc1, herhangi bir subscriber'ın okuyabileceği düz bir JSON payload ileconnectmq/factory1/production/line1/cnc1/telemetryolur. - Portal görünümleri. Portalın Devices görünümü ekipmanınızı ISA-95 seviyelerine göre düzenler; eşik alarm kuralları ve alarm günlüğü ise örneğin bir iş mili sıcaklığı bir limiti aştığında tepki vermenizi sağlar.
Deneyin: Sparkplug B Girer, Okunabilir Telemetri Çıkar
a1b2plant gibi benzersiz bir grup ID'si kullanın. Önce hem Sparkplug topic'ine hem de yeniden yayınlanan dala abone olun:
mosquitto_sub -h broker.connectmq.com -p 1883 -i spb-a1b2-sub -v \
-t "spBv1.0/a1b2plant/#" -t "connectmq/a1b2plant/#"
Ardından JSON Sparkplug B payload'lu bir DDATA mesajı yayınlayın:
mosquitto_pub -h broker.connectmq.com -p 1883 -i spb-a1b2-edge -q 1 \
-t "spBv1.0/a1b2plant/DDATA/line1/cnc1" \
-m '{"timestamp":1760600000000,"seq":1,"metrics":[{"name":"temperature","timestamp":1760600000000,"dataType":"Double","value":41.7}]}'
Bunu broker.connectmq.com üzerinde test ettiğimizde subscriber orijinal Sparkplug B mesajını ve connectmq/a1b2plant/.../line1/cnc1/telemetry altında {"temperature":41.7,"timestamp":1760600000000} payload'lu ikinci bir mesajı aldı. Aşağı akıştaki araçlar artık connectmq/a1b2plant/+/+/+/telemetry filtresine abone olup makine başına temiz JSON alabilir.
Üretim için portalda dedicated bir broker oluşturun ve 8883 portunda TLS üzerinden YOUR_USERNAME, YOUR_PASSWORD ve YOUR_CLIENT_ID ile bağlanın. Her kiracının topic'leri diğer kiracılardan ve public alandan izoledir. Kimlik bilgileri ve TLS rehberliği için MQTT güvenliği en iyi uygulamaları yazısına bakın.
İlk UNS'niz İçin Tasarım Kontrol Listesi
- İlk cihaz bağlanmadan önce ISA-95 seviyeleri ve adlandırma kuralları üzerinde uzlaşın.
- Hangi veri sınıflarına (
telemetry,state,alarms,cmd) ihtiyacınız olduğuna karar verin ve bunları tutarlı tutun. - Birth/death farkındalığına ihtiyaç duyduğunuz edge tarafında Sparkplug B, diğer herkes için okunabilir bir ISA-95 dalı kullanın.
- Durum ve alarmlar için QoS 1 kullanın; artı ve eksiler için MQTT QoS seviyeleri yazısına bakın.
- Mevcut durum için retained message'lar kullanın, payload'ları küçük ve tipli tutun.
- Sizinle birlikte büyüyebilecek bir broker seçin; kriterler IoT MQTT broker nasıl seçilir yazısında.
ConnectMQ ile Başlayın
Yukarıdaki her iki örneği de şu anda public broker üzerinde deneyebilirsiniz. İzole topic'ler, ISA-95 cihaz görünümleri ve eşik alarmlarıyla gerçek bir Unified Namespace kurmak için app.connectmq.com adresinden kaydolun. Serverless planı ücretsizdir, kredi kartı gerektirmez; tesisiniz canlıya geçtiğinde Dedicated, BYOC veya Self Managed Enterprise'a ölçeklenebilirsiniz.
Sık Sorulan Sorular
Sparkplug B ile Unified Namespace aynı şey mi?
Hayır. Sparkplug B, MQTT üzerinde topic'ler, payload'lar ve oturum durumu için bir spesifikasyondur; Unified Namespace ise tüm işletme verisini tek bir hiyerarşide düzenlemeye yönelik bir mimari desendir. İkisi birlikte iyi çalışır.
Sparkplug B mesajlarını Protobuf decoder olmadan okuyabilir miyim?
Doğrudan okuyamazsınız, çünkü payload ikili formattadır. ConnectMQ, Sparkplug B Protobuf ve JSON payload'larını çözer ve bunları okunabilir JSON olarak bir ISA-95 topic yapısına yeniden yayınlayabilir.
Bir ISA-95 topic hiyerarşisi ne kadar derin olmalı?
Enterprise, Site, Area, Line ve WorkCell ile birlikte bir veri sınıfı altı seviye eder; bu da çoğu tesise uygundur. Wildcard aboneliklerin öngörülebilir çalışması için derinliği tutarlı tutun.
Sparkplug B, MQTT 5 gerektirir mi?
Hayır. Sparkplug B, MQTT 3.1.1 üzerinde çalışır ve genellikle bu şekilde kurulur. ConnectMQ hem MQTT 3.1.1'i hem de MQTT 5.0'ı desteklediği için Sparkplug edge node'ları ve daha yeni client'lar aynı broker'ı paylaşabilir.



