Bir MQTT topic tarayıcısı, bir broker'dan akan her topic'i, her düğümün yanında en son payload ile birlikte canlı ve genişletilebilir bir ağaç olarak gösterir. Bu eğitimde gerçekçi bir topic hiyerarşisi oluşturacak, onu ConnectMQ canlı topic gezgininde ve komut satırında keşfedecek ve adlandırma hatalarını, eski retained message'ları ve bozuk payload'ları saniyeler içinde ortaya çıkaran desenleri öğreneceksiniz.
Bir MQTT Topic Tarayıcısı Ne Yapar?
MQTT'nin yerleşik bir "topic'leri listele" komutu yoktur. Topic'ler oluşturulmaz veya kaydedilmez; yalnızca birisi onlara yayın yaptığı için var olurlar. Bir topic tarayıcısı bunu, # gibi geniş bir joker karaktere (veya factory1/# gibi bir proje köküne) abone olup aldığı topic dizelerinden bir ağaç kurarak aşar. Her eğik çizgi bir seviyeye, her seviye bir klasöre dönüşür ve en son payload yaprakta gösterilir.
Bu basit fikir şaşırtıcı derecede güçlüdür. mosquitto_sub'dan gelen düz bir mesaj akışı, bir düzineden fazla cihazınız olduğunda okunması zor hâle gelir. Bir ağaç ise size bir bakışta şunları söyler:
- Hangi dalların var olduğunu ve hangilerinin olmaması gerektiğini.
- Hangi yaprakların şu anda güncellendiğini ve hangilerinin saatler önce durduğunu.
- Hangi değerlerin retained olduğunu, yani yeni bir abonenin onları hemen alacağını.
- Payload'ların ne kadar büyük ve ne kadar düzgün biçimlendirilmiş olduğunu.
Topic yapısı sizin için yeniyse, başlamadan önce bir MQTT broker'ın topic'ler ve aboneliklerle ne yaptığını anlamak faydalı olur.
Keşfetmek İçin Bir Topic Ağacı Oluşturun
Göz atmak için trafiğe ihtiyacınız var. Aşağıdaki betik, broker.connectmq.com adresindeki ücretsiz herkese açık MQTT broker'ına küçük bir fabrika hiyerarşisi yayınlar. Tarayıcıda bulabilmeniz için bilerek üç yaygın hata içerir. Client'ı pip install "paho-mqtt>=2.0" ile kurun.
import json
import random
import time
import uuid
import paho.mqtt.client as mqtt
RUN_ID = uuid.uuid4().hex[:6]
ROOT = f"connectmq/demo/{RUN_ID}"
client = mqtt.Client(
mqtt.CallbackAPIVersion.VERSION2,
client_id=f"tree-gen-{RUN_ID}",
)
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_start()
print(f"Publishing under {ROOT}/ (subscribe to {ROOT}/#)")
# Retained cihaz meta verileri
for line in ("line1", "line2"):
for machine in ("cnc1", "cnc2"):
meta = {"vendor": "demo", "model": "X200", "line": line}
client.publish(f"{ROOT}/factory1/{line}/{machine}/meta",
json.dumps(meta), qos=1, retain=True)
# Hata 1: tutarsız büyük/küçük harf kullanımı paralel bir dal oluşturur
client.publish(f"{ROOT}/factory1/Line1/cnc1/meta", "{}", qos=1, retain=True)
# Hata 2: sondaki eğik çizgi boş bir son seviye oluşturur
client.publish(f"{ROOT}/factory1/line2/cnc2/telemetry/", "42", qos=0)
try:
while True:
for line in ("line1", "line2"):
for machine in ("cnc1", "cnc2"):
payload = {
"spindle_rpm": random.randint(9000, 12000),
"temperature": round(random.uniform(35, 60), 1),
"ts": int(time.time()),
}
client.publish(f"{ROOT}/factory1/{line}/{machine}/telemetry",
json.dumps(payload), qos=0)
# Hata 3: geçerli JSON olmayan bir payload
client.publish(f"{ROOT}/factory1/line1/cnc2/telemetry",
"temp=48.2;rpm=10100", qos=0)
time.sleep(2)
except KeyboardInterrupt:
client.loop_stop()
client.disconnect()
Betik her döngüde dört mesaj artı bozuk olanı yayınlar; bu da onu herkese açık broker'ın client başına saniyede 10 mesaj limitinin rahatça altında tutar. Çalışır durumda bırakın ve yazdırılan kökü not edin.
Ağacı ConnectMQ Topic Gezgininde Keşfedin
Kendi broker'ınızda, ConnectMQ portalındaki canlı topic gezgini yerleşik topic tarayıcısıdır. Takip etmek için portalda ücretsiz bir broker oluşturun, ardından yukarıdaki betiği TLS ile 8883 portuna geçirip portalın oluşturduğu kimlik bilgilerini (YOUR_USERNAME, YOUR_PASSWORD, YOUR_CLIENT_ID) ekleyerek ona yönlendirin. Bunun yerine herkese açık broker'a hızlıca göz atmak için, WebSocket destekleyen herhangi bir MQTT gezgini wss://broker.connectmq.com:8084/mqtt adresine bağlanıp connectmq/demo/<run-id>/# kökünüze abone olabilir.
Mesajlar geldikçe ağacı yukarıdan aşağıya gezin:
- Kökü genişletin.
factory1'i ve altındaline1,line2ile beklenmedik birLine1görmelisiniz. Topic'ler büyük/küçük harfe duyarlıdır; bu yüzdenLine1,line1/#'e abone olan hiçbir abonenin asla almayacağı ayrı bir daldır. line2/cnc2'yi açın.telemetryaltında adı boş bir alt öğe vardır. Bu, sondaki eğik çizgidir:telemetry/,telemetry'den bir seviye daha fazladır ve.../cnc2/telemetryaboneliği onunla eşleşmez.line1/cnc2/telemetry'yi açın. Değer JSON iletemp=48.2;rpm=10100arasında gidip gelir. JSON ayrıştıran herhangi bir tüketici her iki mesajdan birinde hata fırlatır.metayapraklarına bakın. Retained bayrağını taşırlar. Bağlantıyı kesip yeniden bağlanın; bunlar hemen görünürken telemetri yalnızca bir sonraki mesaj geldiğinde görünür.
ConnectMQ portalı ayrıca ISA-95 seviyelerine (enterprise, site, area, line, cell) göre düzenlenmiş bir cihaz görünümü sunar. Topic'leriniz bir Unified Namespace düzenini izliyorsa, bu görünüm aynı verileri ham dizeler yerine tesis hiyerarşisine göre gruplar; bu da yanlış yerleştirilmiş cihazları göze batırır. Sparkplug B ve Unified Namespace yazımız bu yapıyı açıklar.
Komut Satırından Topic'lere Göz Atın
Grafik bir tarayıcı her zaman elinizin altında olmayabilir. -v bayrağıyla mosquitto_sub her payload'dan önce topic'i yazdırır ve birkaç ek bayrak onu hafif bir tarayıcıya dönüştürür:
# Kökünüzün altındaki her topic, topic adlarıyla
mosquitto_sub -h broker.connectmq.com -p 1883 -i browse-$RANDOM \
-t 'connectmq/demo/RUN_ID/#' -v
# Yalnızca retained message'lar: bağlan, retained olanları yazdır, 3 sn sonra çık
mosquitto_sub -h broker.connectmq.com -p 1883 -i retained-$RANDOM \
-t 'connectmq/demo/RUN_ID/#' -v --retained-only -W 3
# 30 saniyede görülen benzersiz topic adları
timeout 30 mosquitto_sub -h broker.connectmq.com -p 1883 -i list-$RANDOM \
-t 'connectmq/demo/RUN_ID/#' -F '%t' | sort -u
RUN_ID'yi betiğin yazdırdığı değerle değiştirin. Son komut, MQTT'de "topic'leri listele"ye en yakın şeydir ve beklediğiniz topic'leri gerçekte var olan topic'lerle karşılaştırmanın hızlı bir yoludur. Daha fazla tarif mosquitto_pub ve mosquitto_sub örnekleri yazımızda.
Bir Topic Tarayıcısının Ortaya Çıkardığı Hata Ayıklama Desenleri
Bir ağacı okumaya alıştığınızda, topic sorunlarının çoğu az sayıda desene girer.
| Ağaçta gördüğünüz | Anlamı | Çözüm |
|---|---|---|
| Yalnızca büyük/küçük harfle farklılaşan iki dal | Firmware veya yapılandırmada tutarsız adlandırma | Küçük harfte standartlaşın ve kod incelemesinde zorunlu kılın |
| Adı boş bir yaprak | Yayın topic'inde sondaki eğik çizgi | Yayınlamadan önce sondaki eğik çizgileri kaldırın |
| Adı boş bir ilk seviye | Baştaki eğik çizgi (/factory1/...) |
Baştaki eğik çizgiyi kaldırın; gereksiz bir seviye ekler |
| Değeri hiç değişmeyen bir yaprak | Cihaz yayını durdurdu veya değer eski retained veri | Cihazı kontrol edin; eskimişse retained message'ı temizleyin |
| Biçimler arasında gidip gelen değerler | Tek bir topic'te iki firmware sürümü veya iki yayıncı | Payload'u sürümlendirin veya topic'leri ayırın |
| Adında ID bulunan yüzlerce kardeş yaprak | Benzersiz ID'ler hiyerarşide fazla yukarıda | ID'leri cihaz seviyesine taşıyın |
| Çok derin dallar | Aşırı yapılandırılmış topic'ler | Düzleştirin; herkese açık broker 8 seviyeye izin verir |
Eski Retained Message'ları Temizlemek
Retained değerler, yerlerine yenisi gelene kadar broker'da kalır. Bu nedenle hizmetten çıkarılmış bir cihaz her panoda "güncel" bir değer göstermeye devam edebilir. Bir retained message'ı kaldırmak için tam olarak aynı topic'e boş bir retained payload yayınlayın:
mosquitto_pub -h broker.connectmq.com -p 1883 -i clear-$RANDOM \
-t 'connectmq/demo/RUN_ID/factory1/Line1/cnc1/meta' -r -n
-n bayrağı sıfır uzunlukta bir payload gönderir, -r ise retain bayrağını ayarlar. Topic tarayıcısını yenileyin; Line1 dalı başka alt öğesi kalmadığında kaybolur.
Canlı Ortamda Bir Topic Tarayıcısını Doğru Kullanmak
Yoğun bir canlı ortam broker'ında #'e abone olan bir tarayıcı her mesajı alır; bu da bant genişliğine mal olur ve abonelik veya bağlantı kotalarına takılabilir. Birkaç alışkanlık onu kullanışlı tutar:
- Sorunuzu yanıtlayan en dar köke abone olun;
#yerinefactory1/line2/#gibi. - Hata ayıklama araçları için ayrı bir kimlik bilgisi kullanın; böylece bir tarayıcı oturumu asla bir cihazın client ID'sini alıp cihazı çevrimdışı bırakmaz.
- Verinin yanı sıra bağlantı durumunu da kontrol edin. ConnectMQ broker'ınızdaki
$SYS/broker/connection/{clientId}/statetopic'i belirli bir client'ın bağlı olup olmadığını söyler; bu da "cihaz çevrimdışı" ile "cihaz çevrimiçi ama sessiz" durumlarını birbirinden ayırır. - Adlandırma kurallarınızı yazıya dökün ve her firmware sürümünden sonra ağacı bunlarla karşılaştırın.
Editör merkezli iş akışları için ConnectMQ VS Code eklentisi ve ConnectMQ Desktop MQTT explorer, portalın dışında aynı ağaç tarzı gezinmeyi sunar. Yalnızca bir web tarayıcısından test ediyorsanız, online MQTT web client kullanma rehberimiz bununla iyi bir ikili oluşturur; MQTT broker izleme ise bir topic tarayıcısının göstermediği metrikleri ele alır.
Kendi Topic'lerinizi ConnectMQ'da Keşfedin
Kredi kartı gerekmeden app.connectmq.com adresinde Serverless planında ücretsiz bir broker oluşturun. Portal, bu rehberde kullanılan canlı topic gezginini, tarayıcı içi client'ı ve ISA-95 cihaz görünümünü içerir. Tam yönetilen bir MQTT hizmeti olarak ConnectMQ hakkında daha fazla bilgi edinin veya bir bulut MQTT broker seçimine dair kapsamlı rehberi okuyun.
Sık Sorulan Sorular
Bir MQTT broker'daki tüm topic'leri listeleyebilir miyim?
Doğrudan hayır; MQTT'nin bir topic kaydı yoktur. Bir topic tarayıcısı bir joker karaktere abone olur ve mesaj alan topic'leri ve retained topic'leri gösterir; bu da pratikteki karşılığıdır.
Topic tarayıcım var olduğunu bildiğim bir topic'i neden göstermiyor?
Ya abone olduğunuzdan beri ona hiçbir şey yayınlanmamıştır ve retained message tutmuyordur ya da joker karakteriniz onu kapsamıyordur. Büyük/küçük harfi, baştaki veya sondaki eğik çizgileri ve abonelik kökünü kontrol edin.
Canlı ortam broker'ında #'e abone olmak güvenli mi?
Çalışır ama her mesajı alır; bu da ağır olabilir. Sorunuzu yanıtlayan en dar köke abone olun ve ayrı bir hata ayıklama kimlik bilgisi kullanın.
Bir topic'i ağaçtan nasıl silerim?
Topic'ler, onları tutan hiçbir şey kalmadığında kaybolur. O topic'e boş bir retained payload yayınlayarak retained message'ı temizleyin ve onu oluşturan yayıncıyı durdurun.



