Bu MQTT topic hiyerarşisi örnekleri, dört yaygın proje türü için hazır ağaçlar sunar: akıllı ev, araç filosu, fabrika ve enerji izleme sistemi. Her biri için ağacı, hizmet etmek üzere tasarlandığı abonelikleri ve arkasındaki kararları göreceksiniz; böylece boş bir sayfadan başlamak yerine bunları kendi projenize uyarlayabilirsiniz.
İyi MQTT Topic Hiyerarşilerinin Arkasındaki İlkeler
Aşağıdaki her ağaç aynı birkaç kuralı izler. Bunları bilmek, örnekleri kendi projenize göre esnetmeyi kolaylaştırır.
- Genelden özele. En genel seviyeyi (tesis, ev, filo) başa, en özel olanı (tek bir ölçüm veya komut) sona koyun.
- Her veri türü için sabit derinlik. Her cihazın telemetrisi aynı seviyede duruyorsa, tek bir
+kalıbı hepsini bulur. - Veriyi yönüne göre ayırın. Telemetri yukarı, komutlar aşağı akar. Cihazların yalnızca ihtiyaç duyduklarına abone olması için bunlara farklı dallar verin.
- Küçük harf, boşluk yok, baştaki eğik çizgi yok.
home/kitchen/tempveHome/Kitchen/Tempfarklı topic'lerdir; baştaki/boş bir ilk seviye oluşturur. - Değişikliklere dayanıklı tanımlayıcılar. Yeniden adlandırılan insan dostu etiketler yerine varlık etiketleri veya seri numaraları kullanın.
- Yayıncıya göre değil, aboneliklere göre tasarlayın. Ağacı sabitlemeden önce tüketicilerin çalıştıracağı wildcard sorgularını yazın.
Ayrıntılı gerekçeler MQTT topic adlandırma kuralları yazısında ele alınıyor. Burada somut ağaçlara odaklanıyoruz.
Akıllı Ev Topic Hiyerarşisi Örneği
Bir evin doğal bir yapısı vardır: odalar cihazları içerir, cihazlar durumlarını sunar ve komut kabul eder.
home/<room>/<device>/state # mevcut durum, retained
home/<room>/<device>/set # cihaza komut
home/<room>/<device>/availability # online/offline (Last Will)
home/<room>/<sensor>/<measurement> # sayısal ölçümler
home/livingroom/lamp/state -> {"on": true, "brightness": 70}
home/livingroom/lamp/set -> {"on": false}
home/kitchen/climate/temperature -> 21.4
home/kitchen/climate/humidity -> 48
home/garage/door/state -> "closed"
home/garage/door/availability -> "online"
| Tüketici ihtiyacı | Abonelik |
|---|---|
| Mutfaktaki her şey | home/kitchen/# |
| Tüm cihaz durumları | home/+/+/state |
| Tüm sıcaklık ölçümleri | home/+/+/temperature |
| Hangi cihazların çevrimdışı olduğu | home/+/+/availability |
Sonradan açılan bir panonun mevcut durumu hemen bilmesi için state ve availability topic'lerini retained message olarak yayınlayın. Komutlar retained olmamalıdır; aksi takdirde yeniden başlayan bir cihaz dünkü "garaj kapısını aç" komutunu tekrar oynatır. Odalar, entegrasyonlar ve Home Assistant keşfi hakkında daha derin bir inceleme için akıllı ev MQTT topic yapısı rehberine bakın.
Araç Filosu Topic Hiyerarşisi Örneği
Filo verisi araçlar etrafında düzenlenir ve tüketiciler genellikle ya tek bir aracın tam tablosunu ya da tüm filodaki tek bir veri türünü ister.
fleet/<region>/<vehicleId>/telemetry/<stream>
fleet/<region>/<vehicleId>/events/<eventType>
fleet/<region>/<vehicleId>/cmd/<command>
fleet/<region>/<vehicleId>/status
fleet/eu-west/van-0142/telemetry/gps -> {"lat": 51.51, "lon": -0.12, "spd": 34}
fleet/eu-west/van-0142/telemetry/engine -> {"rpm": 1800, "coolant": 88}
fleet/eu-west/van-0142/events/harsh-brake -> {"ts": 1792130400, "g": 0.52}
fleet/eu-west/van-0142/cmd/locate -> {}
fleet/eu-west/van-0142/status -> "online"
| Tüketici ihtiyacı | Abonelik |
|---|---|
| Tüm araçlar için canlı harita | fleet/+/+/telemetry/gps |
| Tek bir minibüsten gelen her şey | fleet/+/van-0142/# |
| Bir bölgedeki sürüş davranışı olayları | fleet/eu-west/+/events/# |
Örnek alınmaya değer kararlar:
- Araçtan önce bölge. Bu, işlemeyi daha sonra bölgelere göre bölmenize olanak tanır; örneğin bölge başına çalışan grupları için shared subscription'lar ile.
- Tek dev payload yerine akışlar. Saniyede bir gelen GPS verisi ile otuz saniyede bir gelen motor verisi aynı mesaja sıkıştırılmamalıdır.
- Araç başına komutlar. Her araç
fleet/<region>/<its id>/cmd/#topic'ine abone olur, başka hiçbir şeye değil.
Fabrika Topic Hiyerarşisi Örneği
Üretimde ekipman hiyerarşisi tesisin dokümantasyonunda zaten mevcuttur, bu yüzden ağaç onu yansıtmalıdır. Basitleştirilmiş bir sürüm:
<site>/<area>/<line>/<machine>/<namespace>/<detail>
plant1/assembly/line1/robot2/telemetry/joint-temps
plant1/assembly/line1/robot2/state
plant1/assembly/line1/robot2/alarms/overtemp
plant1/machining/line3/cnc1/telemetry/spindle
plant1/machining/line3/cnc1/cmd/stop
| Tüketici ihtiyacı | Abonelik |
|---|---|
| Tek bir hat için OEE servisi | plant1/machining/line3/+/state |
| Tüm alarmların bakım görünümü | plant1/+/+/+/alarms/# |
| Tüm tesis için historian | plant1/# |
Namespace sözlüğünü küçük ve sabit tutun: telemetry, state, alarms, events, cmd. Bir entegratör aynı şey için data, values ve measurements uydurduğunda, her tüketicinin üç kalıp öğrenmesi gerekir.
Enerji İzleme Topic Hiyerarşisi Örneği
Enerji projeleri, binalar arasında sayaçları, invertörleri ve bataryaları bir araya getirir. Ağaç, fiziksel konumu ölçülen enerji büyüklüğünden ayırır.
energy/<site>/<building>/<meterId>/<quantity>
energy/campus-a/building-3/main-meter/power -> 42.7 (kW)
energy/campus-a/building-3/main-meter/energy -> 18233.4 (kWh)
energy/campus-a/building-3/pv-inverter-1/power -> 12.1
energy/campus-a/building-3/battery-1/soc -> 76
energy/campus-a/building-3/battery-1/cmd/mode -> "discharge"
Birimleri dokümantasyona veya payload'a ekleyin, asla topic'in kendisine değil. .../power_kw gibi bir topic, birisi watt yayınladığı gün yanlış hâle gelir. {"v": 42.7, "unit": "kW", "ts": 1792130400} gibi bir JSON payload, topic'i sabit ve ölçümü kendini açıklayan hâlde tutar.
ISA-95 Tarzı Bir Ağaçla Sonuçlanmak
Bir proje tek bir tesisin ötesine büyüdüğünde veya bir Unified Namespace'i beslemeye başladığında, genellikle ISA-95 tarzı bir ağaçta birleşir: kuruluş, tesis, alan, hat, hücre veya makine, ardından bir veri namespace'i. Bu aynı zamanda ConnectMQ'nun Sparkplug B verisini okunabilir topic'lere yeniden yayınlarken kullandığı biçimdir. Şu topic'teki bir Sparkplug mesajı
spBv1.0/factory1/DDATA/line1/cnc1
çözülür ve şu topic'te yeniden yayınlanır:
connectmq/factory1/production/line1/cnc1/telemetry
Bu, size hedef yapının tam bir örneğini verir:
<enterprise>/<site>/<area>/<line>/<machine>/<namespace>
connectmq/factory1/production/line1/cnc1/telemetry
connectmq/factory1/production/line1/cnc1/state
connectmq/factory1/production/line2/press4/telemetry
connectmq/factory1/quality/lab/cmm1/events
ConnectMQ portalı ISA-95 ve Unified Namespace topic'lerini tanır ve cihazları bu seviyelere göre gruplanmış olarak gösterir; böylece disiplinli bir ağaç doğrudan cihazlar görünümünde karşılığını verir. ISA-95 MQTT topic'leri yazısı her seviyeyi ve tuzaklarını açıklar; Sparkplug B ve Unified Namespace rehberi ise ikisinin birbirine nasıl oturduğunu anlatır.
Dört Ağacın Karşılaştırması
| Proje | En üst seviye | Kimlik seviyesi | Verinin ayrıldığı eksen | Tipik derinlik |
|---|---|---|---|---|
| Akıllı ev | home |
odadaki cihaz | state / set / ölçüm | 4 |
| Filo | fleet |
bölgedeki araç | telemetry / events / cmd | 4–5 |
| Fabrika | tesis | hattaki makine | namespace | 5–6 |
| Enerji | energy |
binadaki sayaç | büyüklük | 5 |
Gerçek broker'larda derinlik önemlidir. Bazı broker'lar topic seviyelerini sınırlar ve her ekstra seviye her mesajda bayt maliyeti getirir. Örneğin broker.connectmq.com adresindeki herkese açık broker en fazla 8 topic seviyesine izin verir; bu yüzden connectmq/demo/<id> gibi bir demo öneki kendi ağacınız için beş seviye bırakır.
Bir Ağacı Herkese Açık Broker'da Deneyin
Bu hiyerarşilerden herhangi birini, karar vermeden önce ücretsiz herkese açık MQTT broker üzerinde prototipleyebilirsiniz. Herkese açık alan herkes tarafından okunabildiği için benzersiz bir önek kullanın ve veriyi hassas olmayan türden tutun.
# Abone: demo evinizdeki tüm cihaz durumları
mosquitto_sub -h broker.connectmq.com -p 1883 -i tree-sub-a91c \
-t 'connectmq/demo/a91c/home/+/+/state' -v
# Yayıncı: retained bir lamba durumu
mosquitto_pub -h broker.connectmq.com -p 1883 -i tree-pub-a91c -r \
-t 'connectmq/demo/a91c/home/livingroom/lamp/state' \
-m '{"on": true, "brightness": 70}'
Bu örnek yedi seviye kullanır ve herkese açık broker limitine sığar. Abone lamba durumunu görüyorsa wildcard planınız çalışıyor demektir. Ardından connectmq/demo/a91c/home/livingroom/# deneyin ve yalnızca oturma odasını döndürdüğünü doğrulayın. Ağaç sizin için yeniyse, MQTT wildcard rehberi + ve # işaretlerinin her seviyeyle nasıl eşleştiğini tam olarak açıklar; MQTT eğitimi ise publish ve subscribe temellerini kapsar.
Topic Hiyerarşilerinde Yaygın Hatalar
- Veri türünü başa koymak.
temperature/kitchen, her cihazı birçok dala dağıtır ve cihaz başına abonelikleri zahmetli hâle getirir. - Değerleri topic'lere kodlamak.
home/lamp/onvehome/lamp/offgibi topic'ler, tüketicilerin ikisine de abone olması demektir; değeri payload olarak yayınlayın. - Her mesaj ID'si veya zaman damgası için bir topic. Topic'ler kayıt değil, adrestir. Mesaj başına benzersiz topic'ler retained depolamayı ve topic listelerini şişirir.
- Karışık ayırıcılar. Aynı ağaçta
line-1,line_1veLine1kullanmak eninde sonunda birinin wildcard'ını bozar. Tek bir stil seçin. - Komut dalı olmaması. Komutlar telemetriyle aynı topic'i paylaşırsa, cihazlar kendi verilerini geri alır ve ekstra filtrelemeye ihtiyaç duyar.
ConnectMQ ile Başlayın
Ağacınız gerçek cihazlara hazır olduğunda, onu TLS ve özel kimlik bilgileriyle bir bulut MQTT broker üzerinde çalıştırın. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun ve hiyerarşinizin canlı topic gezgini ile ISA-95 cihazlar görünümünde dolmasını izleyin.
Sık Sorulan Sorular
Bir MQTT topic hiyerarşisi ne kadar derin olmalı?
Kaynağı ve veri türünü tanımlayacak kadar derin; genellikle dört ila altı seviye. Daha fazla seviye her mesaja bayt ekler ve faydalı bir yapı katmadan broker limitlerine takılabilir.
Önce cihaz ID'si mi yoksa veri türü mü gelmeli?
Önce konumu ve cihaz kimliğini, ardından veri türünü koyun. Bu, bir cihazın tüm verisini tek bir dal altında tutar ve yine de + wildcard'larının cihazlar arasında bir veri türünü seçmesine izin verir.
Topic hiyerarşimi daha sonra değiştirebilir miyim?
Evet, ancak her yayıncı ve abonenin de onunla birlikte değişmesi gerekir. Yaygın bir geçiş yolu, bir geçiş dönemi boyunca hem eski hem de yeni ağaca yayın yapmak, tüketiciler taşındıktan sonra eskisini kaldırmaktır.
Küçük bir proje için ISA-95'e ihtiyacım var mı?
Hayır. Akıllı ev örneği gibi basit bir ağaç küçük projeler için yeterlidir. ISA-95 tarzı ağaçlar, birden fazla tesis, ekip veya sistem tek bir namespace'i paylaştığında karşılığını verir.



