Sparkplug primary host uygulaması, tesis verisinin ana tüketicisidir; genellikle SCADA veya bir MES'tir ve edge node'lar herhangi bir şey yayınlamadan önce onu izler. Bu rehberde host'un STATE mesajlarıyla kendini nasıl duyurduğunu, host çevrimdışı olduğunda edge node'lardan nasıl tepki beklendiğini ve bu davranışı küçük bir Python host'u ile birkaç komut satırı aracını kullanarak uçtan uca nasıl test edeceğinizi öğreneceksiniz.
Bir Host Uygulaması Ne Yapar?
Sparkplug, broker dışında iki tür katılımcı tanımlar. Edge node'lar veri yayınlar. Host uygulamaları ise bu veriyi tüketir, her node'un ve cihazın durumunu takip eder ve rebirth istekleri veya setpoint yazma gibi komutlar gönderir. Bir tesiste birçok host uygulaması bulunabilir: SCADA, bir historian, bir analitik servisi, bir Unified Namespace köprüsü.
Bir host uygulamasının birkaç sorumluluğu vardır:
spBv1.0/#topic'ine (veya yönettiği gruplara) abone olmak ve node'ların, cihazların ve metriklerin canlı bir modelini tutmak.- Metrik adlarını, alias'ları ve veri tiplerini öğrenmek için birth sertifikalarını kullanmak.
- Bir NDEATH veya DDEATH geldiğinde veriyi bayat olarak işaretlemek ve eski oturumlara ait death mesajlarını ayıklamak için bdSeq kullanmak.
- Sıra numaralarını izlemek ve bir boşluk oluştuğunda rebirth istemek.
- Edge node'ların onun dinleyip dinlemediğini bilmesi için kendi STATE mesajını yayınlamak.
Bir Host'u Primary Yapan Nedir?
Bir host, bir edge node kümesi için primary host uygulaması olarak belirlenebilir. Bu broker'da değil, edge node'da yapılandırılır: node'a bağlı olduğu host ID'si bildirilir. Fikir basittir. Operatörlerin güvendiği sistem bağlı değilse, şimdi yayınlanan veri onun için kaybolacaktır; bu yüzden edge node canlı veri yayınlamayı durdurmalı, store and forward destekliyorsa veriyi yerel olarak saklamalı ve beklemelidir.
Primary host yapılandırılmamışsa, edge node kimin dinlediğine bakmaksızın broker'a bağlanır bağlanmaz yayına başlar. Bu izleme ve dashboard'lar için uygundur, ancak geçmişteki boşlukların önemli olduğu SCADA için daha zayıf bir yaklaşımdır.
Sparkplug 3.0'da STATE Mesajları
Host, grup yapısının dışındaki özel bir topic üzerinde kendini duyurur:
spBv1.0/STATE/{host_id}
| Özellik | Birth (çevrimiçi) | Death (çevrimdışı) |
|---|---|---|
| Nasıl gönderilir | Bağlandıktan sonra host tarafından yayınlanır | Bağlanırken MQTT will olarak kaydedilir |
| Payload | {"online": true, "timestamp": T} |
{"online": false, "timestamp": T} |
| QoS | 1 | 1 |
| Retained | Evet | Evet |
| Zaman damgası | Bu oturum için aynı T | Bu oturum için aynı T |
Mesajın retained olması, herhangi bir anda bağlanan bir edge node'un host'un çevrimiçi olup olmadığını hemen öğrenmesini sağlar. Ortak zaman damgası, node'ların eski bir mesajı yok saymasına olanak tanır: bir node T2 zaman damgasıyla çevrimiçi mesajını gördüyse, daha eski T1 zaman damgasına sahip bir çevrimdışı mesajı önceki bir oturumdan kalmadır ve bağlantı kesilmesini tetiklememelidir.
Eski 2.2 sistemleri, düz ONLINE ve OFFLINE dizeleriyle STATE/{host_id} kullanır. Farklar Sparkplug 3.0 karşılaştırmamızda özetleniyor.
Edge Node'lar Nasıl Tepki Verir?
Bir primary host ile yapılandırılmış edge node öngörülebilir bir kalıbı izler:
- NDEATH'ini will olarak kaydedip broker'a bağlanır.
spBv1.0/STATE/{primary_host_id}topic'ine ve kendi NCMD ile DCMD topic'lerine abone olur."online": trueiçeren bir STATE mesajını bekler.- NBIRTH ve DBIRTH yayınlar, ardından her zamanki gibi veri gönderir.
- STATE, en az son görülen kadar yeni bir zaman damgasıyla
"online": falsedeğerine geçerse NDEATH yayınlar, bağlantıyı keser ve destekleniyorsa veriyi tamponlar. - Yeniden bağlanır (çok sunuculu bir kurulumda muhtemelen farklı bir broker'a) ve host'un tekrar çevrimiçi olmasını bekler.
- Host geri döndüğünde yeni birth mesajlarını, ardından
is_historicalile işaretlenmiş tamponlanmış geçmiş verileri yayınlar.
STATE'in önemi 7. adımdan gelir: birth mesajları host'a temiz bir model sunar, historical bayrakları da canlı değerlerin üzerine yazmadan geriye dönük veri doldurmasını sağlar. Birth ve death mekanizması Sparkplug birth ve death sertifikaları yazısında ele alınıyor.
Akışı Minimal Bir Python Host'u ile Test Edin
Bu betik bir primary host rolünü üstlenir: çevrimdışı will'ini kaydeder, çevrimiçi durumunu yayınlar ve bir grubu dinler. paho-mqtt 2.x kullanır ve STATE payload'ları JSON olduğu için Protobuf gerektirmez.
import json
import time
import uuid
import paho.mqtt.client as mqtt
BROKER = "broker.connectmq.com"
PORT = 1883
HOST_ID = "demo-host-" + uuid.uuid4().hex[:6]
GROUP = "demo-" + HOST_ID[-6:]
STATE_TOPIC = f"spBv1.0/STATE/{HOST_ID}"
SESSION_TS = int(time.time() * 1000)
def state(online):
return json.dumps({"online": online, "timestamp": SESSION_TS})
def on_connect(client, userdata, flags, reason_code, properties):
if reason_code.is_failure:
print("connect failed:", reason_code)
return
client.subscribe(f"spBv1.0/{GROUP}/#", qos=1)
client.subscribe(STATE_TOPIC, qos=1)
client.publish(STATE_TOPIC, state(True), qos=1, retain=True)
print(f"host {HOST_ID} online, watching group {GROUP}")
def on_message(client, userdata, msg):
if msg.topic == STATE_TOPIC:
print("STATE:", msg.payload.decode())
else:
print(f"{msg.topic} ({len(msg.payload)} bytes)")
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
client_id=f"host-{uuid.uuid4().hex[:8]}",
clean_session=True)
client.on_connect = on_connect
client.on_message = on_message
client.will_set(STATE_TOPIC, state(False), qos=1, retain=True)
client.connect(BROKER, PORT, keepalive=15)
try:
client.loop_forever()
except KeyboardInterrupt:
client.publish(STATE_TOPIC, state(False), qos=1, retain=True).wait_for_publish()
client.disconnect()
Betiği çalıştırın, yazdırdığı host ID'sini not edin ve ikinci bir terminalde bu host'u izleyen edge node rolünü üstlenin:
mosquitto_sub -h broker.connectmq.com -p 1883 -i node-watch-91aa -q 1 -v \
-t "spBv1.0/STATE/demo-host-xxxxxx"
Retained çevrimiçi mesajını hemen alırsınız. Şimdi Python sürecini Ctrl+C kullanmadan sonlandırın (terminali kapatın veya görevi bitirin). Keepalive süresi geçtikten sonra broker will'i yayınlar ve izleyici aynı zaman damgasıyla "online": false yazdırır. Host'u yeniden başlatın; daha yeni bir zaman damgasına sahip yeni bir çevrimiçi mesajı görürsünüz. Bu, bir edge node'un birth mesajlarını ne zaman yayınlayacağına karar vermek için kullandığı sinyalin ta kendisidir.
İşiniz bittiğinde, paylaşımlı herkese açık MQTT test broker'ı onu saklamaya devam etmesin diye retained durumu temizleyin:
mosquitto_pub -h broker.connectmq.com -p 1883 -i cleanup-91aa -r -n -t "spBv1.0/STATE/demo-host-xxxxxx"
Host Durumunu Bir Topic Gezgininde İzlemek
Devreye alma sırasında host durumunu ve node birth mesajlarını tek bir ekranda görmek istersiniz. ConnectMQ, portaldaki topic gezgininde retained STATE mesajlarını çözülmüş Sparkplug birth ve veri mesajlarının yanında gösterir ve client bağlantı durumunu $SYS/broker/connection/{clientId}/state üzerinden sunar. Host'unuzun client ID'si için bu topic'e abone olmak hızlı bir çapraz kontroldür: bağlantı durumu bağlantının kesildiğini söylüyor ama STATE hâlâ çevrimiçi diyorsa, keepalive süresi dolmadığı için will henüz tetiklenmemiştir.
Yaygın Sorunlar
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Edge node'lar hiç birth yayınlamıyor | Node yapılandırması ile STATE topic'i arasında host ID uyumsuzluğu | Host ID'yi birebir kopyalayın, büyük/küçük harfe duyarlı |
| Node'lar host yeniden başladıktan hemen sonra bağlantıyı kesiyor | Eski çevrimdışı will, yeni çevrimiçi mesajından sonra işlenmiş | Node'lar zaman damgalarını karşılaştırmalı; 3.0 desteğini kontrol edin |
| Yeni node'lar için STATE eksik | STATE retain olmadan yayınlanmış | Çevrimiçi mesajını ve will'i retain true ile yayınlayın |
| Node'ların host kaybını fark etmesi uzun sürüyor | Host'ta büyük keepalive | 15 ile 30 saniye gibi kısa bir keepalive kullanın |
| Node'lar ve host birbirini yok sayıyor | Taraflardan biri 2.2 STATE/ topic'ini kullanıyor |
Sürümleri hizalayın veya uyumluluk modunu etkinleştirin |
Host Erişilebilirliği İçin Tasarım
Edge node'lar primary host çevrimdışı olduğunda yayını durdurduğu için host ve onun broker bağlantısı kritik hâle gelir. Host'u güvenilir bir altyapıda çalıştırın, arızaların hızla fark edilmesi için kısa bir keepalive kullanın ve broker'ın kendisinin zayıf halka olmadığından emin olun. Tam yönetilen bir MQTT servisi veya bir bulut MQTT broker, broker'ı yamalama ve izleme yükünü ortadan kaldırır. Bir node bağlantısını kaybederse, host'un tutarlı bir görünüme geri dönmesini sağlayan süreç Sparkplug rebirth sürecidir. IIoT'nin bütün resmi için MQTT ile Endüstriyel IoT yazısına göz atın.
ConnectMQ ile Başlayın
app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun. Host betiğini oluşturulan kimlik bilgilerinizle 8883 portu üzerinden TLS ile çalıştırın, bu host ID ile yapılandırılmış bir edge node bağlayın ve STATE, birth ve veri mesajlarını ConnectMQ portalında izleyin.
Sık Sorulan Sorular
Birden fazla primary host uygulaması olabilir mi?
Her edge node tek bir primary host ID ile yapılandırılır. Farklı node grupları farklı host'lara bağlı olabilir ve aynı anda istenen sayıda primary olmayan host uygulaması veri tüketebilir.
STATE mesajı retained mıdır?
Evet. Hem çevrimiçi mesajı hem de çevrimdışı will'i QoS 1 ile retained olarak yayınlanır; böylece daha sonra bağlanan her edge node mevcut host durumunu hemen öğrenir.
Broker'ın STATE için özel bir Sparkplug desteğine ihtiyacı var mı?
Hayır. STATE standart MQTT özelliklerine dayanır: retained mesajlar, QoS 1 ve last will. Standartlara uygun her broker onu taşıyabilir.
Primary host çevrimdışıyken veriye ne olur?
Edge node'lar canlı veri yayınlamayı durdurur. Store and forward destekleyen node'lar veriyi tamponlar ve yeni birth mesajlarından sonra bunu historical metrikler olarak gönderir.



