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).
verveyawhich mqttclientile kontrol edin. - Bir broker. Örnekler paylaşımlı test endpoint'i
broker.connectmq.comadresini kullanır (TCP1883, TLS8883). - 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:
client = mqttclient("tcp://broker.connectmq.com", ...
Port=1883, ...
ClientID="matlab-" + string(randi(1e6)), ...
KeepAliveDuration=seconds(60));
client.Connected % CONNECT kabul edildiğinde trueKimlik doğrulama isteyen bir broker için kimlik bilgilerini paylaşabileceğiniz bir betiğe gömmek yerine ortam değişkenlerinden okuyun:
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:
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:
subscribe(client, "testmqtt/matlab/alarms/#", Callback=@onAlarm);
function onAlarm(topic, data)
fprintf("%s %s -> %s\n", string(datetime("now")), topic, data);
endCallback, 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:
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)
endBir 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:
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'utry/catchile sarın veya öncestartsWith(msgs.Data, "{")ile filtreleyin. - Siz okumadıkça tampon büyür. Uzun çalışmalarda
read'i düzenli aralıklarla çağırıp verileriwritetimetableile 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ı.
Simulink'te MQTT
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:
% 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()));
endBu, 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
| Belirti | Olası neden | Çözüm |
|---|---|---|
mqttclient tanımlı değil | Toolbox kurulu değil veya lisanslı değil | Industrial 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 kopuyor | Yinelenen client ID | Her oturum için rastgele bir ClientID kullanın |
Abone olundu ama read boş dönüyor | Topic filtresi eşleşmiyor veya yayıncı başka bir broker'da | Filtreyi online istemci ve topic matcher ile test edin |
| Kimlik doğrulama reddedildi | Yanlış kimlik bilgileri veya kullanıcının ACL izni yok | mosquitto_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.

