Dijital ikizi MQTT ile birleştirmek, sanal bir modeli gerçek ekipmanla aynı adımda tutmanın en doğrudan yoludur. Bu rehberde MQTT'nin yayınla/abone ol modelinin ikizlere neden bu kadar iyi uyduğunu; topic'lerin, retained durumun, varlık bilgisinin (presence) ve komutların nasıl tasarlanacağını ve canlı durumun tarayıcı tabanlı bir ikize çalıştırılabilir Python ve JavaScript ile nasıl akıtılacağını öğreneceksiniz.
İkiz kavramında yeniyseniz dijital ikiz teknolojisi rehberiyle başlayın.
MQTT Dijital İkizlere Neden Uyar
Bir ikizin taşıma katmanından üç şeye ihtiyacı vardır: düşük gecikmeli güncellemeler, sonradan katılanların güncel durumu alabileceği bir yol ve cihazlara dokunmadan yeni tüketicilerin eklenebilmesi için gevşek bağlılık. MQTT bu üçünü de protokolün kendisinde sunar.
| İkiz gereksinimi | MQTT özelliği | Neden yardımcı olur |
|---|---|---|
| Canlı güncellemeler | Kalıcı bağlantılar, push teslimat | Değerler milisaniyeler içinde gelir, sorgulama (polling) yok |
| Yüklemede güncel durum | Retained mesajlar | Yeni bir görüntüleyici topic başına en son değeri anında alır |
| Varlık hiyerarşisi | Hiyerarşik topic'ler ve wildcard'lar | plant1/line2/# tek abonelikle bütün bir hattı verir |
| Çevrimiçi/çevrimdışı durumu | Last Will and Testament | Bir cihaz düştüğünde broker bunu duyurur |
| Güvenilirlik kontrolü | QoS 0, 1, 2 | Hızlı telemetri QoS 0'da, önemli olaylar QoS 1'de |
| Çok sayıda tüketici | Yayınla/abone ol ayrıştırması | Panolar, 3D görünümler ve analitik tek bir akışı paylaşır |
| Tarayıcı görüntüleyicileri | WebSocket üzerinden MQTT | 3D sahneler ek bir ağ geçidi olmadan doğrudan bağlanır |
Buna karşılık HTTP polling, her görüntüleyiciyi bir API'yi sürekli sorgulamaya zorlar ve yine de sorgular arasında boşluklar bırakır. Backend işleme için tasarlanmış mesaj kuyruklarında ise çoğu zaman retained durum ve tarayıcı bağlantısı yoktur. Bu yüzden pek çok ikiz platformu merkeze bir MQTT broker koyar.
MQTT ile Bir Dijital İkiz İçin Topic Tasarımı
Topic ağacı, ikizinizin adresleme şemasıdır. Fiziksel hiyerarşiyi yansıtın ve bir mesaj sınıfıyla bitirin:
connectmq/demo/<id>/factory1/line1/cnc1/telemetry stream, not retained
connectmq/demo/<id>/factory1/line1/cnc1/state current state, retained
connectmq/demo/<id>/factory1/line1/cnc1/status online/offline, retained + last will
connectmq/demo/<id>/factory1/line1/cnc1/cmd commands, never retained
connectmq/demo/<id>/factory1/line1/cnc1/cmd/ack command results
İleride sıkıntıyı önleyen kurallar:
- Topic seviyelerini görünen adlar değil, kararlı tanımlayıcılar olarak tutun. Adlar değişir; ID'ler değişmez.
- Birimleri ve zaman damgalarını topic'e değil, payload'a koyun.
- Her payload'ı küçük ve tek bir varlığa odaklı tutun.
- Komutları asla retained yapmayın. Retained bir
cmd, bir cihaz her yeniden bağlandığında tekrar çalıştırılır.
Topic'lerin varlık modeline nasıl eşlendiğine dair daha derin bir tartışma için dijital ikiz mimarisi yazısına bakın.
İkizin Belleği Olarak Retained Mesajlar
Bir görüntüleyici ikizi açtığında, her makineyi göstermek için bir sonraki telemetri adımını beklememelidir. Durumu retain bayrağıyla yayınlamak, broker'ın topic başına son mesajı saklaması ve abonelik anında hemen iletmesi anlamına gelir. Retained MQTT durumu eğitimi eksiksiz bir ikizi bu şekilde oluşturur; temel fikir paho-mqtt 2.x ile Python'da şöyledir:
import json
import random
import time
import paho.mqtt.client as mqtt
PREFIX = "connectmq/demo/b72e/factory1/line1/cnc1"
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="cnc1-sim-b72e")
client.will_set(f"{PREFIX}/status", payload="offline", qos=1, retain=True)
client.connect("broker.connectmq.com", 1883)
client.loop_start()
client.publish(f"{PREFIX}/status", "online", qos=1, retain=True)
try:
while True:
state = {
"ts": int(time.time() * 1000),
"spindle_rpm": random.randint(7800, 8200),
"feed_mm_min": random.randint(900, 1100),
"tool": 4,
"mode": "AUTO",
}
client.publish(f"{PREFIX}/state", json.dumps(state), qos=0, retain=True)
time.sleep(1)
except KeyboardInterrupt:
client.publish(f"{PREFIX}/status", "offline", qos=1, retain=True)
client.loop_stop()
client.disconnect()
status topic'indeki Last Will önemlidir. Simülatör çökerse veya ağ koparsa broker sizin yerinize offline yayınlar; mesaj retained olduğu için daha sonra açılan her görüntüleyici de makineyi çevrimdışı görür.
İkizi Bir Tarayıcıya Akıtmak
Tarayıcı tabanlı bir 3D veya 2D ikiz, 8084 portunda /mqtt yoluyla güvenli WebSocket üzerinden bağlanır. Bu MQTT.js örneği tüm hatta abone olur ve render kodunuzun her karede okuyabileceği bellek içi bir ikiz modelini günceller:
import mqtt from "mqtt";
const prefix = "connectmq/demo/b72e/factory1/line1";
const twin = new Map();
const client = mqtt.connect("wss://broker.connectmq.com:8084/mqtt", {
clientId: "twin-viewer-" + Math.random().toString(16).slice(2, 10),
protocolVersion: 5,
clean: true,
});
client.on("connect", () => {
client.subscribe(`${prefix}/+/state`);
client.subscribe(`${prefix}/+/status`);
});
client.on("message", (topic, payload) => {
const parts = topic.split("/");
const asset = parts[parts.length - 2];
const kind = parts[parts.length - 1];
const current = twin.get(asset) || {};
if (kind === "status") {
current.online = payload.toString() === "online";
} else {
Object.assign(current, JSON.parse(payload.toString()));
}
twin.set(asset, current);
console.log(asset, current);
});
Mesaj işlemeyi render işleminden ayırın. Mesajlar modeli günceller; render döngüsü modeli okur. Bu, mesajlar toplu halde geldiğinde bile kare hızlarını akıcı tutar.
İkiz Mesajları İçin Payload Tasarımı
Topic'ler tüketicilere bir değerin nereye ait olduğunu söyler; payload'lar ise ne anlama geldiğini. Birkaç kural, büyüyen bir ikizi yönetilebilir tutar:
- Her durum ve telemetri mesajına bir kaynak zaman damgası ekleyin (milisaniye cinsinden
ts). Böylece görüntüleyiciler her değerin yaşını gösterebilir ve sırası bozuk güncellemeleri yok sayabilir. - Aynı türdeki varlıklarda tutarlı alan adları ve birimler kullanın; ideal olarak bunları bir şemada veya DTDL gibi bir modelleme dilinde belgeleyin.
- Durum topic'ine kısmi yamalar değil, tam durumu gönderin. Retained kısmi bir yama, yeni bir görüntüleyiciye yarım bir resim bırakır.
- Payload'ları kompakt tutun. JSON'da hata ayıklamak kolaydır ve çoğu ikiz için yeterlidir; yalnızca bant genişliği gerçekten kısıtlıysa ikili (binary) bir kodlamaya geçin.
- Payload'lar evrilebilecekse bir şema sürümü alanı ekleyin; böylece yaygınlaştırmalar sırasında eski ve yeni cihazlar bir arada var olabilir.
Bu kurallar başlangıçta hiçbir şeye mal olmaz ve onlarca varlık türü ile birkaç tüketici uygulama aynı akışa bağımlı hale geldiğinde ciddi miktarda yeniden çalışmayı önler.
Komutlar: Döngüyü Kapatmak
Gözlemleyen bir ikiz, komut gönderebildiği anda işleten bir ikize dönüşür. Güvenli kalıp:
- Uygulama, bir correlation ID içeren komutu QoS 1 ile, retained olmadan
.../cmdtopic'ine yayınlar. - Cihaz komutu doğrular ve çalıştırır, ardından sonucu aynı ID ile
.../cmd/acktopic'ine yayınlar. - Cihaz, her görüntüleyicinin gördüğü retained
statemesajını günceller. - Onay gelmezse uygulama zaman aşımına uğrar.
MQTT 5 bunu response topic ve correlation data özellikleriyle, ayrıca çok uzun beklemiş bir komutun geç çalıştırılmak yerine atılmasını sağlayan message expiry ile daha temiz hale getirir. Ayrıntılar için MQTT 5 özellikleri yazısını okuyun. İstenen ve bildirilen durum yönetimi için dijital ikiz durum senkronizasyonu yazısına bakın.
İkiz Verisi İçin QoS Seçimi
- Animasyon için hızlı telemetri: QoS 0. Kaçırılan bir karenin yerini bir sonraki alır.
- Durum değişiklikleri ve alarmlar: QoS 1; böylece kısa bağlantı kopmalarında kaybolmazlar.
- Komutlar: idempotent işleme ve correlation ID'lerle QoS 1. Komutlar idempotent ise QoS 2'ye nadiren ihtiyaç duyulur.
MQTT QoS seviyeleri açıklandı yazısı ödünleşimleri derinlemesine ele alır.
ConnectMQ Canlı Bir 3D Dijital İkize Nasıl Güç Verir
ConnectMQ; CNC makinesi, robot kol, fırın, tank, konveyör ve pompadan oluşan küçük bir fabrikanın 3D dijital ikiz web demosunu çalıştırır. Simüle edilen varlıklar durumlarını broker'a yayınlar ve 3D sahne güvenli WebSocket üzerinden abone olur; tam olarak yukarıdaki kalıpları kullanarak: hiyerarşik topic'ler, anında yükleme için retained durum ve animasyonu yöneten canlı güncellemeler.
Kendi ikiziniz için ConnectMQ; MQTT 3.1.1 ve 5.0, 8883'te TLS ve Let's Encrypt sertifikalı 8084'te WSS sunan barındırılan bir MQTT broker sağlar; böylece tarayıcı görüntüleyicileri sertifika uyarısı olmadan bağlanır. Portalın canlı topic gezgini ve ISA-95 seviyelerine göre cihaz görünümü, her varlığın olması gereken yere yayın yaptığını kontrol etmenize yardımcı olur. Demo verileriyle ücretsiz herkese açık MQTT broker üzerinde denemeye başlayın, ardından gerçek varlıklar için kendi kimlik bilgilerinize geçin.
MQTT ile Dijital İkiz Kurulumlarında Sorun Giderme
- Görüntüleyici ilk güncellemeye kadar hiçbir şey göstermiyor. Durum retain bayrağıyla yayınlanmıyor.
- Bir cihaz yeniden başlatıldıktan sonra eski bir komutu çalıştırmaya devam ediyor. Bir komut retained yapılmış. O topic'e boş bir retained payload yayınlayarak temizleyin ve komutları retained yapmayı bırakın.
- Varlıklar güç kesintisinden sonra "çevrimiçi" kalıyor. Last Will yapılandırılmamış veya keepalive süresi çok uzun.
- Tarayıcı bağlanamıyor.
wss://URL'sini, 8084 portunu ve/mqttyolunu kontrol edin. - Animasyon takılıyor. Render işlemi mesaj işlemeye bağlı ya da telemetri hızı akıcı hareket için çok düşük; örnekler arasında enterpolasyon yapın.
Dijital İkizinizi ConnectMQ'ya Bağlayın
Kredi kartı gerekmeden app.connectmq.com adresinde ücretsiz Serverless planla bir broker oluşturun, otomatik üretilen kullanıcı adını, parolayı ve client ID'yi kopyalayın ve simülatörünüzü ile görüntüleyicinizi ona yönlendirin. Dakikalar içinde MQTT üzerinden veri akıtan canlı bir ikiziniz olacak.
Sık Sorulan Sorular
Dijital ikiz için neden REST yerine MQTT kullanılmalı?
MQTT güncellemeleri kalıcı bir bağlantı üzerinden gerçekleştikleri anda iletir ve en son durumu retained mesajlarda tutar; REST ise sorgulama gerektirir, gecikme ve yük ekler.
Bir tarayıcı 3D ikiz için doğrudan MQTT'ye bağlanabilir mi?
Evet. Tarayıcılar MQTT.js gibi bir kütüphane kullanarak WebSocket üzerinden MQTT ile bağlanır; örneğin wss://broker.connectmq.com:8084/mqtt.
Telemetriyi mi yoksa yalnızca durumu mu retained yapmalıyım?
Görüntüleyicilerin anında yüklenmesi için güncel durum topic'ini retained yapın; akış ile anlık görüntü arasında karışıklık olmaması için yüksek frekanslı telemetri akışlarını retained yapmayın.
Bir cihazın çevrimdışı olduğunu ikizde nasıl gösterebilirim?
Retained bir durum topic'inde Last Will mesajı yapılandırın. Cihazın bağlantısı beklenmedik şekilde koptuğunda broker bunu otomatik olarak yayınlar.



