Dijital İkiz

MQTT ile Dijital İkiz Rehberi: Gerçek Zamanlı Durumu İkizinize Akıtmak

MQTT'nin dijital ikizler için neden doğal taşıma katmanı olduğu ve bir ikizin gerçek varlıklarla senkron kalması için topic'lerin, retained durumun, varlık bilgisinin ve komutların nasıl tasarlanacağı; çalıştırılabilir Python ve JavaScript ile.

Makinelerin canlı durumu bir broker üzerinden tarayıcıdaki 3D fabrika modeline yayınladığı MQTT ile dijital ikiz veri akışı
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

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:

  1. Uygulama, bir correlation ID içeren komutu QoS 1 ile, retained olmadan .../cmd topic'ine yayınlar.
  2. Cihaz komutu doğrular ve çalıştırır, ardından sonucu aynı ID ile .../cmd/ack topic'ine yayınlar.
  3. Cihaz, her görüntüleyicinin gördüğü retained state mesajını günceller.
  4. 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

  1. Animasyon için hızlı telemetri: QoS 0. Kaçırılan bir karenin yerini bir sonraki alır.
  2. Durum değişiklikleri ve alarmlar: QoS 1; böylece kısa bağlantı kopmalarında kaybolmazlar.
  3. 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 /mqtt yolunu 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.

İlgili yazılar

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.