Uygulamalı Eğitimler

MATLAB ve Simulink'te MQTT: Abone Olma, Yayınlama ve Veri Analizi

Industrial Communication Toolbox'taki mqttclient ile MATLAB'da MQTT: bağlanın, abone olun, yayınlayın, mesajları timetable'a okuyun ve canlı veriyi analiz edin.

Güncellendi · 8 dk okuma

MATLAB ve Simulink'te MQTT: Abone Olma, Yayınlama ve Veri Analizi

MATLAB tek bir fonksiyonla her MQTT broker'la konuşabilir: Industrial Communication Toolbox'ın parçası olan mqttclient. Bağlanır, abone olur, yayınlar ve gelen mesajları bir timetable içinde tamponlar; bu da MATLAB'ın analiz için tam istediği yapıdır. Bu rehber eksiksiz bir akışı adım adım gösteriyor: broker'a bağlanmak, sensör verisi toplamak, komut yayınlamak, sonucu analiz etmek ve Simulink'te ya da toolbox olmadan ne yapacağınız.

Neye ihtiyacınız var

  • Industrial Communication Toolbox kurulu MATLAB (R2022a'da MQTT desteği kazanan eski OPC Toolbox). ver veya which mqttclient ile kontrol edin.
  • Bir broker. Örnekler paylaşımlı test endpoint'i broker.connectmq.com adresini kullanır (TCP 1883, TLS 8883).
  • Trafiği izlemek için ikinci bir istemci; örneğin online MQTT istemcisi veya mosquitto_sub.

Test verilerinizin paylaşımlı bir broker'ın diğer kullanıcılarının verileriyle karışmaması için testmqtt/matlab/<adiniz>/... gibi benzersiz bir topic öneki kullanın.

Broker'a bağlanma

mqttclient, broker adresini bir şemayla (tcp://, ssl://, ws:// veya wss://) ve seçenekleri ad-değer argümanları olarak alır:

connect.m
client = mqttclient("tcp://broker.connectmq.com", ...
    Port=1883, ...
    ClientID="matlab-" + string(randi(1e6)), ...
    KeepAliveDuration=seconds(60));

client.Connected   % CONNECT kabul edildiğinde true

Kimlik doğrulama isteyen bir broker için kimlik bilgilerini paylaşabileceğiniz bir betiğe gömmek yerine ortam değişkenlerinden okuyun:

connect_auth.m
client = mqttclient("ssl://broker.connectmq.com", ...
    Port=8883, ...
    Username=getenv("MQTT_USER"), ...
    Password=getenv("MQTT_PASS"), ...
    CARootCertificate="ca.pem");

CARootCertificate, broker sertifikasını imzalayan CA'yı içeren bir PEM dosyasını gösterir. Karşılıklı TLS için ClientCertificate ve ClientKey ekleyin. Bağlantı başarısız olursa önce sertifika zincirini MATLAB dışında doğrulayın; bkz. MQTT TLS bağlantısını test etmek.

Abone olma: callback mi tampon mu

Mesaj almanın iki yolu vardır ve doğru olanı seçmek MATLAB'da diğer dillere göre daha önemlidir.

Tampon modu (callback yok): Gelen mesajlar istemci nesnesinin içinde saklanır. Onları daha sonra read ile alırsınız. Tek bir çağrıyla timetable elde ettiğiniz için veri analizi için idealdir:

buffer.m
subscribe(client, "testmqtt/matlab/sensors/+/temp", QualityOfService=1);
pause(30)                        % 30 saniye boyunca topla
msgs = read(client);             % timetable: Time, Topic, Data
head(msgs)

Callback modu: Her mesaj için bir fonksiyon çalışır. Bir grafiği güncellemek veya alarm tetiklemek gibi canlı tepkiler için kullanın:

live.m
subscribe(client, "testmqtt/matlab/alarms/#", Callback=@onAlarm);

function onAlarm(topic, data)
    fprintf("%s  %s -> %s\n", string(datetime("now")), topic, data);
end

Callback, topic'i ve payload'ı alır. Kısa tutun: MATLAB thread'inde çalışır, yani içindeki ağır bir hesaplama sonraki tüm mesajları geciktirir. Topic filtreleri normal MQTT kurallarına uyar (+ bir seviyeyle, # geri kalanla eşleşir); hiçbir şeyin neden gelmediğini merak etmeden önce bir filtreyi topic matcher ile gerçek topic'lere karşı test edin.

Diğer faydalı fonksiyonlar: peek(client) tampondaki en yeni mesajları silmeden gösterir, unsubscribe(client, topic) bir aboneliği durdurur, flush(client) tamponu boşaltır ve client.Subscriptions etkin abonelikleri listeler.

MATLAB'dan yayınlama

write bir mesaj gönderir. Yapılandırılmış verileri jsonencode ile kodlayın ki diğer tüm istemciler ayrıştırabilsin:

simulate_sensors.m
for k = 1:60
    for id = ["s1" "s2" "s3"]
        msg = jsonencode(struct( ...
            "value", 20 + 2*randn(), ...
            "ts", posixtime(datetime("now"))));
        write(client, "testmqtt/matlab/sensors/" + id + "/temp", msg, ...
            QualityOfService=1);
    end
    pause(1)
end

Bir setpoint veya model sürümü gibi sonradan bağlanan abonelerin hemen görmesi gereken durumlar için Retain=true verin. QoS 1, MATLAB ile broker arasında en az bir kez teslimatı garanti eder; avantaj ve dezavantajlar için MQTT QoS seviyeleri yazısına bakın.

Sonucu ikinci bir pencereden izleyin: online istemciyi açın, testmqtt/matlab/# topic'ine abone olun; her saniye güncellenen üç topic görmelisiniz.

MATLAB mesajlarınızı tarayıcıda izleyin

Veriyi analiz etme

MATLAB'ın parladığı yer burası. read, Data değişkeninde payload'ları string olarak tutan bir timetable döndürür. Onları çözün, temiz bir timetable oluşturun ve yeniden örnekleyin:

analyze.m
msgs = read(client);

value = arrayfun(@(s) getfield(jsondecode(s), "value"), msgs.Data);
sensor = extractBetween(msgs.Topic, "sensors/", "/temp");

tt = timetable(msgs.Time, categorical(sensor), value, ...
    VariableNames=["Sensor" "Value"]);

% Sensör başına dakikalık ortalama
perMinute = groupsummary(timetable2table(tt), ...
    ["Sensor" "Time"], {"none" "minute"}, "mean", "Value");

% Yumuşat ve çiz
figure; hold on
for s = categories(tt.Sensor)'
    t = tt(tt.Sensor == s{1}, :);
    plot(t.Time, smoothdata(t.Value, "movmean", 10), DisplayName=s{1});
end
legend; ylabel("Sıcaklık (°C)"); title("MQTT sensör verisi")

Birkaç pratik not:

  • msgs.Time, mesajın cihazda ölçüldüğü an değil, MATLAB'a ulaştığı andır. Zamanlama önemliyse payload'a bir zaman damgası ekleyin (yukarıdaki gibi) ve onu kullanın. Cihazlar arasındaki saat kayması kafa karıştıran grafiklerin klasik nedenidir.
  • Bozuk JSON'da çözme işlemi hata verir. Gerçek cihaz verilerinde jsondecode'u try/catch ile sarın veya önce startsWith(msgs.Data, "{") ile filtreleyin.
  • Siz okumadıkça tampon büyür. Uzun çalışmalarda read'i düzenli aralıklarla çağırıp verileri writetimetable ile bir dosyaya ekleyin ya da baştan diske yazın (aynı yaklaşımın Python versiyonu için MQTT'yi CSV'ye kaydetmek yazısına bakın).

Payload tasarımı bu adımı kolaylaştırır ya da çileye çevirir. Birimleri ve zaman damgaları açıkça belirtilmiş kısa, düz JSON analiz için en kullanışlı formattır; bkz. payload tasarımı en iyi uygulamaları.

Gerçek cihazlarla sinyal alışverişi yapması gereken modeller için Industrial Communication Toolbox'ın güncel sürümleri MQTT Publish ve MQTT Subscribe bloklarını sunar; donanım destek paketleri (örneğin Raspberry Pi paketi) ise hedef üzerinde kod üretimi için kendi MQTT bloklarını içerir. Blok seti ve seçenekler sürüme göre değişir, bu yüzden kurulumunuzdaki blok kütüphanesini kontrol edin.

Tipik kullanımlar:

  • Hardware-in-the-loop: Simulink'teki bir tesis modeli gerçek bir kontrolcünün aktüatör komutlarına abone olur ve simüle edilmiş sensör değerleri yayınlar.
  • Dijital ikiz dashboard'ları: Çalışan bir model durumlarını yayınlar, böylece bir web dashboard'u bunları gösterebilir.
  • Parametre ayarı: Simülasyon çalışırken bir abone bloğu MATLAB'dan veya tarayıcıdan yayınlanan setpoint'leri alır.

Simulink varsayılan olarak olabildiğince hızlı çalışır. MQTT'ye bağladığınızda simulation pacing'i açın (veya gerçek zamanlı bir hedef kullanın) ki model, simüle edilen zamanın her saniyesi için broker'ı binlerce mesajla boğmasın.

Toolbox olmadan: MATLAB'dan Python kullanın

Industrial Communication Toolbox yoksa, MATLAB'ın Python arayüzü paho-mqtt kütüphanesini doğrudan çağırabilir. pyenv'in gösterdiği Python ortamına kurun (pip install paho-mqtt), ardından paho'nun bloklayan yardımcı fonksiyonlarını kullanın:

paho_from_matlab.m
% Tek bir mesaj yayınla
py.paho.mqtt.publish.single("testmqtt/matlab/cmd", "start", ...
    pyargs("hostname", "broker.connectmq.com", "port", int32(1883), "qos", int32(1)));

% 5 mesaj bekle ve döndür
msgs = py.paho.mqtt.subscribe.simple("testmqtt/matlab/sensors/#", ...
    pyargs("hostname", "broker.connectmq.com", "msg_count", int32(5)));

for k = 1:length(msgs)
    m = msgs{k};
    fprintf("%s: %s\n", string(m.topic), string(m.payload.decode()));
end

Bu, betikler ve toplu işler için yeterlidir. Sürekli veri akışları için MATLAB dışında bir dosyaya veya veritabanına yazan küçük bir Python ya da Node.js bridge'i çalıştırın ve o veriyi MATLAB ile analiz edin; MATLAB yeniden başlatmalarından etkilenmez ve analiz kodunuzu sade tutar.

Sorun giderme

BelirtiOlası nedenÇözüm
mqttclient tanımlı değilToolbox kurulu değil veya lisanslı değilIndustrial Communication Toolbox'ı kurun ya da Python yöntemini kullanın
Anında bağlantı hatasıŞema ve port uyuşmuyor (1883'te ssl://, 8883'te tcp://)tcp→1883, ssl→8883, ws→8083, wss→8084 eşleştirin
Bağlanıp tekrar tekrar kopuyorYinelenen client IDHer oturum için rastgele bir ClientID kullanın
Abone olundu ama read boş dönüyorTopic filtresi eşleşmiyor veya yayıncı başka bir broker'daFiltreyi online istemci ve topic matcher ile test edin
Kimlik doğrulama reddedildiYanlış kimlik bilgileri veya kullanıcının ACL izni yokmosquitto_sub -d ile doğrulayın, broker ACL'lerini kontrol edin

Özet

mqttclient, MATLAB'ı tam teşekküllü bir MQTT istemcisine dönüştürür: tcp:// veya ssl:// ile bağlanın, analiz için tampon modunda ya da canlı tepkiler için callback ile abone olun, write ile JSON yayınlayın ve read ile mesajları timetable'a çevirin. Analiz kodu yazmadan önce topic'leri ve payload'ları ikinci bir istemciyle doğrulayın, payload'lara cihaz zaman damgaları ekleyin ve deney bir pipeline'a dönüştüğünde uzun süreli veri toplamayı bir dosyaya veya veritabanına taşıyın. Bunun etrafındaki endüstriyel mimariler için IIoT ve Endüstri 4.0'da MQTT yazısına bakın.

Sıkça sorulan sorular

MQTT hangi MATLAB toolbox'ında bulunur?

mqttclient fonksiyonu Industrial Communication Toolbox (eski adıyla OPC Toolbox) ile gelir. Bu toolbox yoksa, Python paho-mqtt kütüphanesini MATLAB'dan py arayüzüyle çağırabilir veya küçük harici bir bridge kullanabilirsiniz.

MQTT mesajlarını MATLAB timetable'ına nasıl okurum?

Callback olmadan abone olun ve read(client) çağırın. Tampondaki tüm mesajları varış zamanı, topic ve payload içeren bir timetable olarak döndürür; bunları jsondecode ile çözüp retime ile yeniden örnekleyebilirsiniz.

MATLAB bir MQTT broker'a TLS ile bağlanabilir mi?

Evet. 8883 portuyla ssl:// broker adresi kullanın ve CA sertifika dosyasını CARootCertificate seçeneğiyle verin. Karşılıklı TLS için ClientCertificate ve ClientKey de verin.