MATLAB peut dialoguer avec n'importe quel broker MQTT grâce à une seule fonction : mqttclient, fournie par Industrial Communication Toolbox. Elle se connecte, s'abonne, publie et met en mémoire tampon les messages entrants dans une timetable, exactement le format dont MATLAB a besoin pour l'analyse. Ce tutoriel couvre un flux complet : se connecter à un broker, collecter des données de capteurs, publier des commandes, analyser le résultat, et que faire dans Simulink ou sans la toolbox.
Ce qu'il vous faut
- MATLAB avec Industrial Communication Toolbox (l'ancienne OPC Toolbox, qui a obtenu la prise en charge de MQTT dans R2022a). Vérifiez avec
verouwhich mqttclient. - Un broker. Les exemples utilisent l'endpoint de test partagé
broker.connectmq.com(TCP1883, TLS8883). - Un second client pour observer le trafic, comme le client MQTT en ligne ou
mosquitto_sub.
Utilisez un préfixe de topic unique comme testmqtt/matlab/<votre-nom>/... pour que vos données de test ne se mélangent pas à celles des autres utilisateurs d'un broker partagé.
Se connecter au broker
mqttclient prend l'adresse du broker avec un schéma (tcp://, ssl://, ws:// ou wss://) et les options sous forme d'arguments nom-valeur :
client = mqttclient("tcp://broker.connectmq.com", ...
Port=1883, ...
ClientID="matlab-" + string(randi(1e6)), ...
KeepAliveDuration=seconds(60));
client.Connected % true lorsque le CONNECT a été acceptéPour un broker authentifié, lisez les identifiants dans des variables d'environnement au lieu de les écrire en dur dans un script que vous pourriez partager :
client = mqttclient("ssl://broker.connectmq.com", ...
Port=8883, ...
Username=getenv("MQTT_USER"), ...
Password=getenv("MQTT_PASS"), ...
CARootCertificate="ca.pem");CARootCertificate désigne un fichier PEM contenant la CA qui a signé le certificat du broker. Pour le TLS mutuel, ajoutez ClientCertificate et ClientKey. Si la connexion échoue, vérifiez d'abord la chaîne de certificats en dehors de MATLAB ; voir tester une connexion MQTT TLS.
S'abonner : callback ou tampon
Il existe deux façons de recevoir des messages, et bien choisir compte davantage dans MATLAB que dans d'autres langages.
Mode tampon (sans callback) : les messages entrants sont stockés dans l'objet client. Vous les récupérez plus tard avec read. C'est idéal pour l'analyse de données, car vous obtenez une timetable en un seul appel :
subscribe(client, "testmqtt/matlab/sensors/+/temp", QualityOfService=1);
pause(30) % collecter pendant 30 secondes
msgs = read(client); % timetable : Time, Topic, Data
head(msgs)Mode callback : une fonction s'exécute pour chaque message. Utilisez-le pour des réactions en direct, comme mettre à jour un graphique ou déclencher une alarme :
subscribe(client, "testmqtt/matlab/alarms/#", Callback=@onAlarm);
function onAlarm(topic, data)
fprintf("%s %s -> %s\n", string(datetime("now")), topic, data);
endLe callback reçoit le topic et le payload. Gardez-le court : il s'exécute sur le thread MATLAB, donc un calcul lourd à l'intérieur retarde tous les messages suivants. Les filtres de topic suivent les règles MQTT habituelles (+ correspond à un niveau, # au reste) ; testez un filtre sur de vrais topics avec le topic matcher avant de vous demander pourquoi rien n'arrive.
Autres fonctions utiles : peek(client) affiche les messages les plus récents du tampon sans les retirer, unsubscribe(client, topic) arrête un abonnement, flush(client) vide le tampon et client.Subscriptions liste les abonnements actifs.
Publier depuis MATLAB
write envoie un message. Encodez les données structurées avec jsonencode pour que n'importe quel autre client puisse les lire :
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)
endPassez Retain=true pour les états que les abonnés tardifs doivent voir immédiatement, comme une consigne ou une version de modèle. Le QoS 1 garantit une livraison au moins une fois entre MATLAB et le broker ; voir les niveaux de QoS MQTT pour les compromis.
Observez le résultat dans une seconde fenêtre : ouvrez le client en ligne, abonnez-vous à testmqtt/matlab/#, et vous devriez voir trois topics se mettre à jour chaque seconde.
Voir vos messages MATLAB dans le navigateur
Analyser les données
C'est là que MATLAB excelle. read renvoie une timetable dont la variable Data contient les payloads sous forme de chaînes. Décodez-les, construisez une timetable propre et rééchantillonnez :
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"]);
% Moyenne par minute et par capteur
perMinute = groupsummary(timetable2table(tt), ...
["Sensor" "Time"], {"none" "minute"}, "mean", "Value");
% Lisser et tracer
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("Température (°C)"); title("Données de capteurs MQTT")Quelques remarques pratiques :
msgs.Timeest le moment où le message est arrivé dans MATLAB, pas celui où l'appareil a effectué la mesure. Si le temps compte, incluez un horodatage dans le payload (comme ci-dessus) et utilisez-le. La dérive d'horloge entre appareils est une source classique de graphiques déroutants.- Le décodage échoue sur du JSON mal formé. Entourez
jsondecoded'untry/catchpour des données réelles, ou filtrez d'abord avecstartsWith(msgs.Data, "{"). - Le tampon grossit tant que vous ne lisez pas. Pour les longues sessions, appelez
readrégulièrement et ajoutez les données à un fichier avecwritetimetable, ou stockez-les sur disque dès le départ (voir journaliser MQTT en CSV pour le même principe en Python).
La conception du payload rend cette étape facile ou pénible. Un JSON court et plat, avec unités et horodatages explicites, est le format le plus pratique pour l'analyse ; voir les bonnes pratiques de conception de payload.
MQTT dans Simulink
Pour les modèles qui doivent échanger des signaux avec de vrais appareils, les versions récentes d'Industrial Communication Toolbox proposent les blocs MQTT Publish et MQTT Subscribe, et les packages de support matériel (par exemple celui pour Raspberry Pi) incluent leurs propres blocs MQTT pour la génération de code sur la cible. L'ensemble exact de blocs et d'options dépend de votre version : consultez la bibliothèque de blocs de votre installation.
Usages typiques :
- Hardware-in-the-loop : un modèle de procédé dans Simulink s'abonne aux commandes d'actionneurs d'un vrai contrôleur et publie des valeurs de capteurs simulées.
- Tableaux de bord de jumeau numérique : un modèle en cours d'exécution publie ses états pour qu'un tableau de bord web les affiche.
- Réglage de paramètres : un bloc abonné reçoit des consignes publiées depuis MATLAB ou un navigateur pendant la simulation.
Par défaut, Simulink tourne aussi vite que possible. Lorsque vous le connectez à MQTT, activez le simulation pacing (ou utilisez une cible temps réel) afin que le modèle n'inonde pas le broker de milliers de messages par seconde de temps simulé.
Sans la toolbox : utiliser Python depuis MATLAB
Si Industrial Communication Toolbox n'est pas disponible, l'interface Python de MATLAB peut appeler directement paho-mqtt. Installez-le dans l'environnement Python indiqué par pyenv (pip install paho-mqtt), puis utilisez les fonctions bloquantes de paho :
% Publier un message
py.paho.mqtt.publish.single("testmqtt/matlab/cmd", "start", ...
pyargs("hostname", "broker.connectmq.com", "port", int32(1883), "qos", int32(1)));
% Attendre 5 messages et les renvoyer
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()));
endCela convient aux scripts et aux traitements par lots. Pour des flux continus, faites tourner en dehors de MATLAB un petit bridge Python ou Node.js qui écrit dans un fichier ou une base de données, et analysez ces données avec MATLAB ; il survit aux redémarrages de MATLAB et garde votre code d'analyse simple.
Dépannage
| Symptôme | Cause probable | Solution |
|---|---|---|
mqttclient n'est pas défini | Toolbox non installée ou sans licence | Installer Industrial Communication Toolbox ou utiliser la solution Python |
| Erreur de connexion immédiate | Schéma et port incompatibles (ssl:// sur 1883, tcp:// sur 8883) | Associer tcp→1883, ssl→8883, ws→8083, wss→8084 |
| Se connecte puis se déconnecte en boucle | Client ID en double | Utiliser un ClientID aléatoire par session |
Abonné mais read ne renvoie rien | Le filtre de topic ne correspond pas, ou l'éditeur est sur un autre broker | Tester le filtre avec le client en ligne et le topic matcher |
| Authentification refusée | Identifiants erronés, ou l'utilisateur n'a pas la permission ACL | Vérifier avec mosquitto_sub -d et contrôler les ACL du broker |
En résumé
mqttclient fait de MATLAB un client MQTT à part entière : connectez-vous en tcp:// ou ssl://, abonnez-vous en mode tampon pour l'analyse ou avec un callback pour réagir en direct, publiez du JSON avec write et transformez les messages en timetables avec read. Validez topics et payloads avec un second client avant d'écrire du code d'analyse, incluez les horodatages des appareils dans les payloads et déplacez la collecte de longue durée vers un fichier ou une base de données dès que l'expérience devient un pipeline. Pour les architectures industrielles autour de ce sujet, voir MQTT dans l'IIoT et l'Industrie 4.0.
Questions fréquentes
Quelle toolbox MATLAB inclut MQTT ?
La fonction mqttclient fait partie d'Industrial Communication Toolbox (anciennement OPC Toolbox). Sans cette toolbox, vous pouvez appeler la bibliothèque Python paho-mqtt depuis MATLAB via l'interface py, ou utiliser un petit bridge externe.
Comment lire des messages MQTT dans une timetable MATLAB ?
Abonnez-vous sans callback et appelez read(client). La fonction renvoie tous les messages en mémoire tampon sous forme de timetable avec l'heure d'arrivée, le topic et le payload, que vous pouvez décoder avec jsondecode et rééchantillonner avec retime.
MATLAB peut-il se connecter à un broker MQTT en TLS ?
Oui. Utilisez une adresse de broker ssl:// avec le port 8883 et passez le fichier du certificat de la CA via l'option CARootCertificate. Pour le TLS mutuel, passez aussi ClientCertificate et ClientKey.

