Sur cette page

Qt MQTT Vue d'ensemble

Qt MQTT MQTT vous permet de créer des applications et des appareils qui peuvent communiquer via le protocole de transport de télémétrie MQ (MQTT). Il est entièrement conforme à la spécification du protocole MQTT.

Publier et s'abonner

MQTT est un protocole de connectivité de machine à machine qui fonctionne selon le modèle de publication et d'abonnement. Un client MQTT est un programme ou un appareil qui utilise MQTT pour créer une connexion réseau avec un serveur MQTT, également appelé courtier. Une fois la connexion établie, le client peut envoyer des messages au courtier. Les autres clients peuvent s'abonner à des notifications sur des sujets particuliers envoyées par le client.

Courtier distribuant les messages du client 1 au client 2 (sujet A) et au client 3 (sujets A et B)

Par exemple, si le client 2 s'abonne aux messages sur le sujet A, il reçoit une notification lorsque le client 1 envoie un message sur ce sujet. Si le client 3 s'abonne au sujet A et au sujet B, il reçoit des notifications concernant les messages sur ces deux sujets.

Qt MQTT est une solution client qui n'inclut pas de courtier. Elle est particulièrement adaptée au développement d'applications de télémétrie pour les appareils embarqués. Cependant, Qt MQTT n'a pas de dépendances externes, et les clients mis en œuvre peuvent donc être exécutés sur toutes les plates-formes Qt prises en charge.

Sujets

Les sujets sont stockés dans une structure arborescente hiérarchique. La norme ne précise pas comment l'arbre doit être conçu et ne fournit pas non plus d'ensembles hiérarchiques prédéfinis. Vous pouvez librement concevoir la hiérarchie en fonction des besoins de votre projet. Voici un exemple de hiérarchie de thèmes, où actif signifie tous les capteurs actifs, tandis que maison et garage sont des capteurs individuels :

sensors/active
sensors/house/temperature
sensors/house/bedroom/light
sensors/house/livingroom/light
sensors/garage/temperature
sensors/garage/light

Abonnement aux rubriques à l'aide de caractères génériques

Lorsque les clients s'abonnent à des rubriques, ils peuvent utiliser le signe dièse (#) et le signe plus (+) comme caractères génériques. Le signe dièse indique que le client souhaite recevoir des notifications pour tous les messages relatifs à un thème et à ses sous-thèmes. Par exemple, si un client s'abonne à sensors/house/#, il reçoit tous les messages relatifs au capteur de la maison.

Le signe plus indique qu'une branche de l'arbre peut être ignorée lors de la recherche d'un sous-sujet correspondant. Par exemple, si un client s'abonne à sensors/+/temperature, il reçoit les messages relatifs à la température, quel que soit le capteur qui les a envoyés. Vous pouvez utiliser plusieurs signes plus pour sauter plusieurs branches. Par exemple, house/+/+/temperature peut être utilisé pour recevoir des messages sur la température de toutes les pièces de tous les appartements d'une maison.

Abonnements partagés

Lesabonnements partagés décrivent un groupe d'abonnés à un filtre thématique. Au lieu que tous les abonnés reçoivent un message, seul un abonné le reçoit. Cela permet d'équilibrer la charge sur plusieurs clients. Le format d'un abonnement partagé est le suivant :

$share/{sharename}/{topicfilter}

Par exemple, si le client 1 et le client 2 doivent partager un abonnement au thème capteurs/maison/température, le filtre thématique auquel s'abonner est le suivant :

$share/poolAB/sensors/house/temperature

L'ordre dans lequel les messages sont distribués par le serveur n'est pas défini. Il s'agit d'une option spécifique au serveur.

Pour savoir si un serveur prend en charge les abonnements partagés, voir également QMqttServerConnectionProperties::sharedSubscriptionSupported().

Alias des sujets

La structuration des rubriques en arbre permet de séparer les canaux de données et de fournir un ordre logique des informations. Cependant, cela peut conduire à l'utilisation de noms de sujets très longs lors de la publication de messages, ce qui augmente la taille de chaque message.

La version 5.0 du protocole MQTT a introduit des alias de sujet pour contourner ce problème. Au lieu de la chaîne du sujet, une valeur entière est envoyée. Pour créer une première correspondance entre le client et le serveur, la chaîne du sujet et l'alias doivent tous deux faire partie d'un message. Par la suite, seul l'ID avec un sujet vide est utilisé.

Cette correspondance peut être modifiée à tout moment en utilisant un alias de sujet avec une autre chaîne de sujet. Notez que cette correspondance ne s'applique pas nécessairement à d'autres connexions, telles que les connexions du serveur à d'autres clients. Chaque connexion doit créer cette correspondance manuellement.

Qt MQTT L'application de la méthode de l'interface homme-machine fournit un mécanisme automatisé permettant de réduire les débits de données. Après la création d'une connexion par QMqttClient, les informations sur les alias de rubrique pris en charge par le serveur sont stockées. Par la suite, les alias sont utilisés dans l'ordre de publication des messages, jusqu'à ce que tous les alias disponibles soient utilisés. Un utilisateur peut toujours modifier cette correspondance en utilisant QMqttPublishProperties::setTopicAlias() pendant la publication.

Lorsque QMqttClient s'abonne à un sujet, le serveur peut également utiliser des alias de sujet, en fonction de la valeur QMqttConnectionProperties::maximumTopicAlias() définie par le client. Le client met automatiquement en correspondance les alias de sujet et transmet de manière transparente les messages à l'utilisateur en incluant la chaîne complète du sujet.

Sécurité

Les connexions entre les clients et le courtier sont sécurisées par un système d'authentification intégré qui utilise des noms d'utilisateur et des mots de passe. Les messages sont cryptés en utilisant SSL/TLS au niveau de la couche de transport. Le numéro de port standardisé pour les messages MQTT cryptés est 8883.

Qualité de service

Les niveaux de qualité de service (QoS) suivants sont définis pour les messages :

  • Au plus une fois (0) signifie que les messages sont livrés au mieux des possibilités de l'environnement d'exploitation, et qu'une perte de message peut donc se produire. Ce niveau pourrait être utilisé, par exemple, avec des données de capteurs ambiants, où il importe peu qu'un relevé individuel soit perdu puisque le suivant sera publié peu de temps après.
  • Au moins une fois (1) signifie que les messages sont assurés d'arriver, mais qu'il peut y avoir des doublons.
  • Exactement une fois (2) signifie que les messages sont assurés d'arriver exactement une fois. Ce niveau pourrait être utilisé, par exemple, avec les systèmes de facturation où les messages en double ou perdus pourraient entraîner l'application de frais incorrects.

Messages testamentaires

Un message testamentaire est un message envoyé par un client et stocké chez le courtier. Si la connexion entre le client et le courtier est interrompue de manière inattendue, le message testamentaire sera transmis à tout abonné du sujet testamentaire.

Les messages testamentaires doivent être spécifiés au stade de la connexion. Il est donc obligatoire de les définir avant d'invoquer QMqttClient::connectToHost() ou QMqttClient::connectToHostEncrypted(). Un message Will possède toutes les propriétés d'un message ordinaire, ainsi qu'un sujet Will, un niveau de qualité de service, un indicateur de conservation et une charge utile de message.

Si le client se déconnecte du courtier de manière régulière en appelant QMqttClient::disconnectFromHost(), le courtier rejettera le message Will. Le cas échéant, le client est responsable de l'envoi de tous les messages nécessaires avant de se déconnecter.

Messages conservés

Les messages conservés sont stockés du côté du courtier. Lorsque de futurs clients se connecteront, ils recevront ces messages. Un cas d'utilisation typique consiste à stocker l'état de santé actuel de l'éditeur dans un message conservé. Les abonnés recevront instantanément un message sur l'état de l'éditeur.

Un courtier ne peut stocker que le dernier message conservé envoyé pour un sujet donné. Si un client publie un message retenu avec un niveau de qualité de service de zéro, tout message précédemment retenu pour son sujet par le courtier doit être supprimé. Le courtier doit stocker le dernier message, mais il peut aussi l'écarter. Cela dépend de l'implémentation du courtier.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.