Sparkplug metrik alias'ları, bir edge node'un Line2/Filler/Motor/CurrentAmps gibi uzun metrik adlarını her DATA mesajında küçük bir tamsayıyla değiştirmesini sağlar. Bu rehberde BIRTH ve DATA mesajları arasındaki alias eşlemesinin nasıl çalıştığını, alias'ların ek karmaşıklığa ne zaman değdiğini ve çözülmüş değerler aniden yanlış göründüğünde alias uyumsuzluklarını nasıl bulup düzelteceğinizi öğreneceksiniz.
Metrik Adları Neden Pahalıdır?
Sparkplug B payload'ları zaten kompakt olan Protobuf'tur. Sayılar varint olarak kodlanır, zaman damgaları 64 bit tamsayılardır ve JSON noktalama işaretleri yoktur. Protobuf'un küçültemediği tek payload parçası dizelerdir ve metrik adları da dizedir.
Endüstriyel adlandırma gelenekleri bu dizeleri uzatır. Bir PLC veya SCADA tag tarayıcısından kopyalanan bir tag yolu çoğu zaman alanı, makineyi, alt sistemi ve sinyali taşır: Packaging/Line2/Filler/Infeed/Motor1/Current. Bir DDATA mesajı değişen tek bir değeri raporladığında, bu 45 karakterlik ad değer ile zaman damgasının toplamından birkaç kat büyük olabilir.
Kablolu bir tesis ağında bu nadiren önemlidir. Hücresel bağlantılarda, uydu bağlantılarında, lisanslı telsizde veya yoğun paylaşımlı ağlarda ise çok önemlidir. Her baytın bedeli ya parayla ya da gecikmeyle ödenir. Sparkplug metrik alias'ları spesifikasyonun bu soruna cevabıdır: adı bir kez gönderin, ardından ona numarayla başvurun.
Sparkplug Metrik Alias'ları Nasıl Çalışır?
Mekanizmanın üç kuralı vardır.
- NBIRTH'te (node seviyesindeki metrikler için) veya DBIRTH'te (cihaz metrikleri için) her metrik hem
namehem de işaretsiz 64 bit bir tamsayı olanaliasile gönderilir. - Sonraki NDATA, DDATA, NCMD ve DCMD mesajlarında metrik yalnızca
aliasile gönderilir.namealanı atlanır. - Alias'lar bir edge node kapsamında benzersiz olmalıdır. Aynı edge node'daki iki metrik, farklı cihazlarda olsalar bile, aynı alias'ı paylaşamaz.
Bir primary host uygulaması veya başka herhangi bir tüketici, BIRTH'ü aldığında bir arama tablosu oluşturur. O andan itibaren alias ile gelen her DATA metriği bu tablo aracılığıyla tam adına geri çözülür.
İşte her iki mesaj tipindeki aynı metrik, çözülmüş Protobuf yapısı olarak gösterilmiştir:
DBIRTH spBv1.0/plant1/DBIRTH/edge-07/filler-02
metric { name: "Infeed/Motor1/Current" alias: 12 datatype: Float float_value: 4.81 }
metric { name: "Infeed/Motor1/Running" alias: 13 datatype: Boolean boolean_value: true }
DDATA spBv1.0/plant1/DDATA/edge-07/filler-02
metric { alias: 12 datatype: Float float_value: 4.93 timestamp: 1792137600123 }
DDATA metriği hiç ad taşımaz. DBIRTH olmadan bir tüketicinin elinde bir float ve 12 sayısı vardır, başka hiçbir şey yoktur.
Alias'ların Değiştirmedikleri
Alias'lar yalnızca adın yerini alır. Veri tipi, değer, zaman damgası, kalite property'leri ve meta veriler tamamen eskisi gibi çalışır. Topic'ler de aynı kalır: alias'ların, topic dizesini protokol seviyesinde kısaltan MQTT 5 topic alias'larıyla hiçbir ilgisi yoktur. İkisi bir arada var olabilir, ancak farklı spesifikasyonlarla tanımlanan bağımsız özelliklerdir. MQTT seviyesindeki sürümü istiyorsanız, MQTT 5 özellikleri rehberimizdeki topic alias bölümüne bakın.
Adlar ve Alias'lar: Ödünleşimler
| Konu | Her DATA mesajında adlar | Sparkplug metrik alias'ları |
|---|---|---|
| Payload boyutu | Ad uzunluğuyla büyür | Küçük ve metrik başına yaklaşık sabit |
| Hata ayıklanabilirlik | Yakalanan her mesaj kendini tanımlar | DATA, BIRTH'ü olmadan anlamsızdır |
| Geç abone olanlar | Hemen çözebilir | Bir rebirth'ü beklemeli veya istemeli |
| Tüketici karmaşıklığı | Basit | Edge node başına bir alias tablosu tutmalı |
| Sessiz hata riski | Düşük | Bayat bir tablo değerleri yanlış metriğe eşler |
| En uygun durum | Kablolu LAN, az sayıda tag | Ölçülü veya kısıtlı bağlantılar, çok sayıda tag |
Risk sütunundaki son satır önemli olandır. Yanlış bir ad apaçık görünür. Yanlış bir alias ise görünmez: tüketici bir motor akımını gönül rahatlığıyla bir sıcaklık tag'ine yazar ve sayı makul görünür.
Pratikte Alias Yaşam Döngüsü
Alias'lar yalnızca tek bir BIRTH'ün ömrü boyunca geçerlidir. Bu ömrün ne zaman bittiğini anlamak çoğu hatayı önler.
- NBIRTH her şeyi sıfırlar. Bir edge node yeni bir NBIRTH yayınladığında, o node'a ait her alias tablosu atılır ve yeni NBIRTH ile ardından gelen DBIRTH'lerden yeniden oluşturulur. Bir edge node rebirth'ten sonra farklı alias numaraları atamakta özgürdür; bu yüzden bir tüketici alias'ları asla birth'ler arasında önbellekte tutmamalıdır.
- NDEATH tabloyu geçersiz kılar. Broker edge node'un NDEATH will mesajını yayınladığında, tüketiciler node'un metriklerini bayat olarak işaretlemeli ve bir sonraki NBIRTH'e kadar alias tablosuna güvenmeyi bırakmalıdır.
- DBIRTH cihaz metrikleri ekleyebilir. Bir cihaz kendi başına rebirth yapabilir ve metriklerinin alias'ları yine tüm edge node genelinde benzersiz olmalıdır.
- Rebirth istekleri kaybolan durumu geri getirir. Bilmediği bir alias gören bir host tahmin yürütmek yerine,
Node Control/Rebirthmetriği true olarak ayarlanmış bir NCMD göndermelidir. Sparkplug rebirth yazımız bu akışı ayrıntılı olarak ele alıyor.
Sıra numarası da yardımcı olur. Bir edge node'dan gelen her Sparkplug mesajı, 0'dan 255'e giden ve başa dönen bir seq taşır. Bir tüketici bir boşluk görürse bir BIRTH'ü kaçırmış olabilir ve alias'lara yeniden güvenmeden önce bir rebirth istemelidir. BIRTH ve DEATH mesajlarının kuralları Sparkplug birth ve death sertifikaları yazısında açıklanıyor.
Python'da Alias'lı Veriyi Çözmek
Aşağıdaki betik bir gruba ait tüm Sparkplug trafiğine abone olur, NBIRTH ve DBIRTH mesajlarından alias tabloları oluşturur ve DATA metriklerini adlarına geri çözer. Eclipse Tahu projesinden üretilmiş Protobuf modülü olan sparkplug_b_pb2.py dosyasını kullanır; bunu betiğin yanına kopyalayın ve bağımlılıkları pip install paho-mqtt protobuf ile kurun.
import paho.mqtt.client as mqtt
import sparkplug_b_pb2
BROKER = "broker.connectmq.com"
GROUP = "demo-7f3k2" # herkese açık broker'da kendi benzersiz grup ID'nizi kullanın
alias_tables = {} # edge_node_id -> {alias: name}
def on_connect(client, userdata, flags, reason_code, properties):
print("connected:", reason_code)
client.subscribe(f"spBv1.0/{GROUP}/#", qos=0)
def on_message(client, userdata, msg):
parts = msg.topic.split("/")
if len(parts) < 4:
return
msg_type, edge_node = parts[2], parts[3]
device = parts[4] if len(parts) > 4 else None
payload = sparkplug_b_pb2.Payload()
payload.ParseFromString(msg.payload)
if msg_type == "NBIRTH":
alias_tables[edge_node] = {} # yeni bir NBIRTH tüm alias'ları sıfırlar
if msg_type in ("NBIRTH", "DBIRTH"):
table = alias_tables.setdefault(edge_node, {})
for m in payload.metrics:
if m.HasField("alias"):
if m.alias in table and table[m.alias] != m.name:
print(f"WARNING duplicate alias {m.alias} on {edge_node}")
table[m.alias] = m.name
print(f"{msg_type} {edge_node}/{device or ''}: {len(alias_tables[edge_node])} aliases")
return
if msg_type == "NDEATH":
alias_tables.pop(edge_node, None)
print(f"NDEATH {edge_node}: alias table cleared")
return
if msg_type in ("NDATA", "DDATA"):
table = alias_tables.get(edge_node)
for m in payload.metrics:
name = m.name
if not name and m.HasField("alias"):
if table is None or m.alias not in table:
print(f"UNKNOWN alias {m.alias} from {edge_node}, request a rebirth")
continue
name = table[m.alias]
value = getattr(m, m.WhichOneof("value")) if m.WhichOneof("value") else None
print(f"{edge_node}/{device or ''} {name} = {value} (seq {payload.seq})")
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="alias-decoder-7f3k2")
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER, 1883, keepalive=60)
client.loop_forever()
Alias'lı test trafiği üretmek için bunu Sparkplug B edge node simülatörü eğitimimizdeki yayıncıyla birlikte kullanın. Her iki betik de broker.connectmq.com adresindeki ücretsiz herkese açık MQTT broker ile çalışır. Herkese açık broker'ın herkes tarafından okunabildiğini unutmayın; bu yüzden rastgele bir grup ID'si kullanın ve oraya asla gerçek tesis verisi yayınlamayın.
Alias Uyumsuzluklarında Hata Ayıklama
Alias sorunlarının çoğu birkaç kalıba girer. Çözülmüş değerler yanlış göründüğünde bu kontrol listesini kullanın.
- Tüketici BIRTH'ten sonra başlatılmış. Sparkplug'da BIRTH mesajları retained değildir; bu yüzden daha sonra bağlanan bir tüketici yalnızca alias'lı DATA görür. Çözüm bir rebirth isteği veya rebirth'leri otomatik tetikleyen bir primary host uygulamasıdır.
- Rebirth sonrası bayat önbellek. Bir tüketici yeni bir NBIRTH'ten sonra eski tablosunu tutarsa, değerler yanlış adlara düşer. Yukarıdaki betiğin yaptığı gibi her NBIRTH'te sıfırlayın.
- Cihazlar arasında yinelenen alias'lar. Bazı edge yapılandırmaları alias'ları cihaz başına 1'den başlayarak numaralandırır. O zaman iki cihaz da alias 1'i sahiplenir; bu benzersizlik kuralını ihlal eder ve tabloları edge node'a göre anahtarlayan her tüketiciyi bozar.
- Sıfır alias'ın eksik sayılması. Protobuf'ta varsayılan değerine ayarlanmış bir alan, kodun onu nasıl kontrol ettiğine bağlı olarak eksik bir alandan ayırt edilemeyebilir. Alias'ları 1'den başlatmak bütün bir hata sınıfını ortadan kaldırır.
- Karışık adlar ve alias'lar. Bir DATA metriği yasal olarak hem ad hem alias içerebilir. Tüketiciler ad mevcutsa onu tercih etmeli, edge node'lar da tutarlı olmalıdır.
- Aynı edge node ID'sini kullanan birden fazla yayıncı. Aynı grup ve edge node ID'siyle yapılandırılmış iki gateway birbirinin birth mesajlarının üzerine yazar. Belirtisi, anlamı sürekli değişen alias'lardır.
Görsel inceleme bu süreci hızlandırır. ConnectMQ, Protobuf veya JSON Sparkplug B payload'larını çözer; böylece portaldaki canlı topic gezgininde BIRTH ve DATA mesajlarını yan yana açıp alias 12'nin gerçekten beklediğiniz metrik olup olmadığını kontrol edebilirsiniz. ConnectMQ ayrıca Sparkplug B verisini okunabilir ISA-95 topic'lerine yeniden yayınlayabilir; örneğin spBv1.0/factory1/DDATA/line1/cnc1 verisini connectmq/factory1/production/line1/cnc1/telemetry topic'ine. Bu da Sparkplug kullanmayan tüketicilere alias tablolarına hiç bağlı olmayan bir yol sunar.
Alias'ları Ne Zaman Etkinleştirmelisiniz?
Alias'lar isteğe bağlıdır. Edge ile broker arasındaki bağlantı ölçülü veya kısıtlıysa, tag sayısı yüksek ve adlar uzunsa ya da tek bir gateway çok sayıda metriği hızlı bir oranda yayınlıyorsa etkinleştirin. Prototip geliştirirken, birçok hafif tüketici bir primary host olmadan doğrudan abone olduğunda veya hata ayıklanabilirlik bayttan daha önemli olduğunda düz adları koruyun.
Birçok ekip için orta yol iyi çalışır: adlarla geliştirin ve devreye alın, gerçekçi yük altında payload boyutlarını ölçün ve alias'ları yalnızca bağlantıları bunu gerektiren sahalarda açın. Alias'lar tamamen BIRTH içinde belirlendiği için, aramayı doğru uygulayan tüketiciler bu ayarı değiştirdiğinizde herhangi bir yapılandırma değişikliğine ihtiyaç duymaz.
Sparkplug'ın bir tesis mimarisindeki yeri hakkında daha fazla bağlam için endüstriyel IoT MQTT rehberimiz büyük resmi ele alıyor; Sparkplug B payload yazısı ise yukarıdaki çözülmüş çıktıda gördüğünüz her alanı açıklıyor. Alias davranışının yetkili tanımı Eclipse Sparkplug spesifikasyonudur.
Sparkplug Alias'larını ConnectMQ'da Test Edin
Edge node'ları ve host uygulamalarını kontrolünüzdeki bir broker'a karşı çalıştırmak, alias işlemeyi üretime ulaşmadan doğrulamanın en hızlı yoludur. ConnectMQ; MQTT 3.1.1 ve 5.0, 8883 portunda TLS ve portalda yerleşik Sparkplug B çözme sunan yönetilen bir MQTT broker'dır. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz Serverless planında bir broker oluşturun, ardından edge node'unuzu oluşturulan kullanıcı adı, parola ve client ID ile ona yönlendirin.
Sık Sorulan Sorular
Sparkplug metrik alias'ları zorunlu mu?
Hayır. Sparkplug B'de alias'lar isteğe bağlıdır. Bir edge node her DATA mesajında tam metrik adlarını gönderebilir ve tüketiciler her iki biçimi de işleyebilmelidir.
Alias numaraları birth'ler arasında değişebilir mi?
Evet. Alias'lar yalnızca o edge node'dan gelen bir sonraki NBIRTH'e kadar geçerlidir. Tüketiciler tablolarını her NBIRTH'te yeniden oluşturmalı ve alias'ları asla oturumlar arasında kalıcı olarak saklamamalıdır.
Bir host bilinmeyen bir alias ile ne yapmalı?
Tahmin yürütmemelidir. Doğru yanıt, edge node'un BIRTH mesajlarını ve tam alias eşlemesini yeniden yayınlaması için Node Control/Rebirth true olarak ayarlanmış bir NCMD göndermektir.
Sparkplug alias'ları MQTT 5 topic alias'larıyla aynı mı?
Hayır. Sparkplug metrik alias'ları payload içindeki metrik adlarının yerini alırken, MQTT 5 topic alias'ları topic dizesini protokol seviyesinde değiştirir. Birbirlerinden bağımsızdırlar ve birlikte kullanılabilirler.



