MQTT Temelleri

Gerçek IoT Projeleri için MQTT Topic Hiyerarşisi Örnekleri

Akıllı ev, filo takibi, fabrika ve enerji izleme projeleri için kopyalanmaya hazır MQTT topic ağaçları; her biri için tasarlandığı wildcard abonelikleri ve kaçınılması gereken hatalarla birlikte.

Akıllı ev, filo, fabrika ve enerji projeleri için MQTT topic hiyerarşisi örneklerini gösteren ağaç diyagramı
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

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.

  1. Genelden özele. En genel seviyeyi (tesis, ev, filo) başa, en özel olanı (tek bir ölçüm veya komut) sona koyun.
  2. Her veri türü için sabit derinlik. Her cihazın telemetrisi aynı seviyede duruyorsa, tek bir + kalıbı hepsini bulur.
  3. 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.
  4. Küçük harf, boşluk yok, baştaki eğik çizgi yok. home/kitchen/temp ve Home/Kitchen/Temp farklı topic'lerdir; baştaki / boş bir ilk seviye oluşturur.
  5. 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.
  6. 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/on ve home/lamp/off gibi 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_1 ve Line1 kullanmak 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.

İlgili yazılar

MQTT'yi Kim İcat Etti? Petrol Boru Hatlarından IoT'ye Uzanan Tarih

MQTT, 1999'da IBM'den Andy Stanford-Clark ve Arcom'dan Arlen Nipper tarafından petrol boru hatlarını uydu üzerinden izlemek için icat edildi. Açık kaynağa, OASIS'e, ISO'ya ve bugünün yönetilen bulut broker'larına uzanan yolculuğunu izleyin.

7 dk okuma

MQTT Maksimum Mesaj Boyutu: Sınırlar ve Büyük Payload Stratejileri

MQTT teknik olarak 256 MB'lık bir paket taşıyabilir, ancak broker'lar, istemci kütüphaneleri ve cihazlar çok daha düşük sınırlar uygular. Gerçek sınırların nerede olduğunu, aşıldıklarında ne olduğunu ve büyük payload'ların nasıl gönderileceğini öğrenin.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.