Fondamentaux MQTT

Exemples de hiérarchie de topics MQTT pour de vrais projets IoT

Des arborescences de topics MQTT prêtes à copier pour la maison connectée, le suivi de flotte, l'usine et la supervision énergétique, chacune avec les abonnements wildcard pour lesquels elle est conçue et les erreurs à éviter.

Diagramme en arbre d'exemples de hiérarchie de topics MQTT pour des projets de maison connectée, de flotte, d'usine et d'énergie
Essayez-le sur votre propre broker MQTTObtenez un broker MQTT privé et managé avec l’offre Free et partez d’exemples de code prêts à l’emploi.
Essayer gratuitement Exemples de code Aucune carte bancaire requise

Ces exemples de hiérarchie de topics MQTT vous offrent des arborescences prêtes à l'emploi pour quatre types de projets courants : une maison connectée, une flotte de véhicules, une usine et un système de supervision énergétique. Pour chacun, vous verrez l'arborescence, les abonnements qu'elle doit servir et les décisions qui la sous-tendent, afin de pouvoir l'adapter au lieu de partir d'une page blanche.

Les principes d'une bonne hiérarchie de topics MQTT

Toutes les arborescences ci-dessous suivent la même poignée de règles. Les connaître permet d'adapter plus facilement les exemples à votre propre projet.

  1. Du général au particulier. Placez le niveau le plus général en premier (site, maison, flotte) et le plus spécifique en dernier (une mesure ou une commande précise).
  2. Profondeur fixe par type de données. Si la télémétrie de chaque appareil se trouve au même niveau, un seul motif + les retrouve toutes.
  3. Séparer les données selon leur sens. La télémétrie remonte, les commandes descendent. Donnez-leur des branches différentes pour que les appareils ne s'abonnent qu'à ce dont ils ont besoin.
  4. Minuscules, pas d'espaces, pas de barre oblique initiale. home/kitchen/temp et Home/Kitchen/Temp sont deux topics différents ; une / initiale crée un premier niveau vide.
  5. Des identifiants qui résistent aux changements. Utilisez des étiquettes d'actif ou des numéros de série, pas des libellés humains qui seront renommés.
  6. Concevoir pour les abonnements, pas pour l'éditeur. Notez les requêtes wildcard que les consommateurs exécuteront avant de figer l'arborescence.

Le raisonnement détaillé est présenté dans les conventions de nommage des topics MQTT. Ici, nous nous concentrons sur des arborescences concrètes.

Exemple de hiérarchie de topics pour une maison connectée

Une maison a une structure naturelle : les pièces contiennent des appareils, et les appareils exposent un état et acceptent des commandes.

home/<room>/<device>/state         # état courant, retenu
home/<room>/<device>/set           # commande envoyée à l'appareil
home/<room>/<device>/availability  # online/offline (Last Will)
home/<room>/<sensor>/<measurement> # mesures numériques

home/livingroom/lamp/state          -> {"on": true, "brightness": 70}
home/livingroom/lamp/set            -> {"on": false}
home/kitchen/climate/temperature    -> 21.4
home/kitchen/climate/humidity       -> 48
home/garage/door/state              -> "closed"
home/garage/door/availability       -> "online"
Besoin du consommateur Abonnement
Tout ce qui concerne la cuisine home/kitchen/#
L'état de chaque appareil home/+/+/state
Chaque mesure de température home/+/+/temperature
Les appareils hors ligne home/+/+/availability

Publiez state et availability sous forme de retained messages, afin qu'un tableau de bord lancé plus tard connaisse immédiatement la situation actuelle. Les commandes ne doivent pas être retenues, sinon un appareil qui redémarre rejouera le « ouvre la porte du garage » de la veille. Pour un traitement plus approfondi des pièces, des intégrations et de la découverte Home Assistant, consultez le guide sur la structure des topics MQTT pour la maison connectée. Jeedom et Domoticz savent aussi communiquer en MQTT : une arborescence propre sert donc toute la maison connectée, quelle que soit la box domotique.

Exemple de hiérarchie de topics pour une flotte de véhicules

Les données de flotte s'organisent autour des véhicules, et les consommateurs veulent généralement soit la vue complète d'un véhicule, soit un type de données sur toute la flotte.

fleet/<region>/<vehicleId>/telemetry/<stream>
fleet/<region>/<vehicleId>/events/<eventType>
fleet/<region>/<vehicleId>/cmd/<command>
fleet/<region>/<vehicleId>/status

fleet/eu-west/van-0142/telemetry/gps      -> {"lat": 51.51, "lon": -0.12, "spd": 34}
fleet/eu-west/van-0142/telemetry/engine   -> {"rpm": 1800, "coolant": 88}
fleet/eu-west/van-0142/events/harsh-brake -> {"ts": 1792130400, "g": 0.52}
fleet/eu-west/van-0142/cmd/locate         -> {}
fleet/eu-west/van-0142/status             -> "online"
Besoin du consommateur Abonnement
Carte en direct de tous les véhicules fleet/+/+/telemetry/gps
Tout ce qui provient d'une camionnette fleet/+/van-0142/#
Événements de conduite dans une région fleet/eu-west/+/events/#

Les décisions à reprendre :

  • La région avant le véhicule. Cela permet de répartir ultérieurement le traitement par région, par exemple avec des abonnements partagés par groupe de workers régional.
  • Des flux plutôt qu'un payload géant. Le GPS à une seconde d'intervalle et les données moteur toutes les trente secondes ne doivent pas être forcés dans le même message.
  • Des commandes par véhicule. Chaque véhicule s'abonne à fleet/<region>/<its id>/cmd/# et à rien d'autre.

Exemple de hiérarchie de topics pour une usine

Dans l'industrie, la hiérarchie des équipements existe déjà dans la documentation de l'usine : l'arborescence doit la refléter. Une version simplifiée :

<site>/<area>/<line>/<machine>/<namespace>/<detail>

plant1/assembly/line1/robot2/telemetry/joint-temps
plant1/assembly/line1/robot2/state
plant1/assembly/line1/robot2/alarms/overtemp
plant1/machining/line3/cnc1/telemetry/spindle
plant1/machining/line3/cnc1/cmd/stop
Besoin du consommateur Abonnement
Service TRS (OEE) pour une ligne plant1/machining/line3/+/state
Vue maintenance de toutes les alarmes plant1/+/+/+/alarms/#
Historian pour l'ensemble du site plant1/#

Gardez un vocabulaire d'espaces de noms restreint et fixe : telemetry, state, alarms, events, cmd. Lorsqu'un intégrateur invente data, values et measurements pour désigner la même chose, chaque consommateur doit apprendre trois motifs.

Exemple de hiérarchie de topics pour la supervision énergétique

Les projets énergétiques mélangent compteurs, onduleurs et batteries répartis sur plusieurs bâtiments. L'arborescence sépare l'emplacement physique de la grandeur énergétique mesurée.

energy/<site>/<building>/<meterId>/<quantity>

energy/campus-a/building-3/main-meter/power       -> 42.7   (kW)
energy/campus-a/building-3/main-meter/energy      -> 18233.4 (kWh)
energy/campus-a/building-3/pv-inverter-1/power    -> 12.1
energy/campus-a/building-3/battery-1/soc          -> 76
energy/campus-a/building-3/battery-1/cmd/mode     -> "discharge"

Indiquez les unités dans la documentation ou dans le payload, jamais dans le topic lui-même. Un topic comme .../power_kw devient faux le jour où quelqu'un publie des watts. Un payload JSON tel que {"v": 42.7, "unit": "kW", "ts": 1792130400} garde le topic stable et la mesure autodescriptive.

Pour finir : une arborescence de style ISA-95

Lorsqu'un projet dépasse un seul site ou commence à alimenter un Unified Namespace, il converge généralement vers une arborescence de style ISA-95 : entreprise, site, zone, ligne, cellule ou machine, puis un espace de noms de données. C'est aussi la forme qu'utilise ConnectMQ lorsqu'il republie des données Sparkplug B sous forme de topics lisibles. Un message Sparkplug sur

spBv1.0/factory1/DDATA/line1/cnc1

est décodé et republié sur

connectmq/factory1/production/line1/cnc1/telemetry

Ce qui donne un exemple complet de la structure cible :

<enterprise>/<site>/<area>/<line>/<machine>/<namespace>

connectmq/factory1/production/line1/cnc1/telemetry
connectmq/factory1/production/line1/cnc1/state
connectmq/factory1/production/line2/press4/telemetry
connectmq/factory1/quality/lab/cmm1/events

Le portail ConnectMQ reconnaît les topics ISA-95 et Unified Namespace et affiche les appareils regroupés selon ces niveaux : une arborescence rigoureuse porte donc directement ses fruits dans la vue des appareils. L'article sur les topics MQTT ISA-95 explique chaque niveau et ses pièges, et le guide Sparkplug B et Unified Namespace montre comment les deux s'articulent.

Comparaison des quatre arborescences

Projet Niveau supérieur Niveau d'identité Données réparties par Profondeur type
Maison connectée home appareil dans une pièce state / set / mesure 4
Flotte fleet véhicule dans une région telemetry / events / cmd 4–5
Usine site machine sur une ligne espace de noms 5–6
Énergie energy compteur dans un bâtiment grandeur 5

La profondeur compte sur les brokers réels. Certains brokers limitent le nombre de niveaux de topic, et chaque niveau supplémentaire coûte des octets dans chaque message. Le serveur MQTT public gratuit broker.connectmq.com, par exemple, autorise jusqu'à 8 niveaux de topic : un préfixe de démonstration comme connectmq/demo/<id> laisse donc cinq niveaux pour votre propre arborescence.

Tester une arborescence sur le broker public

Vous pouvez prototyper n'importe laquelle de ces hiérarchies sur le serveur MQTT public gratuit avant de vous engager. Utilisez un préfixe unique, car l'espace public est lisible par tous, et gardez des données non sensibles.

# Abonné : tous les états d'appareils de votre maison de démonstration
mosquitto_sub -h broker.connectmq.com -p 1883 -i tree-sub-a91c \
  -t 'connectmq/demo/a91c/home/+/+/state' -v

# Éditeur : un état de lampe retenu
mosquitto_pub -h broker.connectmq.com -p 1883 -i tree-pub-a91c -r \
  -t 'connectmq/demo/a91c/home/livingroom/lamp/state' \
  -m '{"on": true, "brightness": 70}'

Cet exemple utilise sept niveaux, ce qui respecte la limite du broker public. Si l'abonné voit l'état de la lampe, votre plan de wildcards fonctionne. Essayez ensuite connectmq/demo/a91c/home/livingroom/# et vérifiez qu'il ne renvoie que le salon. Si l'arborescence est nouvelle pour vous, le guide des wildcards MQTT explique précisément comment + et # correspondent à chaque niveau, et le tutoriel MQTT couvre les bases du publish/subscribe.

Erreurs courantes dans les hiérarchies de topics

  • Placer le type de données en premier. temperature/kitchen disperse chaque appareil sur de nombreuses branches et complique les abonnements par appareil.
  • Encoder des valeurs dans les topics. Avoir home/lamp/on et home/lamp/off comme topics oblige les consommateurs à s'abonner aux deux ; publiez la valeur dans le payload.
  • Un topic par identifiant de message ou par horodatage. Les topics sont des adresses, pas des enregistrements. Des topics uniques par message gonflent le stockage des retained messages et les listes de topics.
  • Des séparateurs mélangés. line-1, line_1 et Line1 dans la même arborescence finiront par casser le wildcard de quelqu'un. Choisissez un seul style.
  • Pas de branche de commandes. Si les commandes partagent un topic avec la télémétrie, les appareils reçoivent leurs propres données en retour et doivent filtrer davantage.

Démarrer avec ConnectMQ

Lorsque votre arborescence est prête pour de vrais appareils, exécutez-la sur un broker MQTT cloud avec TLS et des identifiants privés, par exemple un broker MQTT managé comme ConnectMQ. Créez un broker Serverless gratuit sur app.connectmq.com, sans carte bancaire, et regardez votre hiérarchie se remplir grâce à l'explorateur de topics en direct et à la vue des appareils ISA-95.

Questions fréquentes

Quelle profondeur doit avoir une hiérarchie de topics MQTT ?

Suffisamment pour identifier la source et le type de données, généralement quatre à six niveaux. Des niveaux supplémentaires ajoutent des octets à chaque message et peuvent atteindre les limites du broker sans apporter de structure utile.

Faut-il placer l'ID de l'appareil ou le type de données en premier ?

Placez d'abord l'emplacement et l'identité de l'appareil, puis le type de données. Ainsi, toutes les données d'un appareil restent sous une même branche, tout en permettant aux wildcards + de sélectionner un type de données sur l'ensemble des appareils.

Puis-je modifier ma hiérarchie de topics plus tard ?

Oui, mais chaque éditeur et chaque abonné doit évoluer avec elle. Une stratégie de migration courante consiste à publier à la fois sur l'ancienne et la nouvelle arborescence pendant une période de transition, puis à retirer l'ancienne une fois les consommateurs migrés.

Ai-je besoin d'ISA-95 pour un petit projet ?

Non. Une arborescence simple comme celle de l'exemple de maison connectée convient parfaitement aux petits projets. Les arborescences de style ISA-95 deviennent rentables dès que plusieurs sites, équipes ou systèmes partagent un même espace de noms.

Articles liés

Qui a inventé MQTT ? L'histoire, des oléoducs à l'IoT

MQTT a été inventé en 1999 par Andy Stanford-Clark (IBM) et Arlen Nipper (Arcom) pour surveiller des oléoducs par satellite. Suivez son parcours vers l'open source, OASIS, l'ISO et les brokers MQTT managés d'aujourd'hui.

8 min de lecture

Pourquoi votre client MQTT se déconnecte sans cesse (et comment y remédier)

Les boucles de reconnexion sont l'un des problèmes MQTT les plus courants. Découvrez les cinq causes habituelles, des client ID en double aux timeouts de keep alive et aux paquets trop volumineux, et suivez une méthode de diagnostic qui identifie la vôtre.

9 min de lecture

Taille maximale d'un message MQTT : limites et stratégies pour les gros payloads

MQTT peut techniquement transporter un paquet de 256 Mo, mais les brokers, les bibliothèques clientes et les appareils imposent des limites bien plus basses. Découvrez où se trouvent les vraies limites, ce qui se passe quand on les dépasse et comment envoyer de gros payloads.

8 min de lecture

Tous les articles →

Votre broker MQTT privé, à quelques clics

Créez un compte, récupérez les identifiants de votre broker et connectez votre premier appareil — aucun serveur à installer, mettre à jour ou dimensionner.