Tutoriels

MQTT dans MATLAB et Simulink : s'abonner, publier et analyser

Utilisez MQTT dans MATLAB avec mqttclient (Industrial Communication Toolbox) : connexion, abonnement, publication, messages en timetable et analyse en direct.

Mis à jour · 8 min de lecture

MQTT dans MATLAB et Simulink : s'abonner, publier et analyser

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 ver ou which mqttclient.
  • Un broker. Les exemples utilisent l'endpoint de test partagé broker.connectmq.com (TCP 1883, TLS 8883).
  • 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 :

connect.m
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 :

connect_auth.m
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 :

buffer.m
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 :

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

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

Le 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 :

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

Passez 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 :

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"]);

% 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.Time est 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 jsondecode d'un try/catch pour des données réelles, ou filtrez d'abord avec startsWith(msgs.Data, "{").
  • Le tampon grossit tant que vous ne lisez pas. Pour les longues sessions, appelez read régulièrement et ajoutez les données à un fichier avec writetimetable, 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.

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 :

paho_from_matlab.m
% 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()));
end

Cela 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ômeCause probableSolution
mqttclient n'est pas définiToolbox non installée ou sans licenceInstaller Industrial Communication Toolbox ou utiliser la solution Python
Erreur de connexion immédiateSché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 boucleClient ID en doubleUtiliser un ClientID aléatoire par session
Abonné mais read ne renvoie rienLe filtre de topic ne correspond pas, ou l'éditeur est sur un autre brokerTester le filtre avec le client en ligne et le topic matcher
Authentification refuséeIdentifiants erronés, ou l'utilisateur n'a pas la permission ACLVé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.