Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
MQTT
Le MQTT
AWS IoT Core prend en charge les connexions de périphériques qui utilisent le protocole MQTT et le protocole MQTT over WSS et qui sont identifiées par un identifiant client. Les AWS IoT SDK pour appareils prennent en charge les deux protocoles et sont les méthodes recommandées pour connecter les appareils AWS IoT Core. Les SDK pour AWS IoT appareils prennent en charge les fonctions nécessaires aux appareils et aux clients pour se connecter aux AWS IoT services et y accéder. Les SDK pour appareils prennent en charge les protocoles d'authentification requis par les AWS IoT services et les exigences d'identification de connexion requises par le protocole MQTT et les protocoles MQTT over WSS. Pour plus d'informations sur la façon de se connecter à AWS IoT l'aide des SDK du AWS périphérique et pour obtenir des liens vers des exemples de AWS IoT langues prises en charge, consultezConnexion à MQTT à l'aide du AWS IoT SDK pour appareils. Pour plus d’informations sur les méthodes d’authentification et de mappage de ports pour les messages MQTT, consultez Protocols, port mappings, and authentication (Protocoles, mappages de ports et authentification).
Bien que nous vous recommandions d'utiliser les SDK de l' AWS IoT appareil pour vous y connecter AWS IoT, ils ne sont pas obligatoires. Si vous n'utilisez pas les SDK de l' AWS IoT appareil, vous devez toutefois fournir la sécurité de connexion et de communication nécessaire. Les clients doivent envoyer l’extension TLS SNI (Server Name Indication)
Une fois que vos clients sont connectés, vous pouvez surveiller et gérer leurs connexions client MQTT à l'aide de la console ou des API. Pour de plus amples informations, veuillez consulter Gestion des connexions MQTT.
Dans cette rubrique :
Connexion à MQTT à l'aide du AWS IoT SDK pour appareils
Cette section contient des liens vers les SDK du AWS IoT périphérique et vers le code source d'exemples de programmes illustrant comment connecter un appareil à AWS IoT. Les exemples d'applications liés ici montrent comment se connecter à AWS IoT l'aide du protocole MQTT et de MQTT via WSS.
Note
Les SDK du AWS IoT périphérique ont publié un client MQTT 5.
Options de qualité de service (QoS) MQTT
AWS IoT et les SDK pour AWS IoT appareils prennent en charge les niveaux de qualité de service (QoS) MQTT0 1 Le protocole MQTT définit un troisième niveau de QoS, le 2 niveau, AWS IoT mais ne le supporte pas. Seul le protocole MQTT prend en charge la fonctionnalité QoS. HTTPS prend en charge la QoS en transmettant un paramètre de chaîne de requête ?qos=qos dont la valeur peut être 0 ou 1.
Ce tableau décrit comment chaque niveau de QoS affecte les messages publiés par et vers l’agent de messages.
|
Avec un niveau de QoS de... |
Le message est… |
Commentaires |
|---|---|---|
|
QoS niveau 0 |
Envoyé zéro fois ou plus |
Ce niveau doit être utilisé pour les messages envoyés via des liens de communication fiables ou qui peuvent être manqués sans problème. |
|
QoS niveau 1 |
Envoyé au moins une fois, puis à plusieurs reprises jusqu’à ce qu’une réponse |
Le message n’est pas considéré comme complet tant que l’expéditeur n’a pas reçu de réponse |
Sessions permanentes MQTT
Les sessions permanentes stockent les abonnements et les messages d’un client, avec une qualité de service (QoS) de 1, qui n’ont pas été reconnus par le client. Lorsque l’appareil se reconnecte à une session permanente, la session reprend, les abonnements sont rétablis et les messages d’abonnement reçus et stockés sans accusé de réception avant la reconnexion sont envoyés au client.
Le traitement des messages stockés est enregistré dans CloudWatch les métriques et les CloudWatch journaux. Pour plus d'informations sur les entrées écrites dans CloudWatch et les CloudWatch journaux, reportez-vous aux Métriques d'agent de messages sections etEntrée de journal en file d'attente.
Création d’une session permanente
Dans MQTT 3, vous créez une session permanente MQTT en envoyant un message CONNECT et en définissant l’indicateur cleanSession sur 0. Si aucune session n’existe pour le client qui envoie le message CONNECT, une nouvelle session permanente est créée. Si une session existe déjà pour le client, celui-ci la reprend. Pour créer une session propre, vous envoyez un message CONNECT et vous définissez l’indicateur cleanSession sur 1, et l’agent ne stockera aucun état de session lorsque le client se déconnecte.
Dans MQTT 5, vous gérez les sessions permanentes en définissant l’indicateur Clean Start et Session Expiry Interval. Le démarrage propre contrôle le début de la session de connexion et la fin de la session précédente. Lorsque vous définissez Clean
Start =1, une nouvelle session est créée et une session précédente est interrompue si elle existe. Lorsque vous définissez Clean Start =0, la session de connexion reprend une session précédente si elle existe. L’intervalle d’expiration de session contrôle la fin de la session de connexion. L’intervalle d’expiration de session indique le temps, en secondes (entier de 4 octets), pendant lequel une session persistera après la déconnexion. Le paramètre Session Expiry interval = 0 entraîne la fin de la session immédiatement après la déconnexion. Si l’intervalle d’expiration de session n’est pas spécifié dans le message CONNECT, la valeur par défaut est 0.
| Valeur de la propriété | Description |
|---|---|
Clean Start= 1 |
Crée une nouvelle session et met fin à une session précédente s’il en existe une. |
Clean Start= 0 |
Reprend une session s’il en existe une précédente. |
Session Expiry Interval> 0 |
Maintient une session. |
Session Expiry interval= 0 |
Ne fait pas perdurer une session. |
Dans MQTT 5, si vous définissez Clean Start = 1 et Session
Expiry Interval =0, cela équivaut à une session propre de MQTT 3. Si vous définissez Clean Start = 0 et Session Expiry Interval >0, cela équivaut à une session permanente MQTT 3.
Note
Les sessions permanentes de plusieurs versions MQTT (MQTT 3 et MQTT 5) ne sont pas prises en charge. Une session permanente MQTT 3 ne peut pas être reprise en tant que session MQTT 5, et vice versa.
Opérations au cours d’une session permanente
Les clients utilisent l’attribut sessionPresent dans le message de connexion reconnue (CONNACK), afin de déterminer si une session permanente est présente. Si sessionPresent est 1, une session permanente est présente et tous les messages stockés pour le client sont remis au client une fois que celui-ci a reçu CONNACK, comme décrit dans Trafic de messages après reconnexion à une session permanente. Si sessionPresent est 1, le client n’a pas besoin de se réabonner. Toutefois, si sessionPresent est défini sur 0, aucune session permanente n’est présente et le client doit se réabonner à ses filtres de rubrique.
Une fois que le client rejoint la session permanente, il peut publier des messages et à s’abonner aux filtres de rubrique sans aucun indicateur supplémentaire sur chaque opération.
Trafic de messages après reconnexion à une session permanente
Une session permanente représente une connexion continue entre un client et un agent de messages MQTT. Lorsqu’un client se connecte à l’agent de messages à l’aide d’une session permanente, ce dernier enregistre tous les abonnements souscrits par le client pendant la connexion. Lorsque le client se déconnecte, le courtier de messages conserve les messages d'une QoS 1 et les nouveaux messages d'une QoS 1 publiés sur les rubriques auxquelles le client s'est abonné. Les messages sont stockés conformément à la limite du compte. Les messages dépassant cette limite seront supprimés. Pour plus d’informations sur les limites de messages permanents, veuilelz consulter AWS IoT Core quotas de point de terminaison. Lorsque le client se reconnecte à sa session permanente, tous les abonnements sont réactivés et tous les messages stockés sont envoyés au client à un rythme maximum de 10 messages par seconde. Dans MQTT 5, si un QoS 1 sortant avec l'intervalle d'expiration des messages expire lorsqu'un client est hors ligne, une fois la connexion rétablie, le client ne recevra pas le message expiré.
Après la reconnexion, les messages stockés sont envoyés au client, à un débit limité à 10 messages stockés par seconde, ainsi que tout le trafic de messages en cours jusqu’à ce que la limite Publish
requests per second per connection soit atteinte. Le taux de livraison des messages stockés étant limité, la remise de tous les messages stockés prendra plusieurs secondes si une session comporte plus de 10 messages stockés à remettre après la reconnexion.
Pour les abonnés partagés, les messages seront mis en file d'attente si au moins un abonné d'un groupe utilise une session permanente et qu'aucun abonné n'est en ligne pour recevoir le message QoS 1. La mise en file d'attente des messages s'effectue à une vitesse maximale de 20 messages par seconde par abonné actif dans un groupe. Pour plus d'informations, consultez la section Mise en file d'attente des messages relatifs aux abonnements partagés.
Fin d’une session permanente
Les sessions permanentes peuvent prendre fin de différentes manières :
-
Le délai d’expiration de la session permanente est expiré. Le délai d’expiration de session permanente démarre lorsque l’agent de messages détecte qu’un client s’est déconnecté, soit en raison de la déconnexion du client, soit en raison de l’expiration du délai de connexion.
-
Le client envoie un message
CONNECTqui définit l’indicateurcleanSessionsur1. -
Vous déconnectez manuellement le client et effacez la session à l'aide de la console ou de
DeleteConnectionl'API. Pour de plus amples informations, veuillez consulter Gestion des connexions MQTT.
Dans MQTT 3, la valeur par défaut du délai d’expiration des sessions permanentes est d’une heure, et cela s’applique à toutes les sessions du compte.
Dans MQTT 5, vous pouvez définir l’intervalle d’expiration de session pour chaque session sur les paquets CONNECT et DISCONNECT.
Pour l’intervalle d’expiration de session sur le paquet DISCONNECT :
-
Si la session en cours a un intervalle d’expiration de session de 0, vous ne pouvez pas définir un intervalle d’expiration de session supérieur à 0 sur le paquet DISCONNECT.
-
Si la session en cours a un intervalle d’expiration de session supérieur à 0 et que vous définissez l’intervalle d’expiration de session sur 0 sur le paquet DISCONNECT, la session sera terminée sur DISCONNECT.
-
Sinon, l’intervalle d’expiration de session sur le paquet DISCONNECT mettra à jour l’intervalle d’expiration de session de la session en cours.
Note
Les messages stockés en attente d’être envoyés au client à la fin d’une session sont supprimés ; cependant, ils sont toujours facturés au tarif de messagerie standard, même s’ils n’ont pas pu être envoyés. Pour plus d’informations sur la tarification des messages, consultez AWS IoT Core
Tarification
Reconnexion après expiration d’une session permanente
Si un client ne se reconnecte pas à sa session permanente avant son expiration, celle-ci se termine et les messages enregistrés sont supprimés. Lorsqu’un client se reconnecte après l’expiration de la session et définit un indicateur cleanSession sur 0, le service crée une nouvelle session persistante. Les abonnements ou messages de la session précédente ne sont pas disponibles pour cette session car ils ont été supprimés à l’expiration de la session précédente.
Frais liés aux messages de session persistants
Les messages vous sont facturés Compte AWS lorsque le courtier de messages envoie un message à un client ou lors d'une session permanente hors ligne. Lorsqu’un appareil hors ligne doté d’une session permanente se reconnecte et reprend sa session, les messages enregistrés sont transmis à l’appareil et débités de nouveau sur votre compte. Pour plus d’informations sur la tarification des messages, consultez la section AWS IoT Core Tarification - Messagerie
Le délai d’expiration des sessions permanentes par défaut d’une heure peut être augmenté en utilisant le processus d’augmentation de limite standard. Notez que l’augmentation du délai d’expiration de la session peut augmenter le coût de vos messages, car ce délai supplémentaire pourrait permettre de stocker davantage de messages sur l’appareil hors ligne et ces messages supplémentaires seraient débités de votre compte au tarif de messagerie standard. L’heure d’expiration de la session est approximative et une session peut persister jusqu’à 30 minutes de plus que la limite du compte ; toutefois, une session ne sera pas inférieure à la limite du compte. Pour de plus amples informations sur les limites de sessions, veuillez consulter AWS Service Quotas.
MQTT a retenu les messages
AWS IoT Core supporte le RETAIN drapeau décrit dans le protocole MQTT. Lorsqu'un client place l'RETAINindicateur sur un message MQTT qu'il publie, il AWS IoT Core enregistre le message. Il peut ensuite être envoyé aux nouveaux abonnés, récupéré en appelant l’opération GetRetainedMessage et visualisé dans la AWS IoT console
Exemples d’utilisation de messages retenus au format MQTT
-
En tant que message de configuration initiale
Les messages retenus au format MQTT sont envoyés à un client une fois que celui-ci s’est abonné à une rubrique. Si vous souhaitez que tous les clients abonnés à un sujet reçoivent le message MQTT conservé juste après leur inscription, vous pouvez publier un message de configuration avec l'
RETAINindicateur défini. Les clients abonnés reçoivent également des mises à jour de cette configuration chaque fois qu’un nouveau message de configuration est publié. -
En tant que dernier message d’état connu
Les appareils peuvent placer l'
RETAINindicateur sur les messages d'état actuel afin de AWS IoT Core les enregistrer. Lorsque les applications se connectent ou se reconnectent, elles peuvent s'abonner à cette rubrique et obtenir le dernier état signalé juste après s'être abonnées à la rubrique de message conservée. De cette façon, ils peuvent éviter d’avoir à attendre le prochain message de l’appareil pour voir l’état actuel.
Dans cette section :
Tâches courantes avec des messages conservés au format MQTT dans AWS IoT Core
AWS IoT Core enregistre les messages MQTT avec le RETAIN drapeau défini. Ces messages retenus sont envoyés à tous les clients abonnés au sujet, sous la forme d’un message MQTT normal, et ils sont également stockés pour être envoyés aux nouveaux abonnés à la rubrique.
Les messages retenus au format MQTT nécessitent des actions politiques spécifiques pour autoriser les clients à y accéder. Pour des exemples d’utilisation des politiques relatives aux messages retenus, consultez Exemples de stratégies de messages conservés.
Cette section décrit les opérations courantes impliquant les messages retenus.
-
Création d’un message retenu
Le client détermine si un message est retenu lorsqu’il publie un message MQTT. Les clients peuvent définir l'
RETAINindicateur lorsqu'ils publient un message à l'aide d'un SDK pour appareils. Les applications et les services peuvent définir l'RETAINindicateur lorsqu'ils utilisent l'Publishaction pour publier un message MQTT.Un seul message par nom de rubrique est retenu. Un nouveau message dont l’indicateur RETAIN est défini et publié dans une rubrique remplace tout message retenu existant qui a été envoyé au sujet précédemment.
Note
Vous ne pouvez pas publier dans un sujet réservé lorsque le
RETAINdrapeau est activé. -
Abonnement à un sujet de message retenu
Les clients s’abonnent aux rubriques de message retenus comme ils le feraient pour n’importe quel autre rubrique de message MQTT. L'
RETAINindicateur est activé pour les messages conservés reçus en vous abonnant à un sujet de message conservé.Les messages conservés sont supprimés AWS IoT Core lorsqu'un client publie un message conservé avec une charge utile de 0 octet dans le sujet du message conservé. Les clients qui se sont abonnés à la rubrique du message retenu recevront également le message de 0 octet.
L'abonnement à un filtre de sujet générique qui inclut un sujet de message conservé permet au client de recevoir les messages suivants sur ce sujet. Toutefois, le message conservé n'est pas remis au moment de l'abonnement.
Note
Pour recevoir un message conservé lors de l'abonnement, le filtre de sujet de la demande d'abonnement doit correspondre exactement au sujet du message conservé.
L'
RETAINindicateur est activé pour les messages conservés reçus lors de l'abonnement à un sujet de message conservé. Les messages retenus qui sont reçus par un client abonné après son abonnement ne le sont pas. -
Récupération d’un message retenu
Les messages retenus sont remis automatiquement aux clients lorsqu’ils s’abonnent à la rubrique contenant le message retenu. Pour qu’un client reçoive le message retenu lors de son abonnement, il doit s’abonner au nom exact de rubrique du message retenu. L’abonnement à un filtre de rubrique générique qui inclut une rubrique de message retenu permet au client de recevoir les messages suivants publiés dans la rubrique du message retenu, mais il ne transmet pas le message retenu lors de l’abonnement.
Les services et applications peuvent répertorier et récupérer les messages retenus en appelant
ListRetainedMessagesetGetRetainedMessage.Aucun client n'est empêché de publier des messages dans un sujet de message conservé sans définir l'
RETAINindicateur. Cela peut entraîner des résultats inattendus, tels que le message retenu ne correspondant pas au message reçu en vous abonnant à la rubrique.Avec MQTT 5, si l’intervalle d’expiration d’un message retenu est défini et que le message retenu expire, un nouvel abonné qui s’abonne à cette rubrique ne recevra pas le message retenu une fois son abonnement réussi.
-
Répertorier les sujets des messages retenus
Vous pouvez répertorier les messages retenus en appelant
ListRetainedMessageset les messages retenus peuvent être consultés dans la AWS IoT console. -
Obtenir les détails des messages retenus
Vous pouvez obtenir les détails des messages retenus en appelant
GetRetainedMessageet ils peuvent être consultés dans la AWS IoT console. -
Retenir un message volontaire
Les messages MQTT Will
créés lorsqu’un appareil se connecte peuvent être retenus en définissant l’indicateur Will Retaindans le champConnect Flag bits. -
Supprimer un message retenu
Les appareils, les applications et les services peuvent supprimer un message conservé en publiant un message avec l'
RETAINindicateur défini et une charge utile de message vide (0 octet) dans le nom du sujet du message conservé à supprimer. Ces messages suppriment le message conservé de AWS IoT Core, sont envoyés aux clients abonnés au sujet, mais ils ne sont pas conservés par AWS IoT Core.Les messages retenus peuvent également être supprimés de manière interactive en accédant au message retenu dans la AWS IoT console.
Les messages retenus supprimés à l’aide de la AWS IoT console envoient également un message de 0 octet aux clients abonnés au sujet du message retenu. Les messages retenus ne peuvent pas être restaurés après leur suppression. Un client devra publier un nouveau message retenu pour remplacer le message supprimé.
-
Débogage et résolution des problèmes liés aux messages retenus
La AWS IoT console
fournit plusieurs outils pour vous aider à résoudre les problèmes liés aux messages retenus : -
Le Messages retenus
page La page Messages retenus de la console AWS IoT fournit une liste paginée des messages retenus qui ont été stockés par votre compte dans la région actuelle. À partir de cette page, vous pouvez :
-
Consultez les détails de chaque message retenu, tels que la charge utile du message, la QoS, l’heure à laquelle il a été reçu.
-
Mettez à jour le contenu d’un message retenu.
-
Supprimez un message retenu.
-
-
Le Client de test MQTT
La page du client de test MQTT de la console AWS IoT permet de s’abonner et de publier sur des sujets MQTT. L’option de publication vous permet de définir l’indicateur RETAIN sur les messages que vous publiez afin de simuler le comportement de vos appareils. Vous pouvez également utiliser le client de test MQTT pour surveiller les messages des clients connectés que vous gérez via l'interface de connexion client. Pour plus d'informations sur la gestion des connexions client, consultezGestion des connexions MQTT.
Certains résultats inattendus peuvent être le résultat de ces aspects de la manière dont les messages conservés sont implémentés dans AWS IoT Core.
-
Limit es de messages retenues
Lorsqu'un compte a stocké le nombre maximum de messages conservés, AWS IoT Core renvoie une réponse limitée aux messages publiés avec l'option RETAIN définie et à des charges utiles supérieures à 0 octet jusqu'à ce que certains messages conservés soient supprimés et que le nombre de messages conservés tombe en dessous de la limite.
-
Ordre de distribution des messages retenus
La séquence d’envoi des messages retenus et des messages souscrits n’est pas garantie.
-
Facturation et messages retenus
La publication de messages avec l'RETAINindicateur défini par un client, à l'aide de AWS IoT
la console ou par appel Publishentraîne des frais de messagerie supplémentaires décrits dans la section AWS IoT Core Tarification - Messagerie
La récupération des messages conservés par un client, en utilisant AWS IoT la console ou en appelant GetRetainedMessageentraîne des frais de messagerie en plus des frais d'utilisation habituels de l'API. Les frais supplémentaires sont décrits dans la section AWS IoT Core
Tarification - Messagerie
Les messages MQTT Will publiés
Pour plus d’informations sur les coûts de messagerie, consultez la section AWS IoT Core Tarification - Messagerie
Comparaison des messages MQTT retenus et des sessions permanentes MQTT
Les messages retenus et les sessions permanentes sont des fonctionnalités standard de MQTT qui permettent aux appareils de recevoir des messages publiés alors qu’ils étaient hors ligne. Les messages retenus peuvent être publiés à partir de sessions permanentes. Cette section décrit les principaux aspects de ces fonctionnalités et explique comment elles fonctionnent ensemble.
|
Messages retenus |
Sessions persistantes |
|
|---|---|---|
|
Fonctions principales |
Les messages retenus peuvent être utilisés pour configurer ou notifier de grands groupes d’appareils après leur connexion. Les messages retenus peuvent également être utilisés lorsque vous souhaitez que les appareils ne reçoivent que le dernier message publié dans une rubrique après une reconnexion. |
Les sessions permanentes sont utiles pour les appareils dotés d’une connectivité intermittente et susceptibles de manquer plusieurs messages importants. Les appareils peuvent se connecter à une session permanente pour recevoir les messages envoyés lorsqu’ils sont hors ligne. |
|
Exemples |
Les messages retenus peuvent fournir aux appareils des informations de configuration relatives à leur environnement lorsqu’ils se connectent. La configuration initiale peut inclure une liste d’autres rubriques de message auxquels il doit s’abonner ou des informations sur la façon dont il doit configurer son fuseau horaire local. |
Les appareils qui se connectent via un réseau cellulaire à connectivité intermittente peuvent utiliser des sessions permanentes pour éviter de manquer des messages importants envoyés alors qu’un appareil n’est pas couvert par le réseau ou doit éteindre sa radio cellulaire. |
|
Messages reçus lors de l’inscription initiale à une rubrique |
Une fois que vous vous êtes abonné à une rubrique contenant un message retenu, le message retenu le plus récent est reçu. |
Une fois que vous vous êtes abonné à une rubrique sans qu’un message soit retenu, aucun message n’est reçu tant qu’un message n’est pas publié dans la rubrique. |
|
Rubriques souscrites après reconnexion |
En l’absence de session permanente, le client doit s’abonner aux rubriques après s’être reconnecté. |
Les rubriques auxquelles vous êtes abonné sont restaurées après la reconnexion. |
|
Messages reçus après la reconnexion |
Une fois que vous vous êtes abonné à une rubrique contenant un message retenu, le message retenu le plus récent est reçu. |
Tous les messages publiés avec un QOS = 1 et auxquels vous êtes abonné avec un QOS =1 alors que l’appareil était déconnecté sont envoyés après la reconnexion de l’appareil. |
|
Data/session expiration |
Dans MQTT 3, les messages retenus n’expirent pas. Ils sont stockés jusqu’à ce qu’ils soient remplacés ou supprimés. Dans MQTT 5, les messages conservés expirent après l'intervalle d'expiration des messages que vous avez défini. Pour plus d’informations, consultez Expiration de messages. |
Les sessions permanentes expirent si le client ne se reconnecte pas dans le délai imparti. Après l’expiration d’une session permanente, les abonnements du client et les messages enregistrés publiés avec un QOS = 1 et auxquels vous avez souscrit avec un QOS =1 alors que l’appareil était déconnecté sont supprimés. Les messages expirés ne seront pas remis. Pour de amples informations sur l’expiration des sessions permanentes, veuillez consulter Sessions permanentes MQTT. |
Pour plus d'informations sur les sessions permanentes, consultez Sessions permanentes MQTT.
Avec les messages retenus, le client de publication détermine si un message doit être retenu et remis à un appareil après sa connexion, qu’il ait déjà eu une session ou non. Le choix de stocker un message est fait par l'éditeur et le message stocké est remis à tous les clients actuels et futurs abonnés aux abonnements QoS 0 ou QoS 1. Les messages retenus ne contiennent qu’un seul message à la fois sur une rubrique donnée.
Lorsqu’un compte a stocké le nombre maximum de messages retenus, AWS IoT Core renvoie une réponse limitée aux messages publiés avec l’option RETAIN définie et à des charges utiles supérieures à 0 octet jusqu’à ce que certains messages retenus soient supprimés et que le nombre de messages retenus tombe en dessous de la limite.
MQTT a conservé les messages et AWS IoT Clichés instantanés d’appareil
Les messages retenus et les Device Shadows retiennent les données d’un appareil, mais ils se comportent différemment et répondent à des objectifs différents. Cette section décrit leurs similitudes et leurs différences.
|
Messages retenus |
Clichés instantanés d’appareil |
|
|---|---|---|
|
La charge utile des messages possède une structure ou un schéma prédéfini |
Tel que défini par l’implémentation. MQTT ne spécifie pas de structure ou de schéma pour la charge utile de ses messages. |
AWS IoT prend en charge une structure de données spécifique. |
|
La mise à jour de la charge utile des messages génère des messages d’événement |
La publication d’un message retenu envoie le message aux clients abonnés, mais ne génère pas de messages de mise à jour supplémentaires. |
La mise à jour d’un Device Shadow génère des messages de mise à jour décrivant le changement. |
|
Les mises à jour des messages sont numérotées |
Les messages retenus ne sont pas numérotés automatiquement. | Les documents Device Shadow sont dotés de numéros de version et d’horodatage automatiques. |
|
La charge utile du message est attachée à une ressource d’objet |
Les messages retenus ne sont pas attachés à une ressource d’objet. |
Les Device Shadows sont attachés à une ressource d’objets. |
|
Mise à jour des éléments individuels de la charge utile du message |
Les éléments individuels du message ne peuvent pas être modifiés sans mettre à jour l’intégralité de la charge utile du message. |
Les éléments individuels d’un document Device Shadow peuvent être mis à jour sans qu’il soit nécessaire de mettre à jour l’intégralité du document Device Shadow. |
|
Le client reçoit les données des messages lors de l’abonnement |
Le client reçoit automatiquement un message conservé après s'être abonné à une rubrique contenant un message conservé. |
Les clients peuvent s’abonner aux mises à jour de Device Shadow, mais ils doivent demander délibérément l’état actuel. |
|
Indexation et consultabilité |
Les messages retenus ne sont pas indexés pour la recherche. |
L’indexation de flotte indexe les données Device Shadow à des fins de recherche et d’agrégation. |
Messages MQTT Last Will and Testament (LWT)
Last Will and Testament (LWT) est une fonctionnalité de MQTT. Grâce LWT, les clients peuvent spécifier un message que l’agent publiera sur un rubrique défini par le client et enverra à tous les clients abonnés au rubrique en cas de déconnexion non initiée. Le message spécifié par les clients est appelé message LWT ou message Will, et la rubrique définie par les clients est appelé rubrique Will. Vous pouvez spécifier un message LWT lorsqu’un appareil se connecte à l’agent. Ces messages peuvent être retenus en plaçant l’indicateur Will
Retain dans le champ Connect Flag bits pendant la connexion. Par exemple, si l’indicateur Will Retain est défini sur 1, un message Will sera stocké dans l’agent dans le rubrique Will associée. Pour plus d’informations, consultez Messages volontaires
Lorsque vous gérez les connexions client, vous pouvez contrôler si les messages LWT sont publiés lorsque vous déconnectez un client. Pour de plus amples informations, veuillez consulter Gestion des connexions MQTT.
L’agent retiendra les messages Will jusqu’à ce qu’une déconnexion non initiée se produise. Lorsque cela se produit, le courtier publiera les messages à tous les clients abonnés à la rubrique Will pour notifier la déconnexion. Si le client se déconnecte de l’agent avec une déconnexion initiée par le client à l’aide du message MQTT DISCONNECT, l’agent ne publiera pas les messages LWT enregistrés. Dans tous les autres cas, les messages LWT seront envoyés. En raison de la nature asynchrone du traitement des déconnexions, il n'est pas garanti que les messages LWT seront envoyés dans l'ordre lors de la reconnexion. Nous vous recommandons d'utiliser les événements du cycle de vie pour améliorer la précision de la détection de l'état de connectivité, car ces événements fournissent des attributs tels que les horodatages et les numéros de version pour gérer les événements de rupture de service. Pour une liste complète des scénarios de déconnexion dans lesquels le courtier enverra les messages LWT, consultez la section Connect/Disconnect événements.
Utilisation de ConnectAttributes
ConnectAttributes vous permettent de spécifier les attributs que vous souhaitez utiliser dans votre message de connexion dans vos politiques IAM telles que PersistentConnect et LastWill. Grâce à ConnectAttributes, vous pouvez ainsi créer des politiques qui n’autorisent pas les appareils à accéder aux nouvelles fonctionnalités par défaut, ce qui peut être utile si un appareil est compromis.
connectAttributes prend en charge les fonctions suivantes :
PersistentConnect-
Utilisez la fonctionnalité
PersistentConnectpour enregistrer tous les abonnements effectués par le client pendant la connexion lorsque la connexion entre le client et le courtier est interrompue. LastWill-
Utilisez la fonctionnalité
LastWillpour publier un messageLastWillTopiclorsqu’un client se déconnecte de manière inattendue.
Par défaut, votre politique prévoit une connexion non permanente et aucun attribut n’est transmis pour cette connexion. Vous devez spécifier une connexion permanente dans votre politique IAM si vous souhaitez en avoir une.
Lorsque vous gérez les connexions client via la console ou les API, vous pouvez consulter les attributs de connexion et la configuration de session pour les clients connectés. Pour de plus amples informations, veuillez consulter Gestion des connexions MQTT.
Pour des exemples ConnectAttributes, consultez la section Exemples de politiques de connexion.
Fonctionnalités prises en charge par MQTT 5
AWS IoT Core le support de MQTT 5 est basé sur la spécification MQTT v5.0
AWS IoT Core prend en charge les fonctionnalités MQTT 5 suivantes :
Abonnements partagés
AWS IoT Core prend en charge les abonnements partagés pour MQTT 3.1.1 et MQTT 5. Les abonnements partagés permettent à plusieurs clients de partager un abonnement à un sujet et un seul client recevra les messages publiés sur ce sujet selon une distribution aléatoire. Les abonnements partagés peuvent équilibrer efficacement la charge des messages MQTT entre un certain nombre d'abonnés. Supposons, par exemple, que 1000 appareils publient sur le même rubrique et que 10 applications principales traitent ces messages. Dans ce cas, les applications principales peuvent s'abonner au même sujet, et chacune recevra aléatoirement des messages publiés par les appareils sur le sujet partagé. Cela revient à « partager » efficacement la charge de ces messages. Les abonnements partagés permettent également une meilleure résilience. Lorsqu’une application principale se déconnecte, l’agent répartit la charge entre les abonnés restants du groupe. Lorsque tous les abonnés se déconnectent, les messages sont mis en file d'attente.
Des fonctionnalités de mise en file d'attente de messages sont disponibles pour les abonnements partagés sur les connexions MQTT 3.1.1 et MQTT 5 afin d'améliorer la fiabilité de la livraison des messages.
Pour utiliser les abonnements partagés, les clients s'abonnent au filtre de rubrique d'un abonnement partagé comme suit :
$share/{ShareName}/{TopicFilter}
-
$shareest une chaîne littérale indiquant le filtre de rubrique d’un abonnement partagé, qui doit commencer par$share. -
{ShareName}est une chaîne de caractères qui indique le nom partagé utilisé par un groupe d’abonnés. Le filtre de sujet d'un abonnement partagé doit contenir unShareNameet être suivi du/caractère. Le{ShareName}ne doit pas inclure les caractères suivants :/,+, ou#. La taille maximale pour{ShareName}est de 128 UTF-8 caractères. -
{TopicFilter}suit la même syntaxe de filtre de rubrique qu'un abonnement non partagé. La taille maximale pour{TopicFilter}est de 256 UTF-8 caractères. -
Les deux barres obliques requises (
/) car les$share/{ShareName}/{TopicFilter}ne sont pas incluses dans le nombre maximum de barres obliques dans la rubrique et dans la limite du filtre de rubrique.
Les abonnements identiques {ShareName}/{TopicFilter} appartiennent au même groupe d'abonnements partagé. Vous pouvez créer plusieurs groupes d'abonnements partagés et ne pas dépasser la limite d'abonnements partagés par groupe. Pour plus d’informations, veuillez consulter la rubrique Points de terminaison et quotas AWS IoT Core depuis la Référence générale AWS .
Les tableaux suivants comparent les abonnements non partagés et les abonnements partagés :
| Abonnement | Description | Exemples de filtres de rubrique |
|---|---|---|
| Non-shared abonnements | Chaque client crée un abonnement distinct pour recevoir les messages publiés. Lorsqu’un message est publié dans une rubrique, tous les abonnés à ce rubrique reçoivent une copie du message. |
|
| Abonnements partagés | Plusieurs clients peuvent partager un abonnement à un rubrique et un seul client recevra les messages publiés sur ce rubrique de manière aléatoire. |
|
| Non-shared flux d'abonnements | Flux d'abonnements partagés |
|---|---|
|
|
Remarques importantes concernant l'utilisation des abonnements partagés
-
Si le groupe d'abonnés partagé comprend des abonnés permanents à une session, lorsque tous les abonnés du groupe partagé sont déconnectés, ou si l'un des abonnés ne respecte pas la limite de demandes de publication par seconde et par connexion, les messages QoS 1 non reconnus et les messages QoS 1 non livrés publiés dans un groupe d'abonnement partagé seront mis en file d'attente. Pour plus d'informations, consultez la section Mise en file d'attente des messages relatifs aux abonnements partagés.
-
Les messages QoS 0 publiés dans un groupe d'abonnement partagé seront supprimés en cas d'échec.
-
Les abonnements partagés ne reçoivent pas de messages conservés lorsque vous vous abonnez à des modèles de sujets dans le cadre d'un groupe d'abonnés partagé. Les messages publiés sur des sujets qui ont des abonnés communs et dont le
RETAINdrapeau est activé sont remis aux abonnés partagés comme tout autre message publié. -
Lorsque les abonnements partagés contiennent des caractères génériques (# ou +), il peut y avoir plusieurs abonnements partagés correspondants à une rubrique. Dans ce cas, le courtier de messages copie le message de publication et l'envoie à un client aléatoire dans chaque abonnement partagé correspondant. Le comportement générique des abonnements partagés peut être expliqué dans le schéma suivant.
Dans cet exemple, il existe trois abonnements partagés correspondants à la rubrique
sports/tennisMQTT de publication. L’agent de messages copie le message publié et l’envoie à un client aléatoire dans chaque groupe correspondant.Le client 1 et le client 2 partagent l’abonnement :
$share/consumer1/sports/tennisLe client 3 et le client 4 partagent l’abonnement :
$share/consumer1/sports/#Le client 5 et le client 6 partagent l’abonnement :
$share/consumer2/sports/tennis
Pour plus d'informations sur les limites des abonnements partagés, consultez la section AWS IoT Core Points de terminaison et quotas de la référence AWS générale. Pour tester les abonnements partagés à l'aide du client AWS IoT MQTT dans la AWS IoT console
Abonnements partagés, mise en file d'attente des messages
Pour améliorer la fiabilité de la diffusion des messages, les abonnements partagés incluent des fonctionnalités de mise en file d'attente des messages qui stockent les messages lorsqu'aucun abonné en ligne n'est disponible. Lorsqu'un groupe d'abonnement partagé contient au moins un membre disposant d'une session permanente, la fonctionnalité de mise en file d'attente est activée pour le groupe. Lors de la distribution de messages, les membres en ligne sont sélectionnés comme destinataires. Les messages QoS 1 sont mis en file d'attente lorsqu'aucun membre n'est trouvé en ligne ou lorsque le nombre d'abonnés dépasse la limite. Publish requests per second per connection Les messages en file d'attente sont remis soit lorsque les membres existants reprennent leurs sessions permanentes, soit lorsque de nouveaux membres rejoignent le groupe. Les messages en file d'attente sont distribués à un maximum de 20 messages par seconde par abonné du groupe actif, ainsi que tout autre message délivré à l'abonné conformément aux abonnements.
Par défaut, la rétention des messages en file d'attente respecte le Persistent Session expiry periodquota. Toutefois, si un intervalle d'expiration des messages (MEI) est défini dans le message de publication entrant, le MEI a priorité. Lorsque le MEI est présent, il détermine la période de rétention des messages, quelle que soit la période d'expiration de la session persistante.
Le débit des files d'attente de messages est limité en fonction du Queued messages per second per accountquota, et le nombre de messages est limité par le Maximum number of queued messages per shared subscription groupquota. Pour consulter et gérer vos quotas, accédez à la console Service Quotas
Vous pouvez surveiller la file d'attente CloudWatch en effectuant une recherche ApproximateQueueDepth dans l'AWS/Usageespace de noms, ou vous pouvez utiliser la commande CLI suivante pour répertorier les métriques associées à la profondeur de file d'attente de chaque groupe d'abonnement partagé.
aws cloudwatch list-metrics --namespace "AWS/Usage" --dimensions Name=Resource,Value='ApproximateQueueDepth'
Lorsque ces limites sont dépassées, seuls les messages qui étaient déjà en file d'attente avant d'atteindre la limite sont conservés. Les nouveaux messages entrants qui dépasseraient les limites sont supprimés. Le système ne remplace pas les anciens messages en file d'attente par des messages plus récents.
La mise en file d'attente des messages est enregistrée dans CloudWatch les métriques et CloudWatch les journaux. Pour plus d'informations sur les entrées écrites dans CloudWatch et les CloudWatch journaux, reportez-vous aux Métriques d'agent de messages sections etEntrée de journal en file d'attente. Les messages en file d'attente sont toujours facturés au tarif de messagerie standard. Pour plus d’informations sur la tarification des messages, consultez AWS IoT Core Tarification
Cycle de vie des sessions dans un groupe d'abonnement partagé
Lorsqu'une session propre s'abonne à un groupe, elle devient membre en ligne du groupe. Lorsqu'elle se désabonne ou se déconnecte, la session nettoyée quitte le groupe.
Lorsqu'une session permanente s'abonne à un groupe, elle devient membre en ligne du groupe. Lorsqu'il se déconnecte, il reste dans le groupe, mais en devient un membre hors ligne. Lorsqu'il se reconnecte, il redevient membre en ligne. La session permanente quitte le groupe lorsqu'il se désabonne explicitement ou lorsqu'il expire après une déconnexion.
Démarrage correct et expiration de session
Vous pouvez utiliser Clean Start et Session Expiration pour gérer vos sessions permanentes avec plus de flexibilité. Un indicateur Clean Start indique si la session doit démarrer sans utiliser une session existante. Un intervalle d’expiration de session indique la durée pendant laquelle la session doit être retenue après une déconnexion. L’intervalle d’expiration des sessions peut être modifié lors de la déconnexion. Pour de plus amples informations, veuillez consulter Sessions permanentes MQTT.
Code de motif sur tous les ACK
Vous pouvez déboguer ou traiter les messages d’erreur plus facilement à l’aide des codes de motif. Les codes de motif sont renvoyés par l’agent de messages en fonction du type d’interaction avec l’agent (s’abonner, publier, accuser réception). Pour plus d’informations, consultez Codes de motif MQTT. Pour une liste complète des codes de motif MQTT, consultez la spécification MQTT v5
Alias de sujets
Vous pouvez remplacer le nom d’une rubrique par un alias de rubrique, qui est un entier de deux octets. L'utilisation d'alias de rubrique permet d'optimiser la transmission des noms de rubriques afin de réduire potentiellement les coûts de données sur les services de données mesurés. AWS IoT Core a une limite par défaut de 8 alias de rubrique. Pour plus d’informations, veuillez consulter la rubrique Points de terminaison et quotas AWS IoT Core depuis la Référence générale AWS .
Expiration du message
Vous pouvez ajouter des valeurs d’expiration aux messages publiés. Ces valeurs représentent l'intervalle d'expiration des messages (MEI) en secondes. Si un message n’a pas été envoyé aux abonnés dans cet intervalle, il expirera et sera supprimé. Si vous ne définissez pas la valeur d’expiration du message, celui-ci n’expirera pas.
À l’aller, l’abonné recevra un message indiquant le temps restant dans l’intervalle d’expiration. Par exemple, si un message de publication entrant expire 30 secondes et qu’il est acheminé vers l’abonné au bout de 20 secondes, le champ d’expiration du message sera mis à jour à 10. Il est possible que le message reçu par l’abonné ait un MEI mis à jour de 0. En effet, dès que le temps restant est inférieur ou égal à 999 ms, il sera mis à jour à 0.
Dans AWS IoT Core, le MEI minimum est de 1. Si l’intervalle est défini sur 0 du côté client, il sera ajusté à 1. L’intervalle d’expiration maximal des messages est de 604 800 (7 jours). Toute valeur supérieure à cette valeur sera ajustée à la valeur maximale.
Dans la communication entre versions, le comportement d’expiration du message est déterminé par la version MQTT du message de publication entrant. Par exemple, un message d’expiration envoyé par une session connectée via MQTT5 peut expirer pour les appareils abonnés à des sessions MQTT3. Le tableau ci-dessous indique comment l’expiration des messages prend en charge les types de messages de publication suivants :
| Publier un type de message | Intervalle d’expiration des messages |
|---|---|
| Publier régulièrement | Si un serveur ne parvient pas à délivrer le message dans le délai spécifié, le message expiré sera supprimé et l’abonné ne le recevra pas. Cela inclut les situations telles que lorsqu’un appareil ne publie pas ses messages QoS 1. |
| Conserver | Si un message retenu expire et qu’un nouveau client s’abonne à la rubrique, le client ne recevra pas le message lors de son inscription. |
| Dernier testament | L’intervalle entre les derniers messages testamentaires commence une fois que le client se déconnecte et que le serveur tente de transmettre le dernier testament à ses abonnés. |
| Messages mis en file d’attente | Si un QoS 1 sortant avec intervalle d'expiration des messages expire lorsqu'un client est hors ligne, après la reprise de la session persistante, le client ne recevra pas le message expiré. |
Autres fonctionnalités de MQTT 5
Déconnexion du serveur
Lorsqu’une déconnexion se produit, le serveur peut envoyer au client de manière proactive un message DISCONNECT pour notifier la fermeture de la connexion avec un code de motif de déconnexion.
Request/Response
Les éditeurs peuvent demander qu’une réponse soit envoyée par le destinataire à un rubrique spécifié par le diffuseur de publication lors de la réception.
Taille maximale du paquet
Le client et le serveur peuvent spécifier indépendamment la taille de paquet maximale qu’ils prennent en charge.
Format de charge utile et type de contenu
Vous pouvez spécifier le format de charge utile (binaire, texte) et le type de contenu lorsqu’un message est publié. Ils sont transmis au destinataire du message.
Propriétés du MQTT 5
Les propriétés MQTT 5 sont des ajouts importants à la norme MQTT pour prendre en charge les nouvelles fonctionnalités de MQTT 5 telles que l'expiration de session et le modèle. Request/Response Dans AWS IoT Core, vous pouvez créer des règles qui peuvent transférer les propriétés des messages sortants ou utiliser HTTP Publish pour publier des messages MQTT avec certaines des nouvelles propriétés.
Le tableau suivant répertorie toutes les propriétés MQTT 5 prises AWS IoT Core en charge.
| Propriété | Description | Type d’entrée | Paquets |
|---|---|---|---|
| Indicateur de format de charge utile | Valeur booléenne qui indique si la charge utile est formatée comme. UTF-8 | Octet | PUBLIER, CONNECTER |
| Type de contenu | UTF-8 Chaîne qui décrit le contenu de la charge utile. | UTF-8 ficelle | PUBLIER, CONNECTER |
| Rubrique de réponse | UTF-8 Chaîne qui décrit le sujet sur lequel le destinataire doit publier dans le cadre du flux de demande-réponse. La rubrique ne doit pas avoir de caractères génériques. | UTF-8 ficelle | PUBLIER, CONNECTER |
| Données de corrélation | Données binaires utilisées par l’expéditeur du message de demande pour identifier la demande à laquelle correspond le message de réponse. | Binaire | PUBLIER, CONNECTER |
| Propriétés de l’utilisateur | Une paire UTF-8 de cordes. Cette propriété peut apparaître plusieurs fois dans un même paquet. Les destinataires recevront les paires clé-valeur dans l’ordre dans lequel elles sont envoyées. | UTF-8 paire de cordes | CONNECTER, PUBLIER, Will Properties, S’ABONNER, SE DÉCONNECTER, SE DÉSABONNER |
| Intervalle d’expiration des messages | Un entier de 4 octets qui représente l'intervalle d'expiration des messages en secondes. S’il est absent, le message n’expire jamais. | Entier de 4 octets | PUBLIER, CONNECTER |
| Intervalle d’expiration des sessions |
Un entier de 4 octets qui représente l'intervalle d'expiration de la session en secondes. AWS IoT Core prend en charge un maximum de 7 jours, avec un maximum d'une heure par défaut. Si la valeur que vous avez définie dépasse le maximum de votre compte, la valeur ajustée AWS IoT Core sera renvoyée dans le CONNACK. |
Entier de 4 octets | CONNECTER, CONNECTER, DÉCONNECTER |
| Identifiant client attribué | ID client aléatoire généré AWS IoT Core lorsqu'aucun identifiant client n'est spécifié par les appareils. L’identifiant client aléatoire doit être un nouvel identifiant client qui n’est utilisé par aucune autre session actuellement gérée par le courtier. | UTF-8 ficelle | CONNACK |
| Serveur Keep Alive | Un entier de 2 octets qui représente la durée de rétention attribuée par le serveur. Le serveur déconnecte le client s’il est inactif pendant une durée supérieure à la durée de conservation. | Entier de 2 octets | CONNACK |
| Demander des informations sur le problème | Valeur booléenne qui indique si la chaîne de raison ou les propriétés utilisateur sont envoyées en cas d'échec. | Octet | CONNECT |
| Recevoir maximum | Un entier de 2 octets qui représente le nombre maximum de paquets PUBLISH QOS > 0 qui peuvent être envoyés sans recevoir de PUBACK. | Entier de 2 octets | CONNECTER, CONNECTER |
| Alias maximal du rubrique | Cette valeur indique la valeur la plus élevée qui sera acceptée comme alias de rubrique. La valeur par défaut est 0. | Entier de 2 octets | CONNECTER, CONNECTER |
| QoS maximale | La valeur maximale de QoS prise en charge. AWS IoT Core La valeur par défaut est 1. AWS IoT Core ne prend pas en charge QoS 2. | Octet | CONNACK |
| Retenir disponible |
Valeur booléenne qui indique si le courtier de AWS IoT Core messages prend en charge les messages conservés. La valeur par défaut est 1. |
Octet | CONNACK |
| Taille maximale du paquet | Taille maximale des paquets qui AWS IoT Core acceptent et envoient. Ne peut pas dépasser 128 Ko. | Entier de 4 octets | CONNECTER, CONNECTER |
| Abonnement Wildcard disponible |
Valeur booléenne qui indique si le courtier de AWS IoT Core messages prend en charge Wildcard Subscription Available. La valeur par défaut est 1. |
Octet | CONNACK |
| Identifiant d’abonnement disponible |
Valeur booléenne qui indique si le courtier de AWS IoT Core messages prend en charge l'identifiant d'abonnement disponible. La valeur par défaut est 0. |
Octet | CONNACK |
Codes de motif MQTT
MQTT 5 introduit un meilleur signalement des erreurs avec les réponses au code de raison. AWS IoT Core peut renvoyer des codes de motif, y compris, mais sans s'y limiter, les suivants regroupés par paquets. Pour une liste complète des codes de motif pris en charge par MQTT 5, consultez les spécifications du MQTT 5
| Value | Hex | Nom du code de motif | Description |
|---|---|---|---|
| 0 | 0x00 | Réussite | La connexion est acceptée. |
| 128 | 0x80 | Erreur non spécifiée | Le serveur ne souhaite pas révéler le motif de l’échec, sinon aucun des autres codes de motif ne s’applique. |
| 133 | 0x85 | Identifiant du client non valide | L’identifiant du client est une chaîne valide mais n’est pas autorisé par le serveur. |
| 134 | 0x86 | Nom d’utilisateur ou mot de passe incorrect | Le serveur n’accepte pas le nom d’utilisateur ou le mot de passe spécifiés par le client. |
| 135 | 0x87 | Non autorisé | Le client n’est pas autorisé à se connecter. |
| 144 | 0x90 | Nom de la rubrique non valide | Le nom de la rubrique testamentaire est correctement formé mais n’est pas accepté par le serveur. |
| 151 | 0x97 | Quota dépassé | Une limite de mise en œuvre ou imposée par l’administration a été dépassée. |
| 155 | 0 x 9 B | QoS n’est pas pris en charge. | Le serveur ne prend pas en charge la QoS définie dans Will QoS. |
| Value | Hex | Nom du code de motif | Description |
|---|---|---|---|
| 0 | 0x00 | Réussite | Le message est accepté. La publication du message QoS 1 se poursuit. |
| 128 | 0x80 | Erreur non spécifiée | Le destinataire n’accepte pas la publication, mais soit ne souhaite pas en révéler la raison, soit elle ne correspond pas à l’une des autres valeurs. |
| 135 | 0x87 | Non autorisé | Le PUBLISH n’est pas autorisé. |
| 144 | 0x90 | Nom de la rubrique non valide | Le nom de la rubrique n’est pas mal formé, mais il n’est pas accepté par le client ou le serveur. |
| 145 | 0x91 | Identifiant de paquet en cours d’utilisation | L’identifiant du paquet est déjà utilisé. Cela peut indiquer une incompatibilité de l’état de session entre le client et le serveur. |
| 151 | 0x97 | Quota dépassé | Une limite de mise en œuvre ou imposée par l’administration a été dépassée. |
| Value | Hex | Nom du code de motif | Description |
|---|---|---|---|
| 129 | 0x81 | Paquet incorrect | Le paquet reçu n’est pas conforme à cette spécification. |
| 130 | 0x82 | Erreur de protocole | Un paquet inattendu ou en panne a été reçu. |
| 135 | 0x87 | Non autorisé | La demande n'est pas autorisée. |
| 139 | 0 x 8 B | Arrêt du serveur | Le serveur est en train de s’arrêter. |
| 141 | 0 x 8D | Délai d’expiration de Keep Alive | La connexion est fermée car aucun paquet n’a été reçu pendant 1,5 fois la durée de Keep Alive. |
| 142 | 0 x 8E | Session prise en charge | Une autre connexion utilisant le même ClientID s’est connectée, ce qui a entraîné la fermeture de cette connexion. |
| 143 | 0 x 8 F | Filtre de rubrique invalide | Le filtre de rubrique est correctement formé mais n’est pas accepté par le serveur. |
| 144 | 0x90 | Nom de la rubrique non valide | Le nom de la rubrique est correctement formé mais n’est pas accepté par ce client ou serveur. |
| 147 | 0x93 | Dépassement du maximum de réception | Le client ou le serveur a reçu une publication supérieure à la valeur maximale de réception pour laquelle il n’a pas envoyé de PUBACK ou de PUBCOMP. |
| 148 | 0x94 | Alias de rubrique invalide | Le client ou le serveur a reçu un paquet PUBLISH contenant un alias de rubrique supérieur à l’alias de rubrique maximal qu’il a envoyé dans le paquet CONNECT ou CONNACK. |
| 151 | 0x97 | Quota dépassé | Une limite de mise en œuvre ou imposée par l’administration a été dépassée. |
| 152 | 0x98 | Action administrative | La connexion est interrompue suite à une action administrative. |
| 155 | 0 x 9 B | QoS n’est pas pris en charge. | Le client a spécifié une QoS supérieure à la QoS spécifiée dans une QoS maximale dans le CONNACK. |
| 161 | 0 x A1 | Identifiants d’abonnement non pris en charge | Le serveur ne prend pas en charge les identifiants d’abonnement ; l’abonnement n’est pas accepté. |
| Value | Hex | Nom du code de motif | Description |
|---|---|---|---|
| 0 | 0x00 | QoS 0 accordé | L’abonnement est accepté et la QoS maximale envoyée sera de QoS 0. Il s’agit peut-être d’une QoS inférieure à celle demandée. |
| 1 | 0x01 | QoS 1 accordé | L’abonnement est accepté et la QoS maximale envoyée sera de QoS 1. Il s’agit peut-être d’une QoS inférieure à celle demandée. |
| 128 | 0x80 | Erreur non spécifiée | L’abonnement n’est pas accepté et le serveur ne souhaite pas en révéler le motif ou aucun des autres codes de motif ne s’applique. |
| 135 | 0x87 | Non autorisé | Le client n’est pas autorisé à souscrire cet abonnement. |
| 143 | 0 x 8 F | Filtre de rubrique invalide | Le filtre de rubrique est correctement formé mais n’est pas autorisé pour ce client. |
| 145 | 0x91 | Identifiant de paquet en cours d’utilisation | L’identifiant de paquet spécifié est déjà utilisé. |
| 151 | 0x97 | Quota dépassé | Une limite de mise en œuvre ou imposée par l’administration a été dépassée. |
| Value | Hex | Nom du code de motif | Description |
|---|---|---|---|
| 0 | 0x00 | Réussite | L'abonnement est supprimé. |
| 128 | 0x80 | Erreur non spécifiée | Le désabonnement n’a pas pu être effectué et le serveur ne souhaite pas en révéler le motif ou aucun des autres codes de motif ne s’applique. |
| 143 | 0 x 8 F | Filtre de rubrique invalide | Le filtre de rubrique est correctement formé mais n’est pas autorisé pour ce client. |
| 145 | 0x91 | Identifiant de paquet en cours d’utilisation | L’identifiant de paquet spécifié est déjà utilisé. |
AWS IoT différences par rapport aux spécifications MQTT
L’implémentation de l’agent de messages est basée sur les spécifications MQTT v3.1.1
-
AWS IoT ne prend pas en charge les paquets suivants pour MQTT 3 : PUBREC, PUBREL et PUBCOMP.
-
AWS IoT ne prend pas en charge les paquets suivants pour MQTT 5 : PUBREC, PUBREL, PUBCOMP et AUTH.
-
AWS IoT ne prend pas en charge la redirection du serveur MQTT 5.
-
AWS IoT prend en charge les niveaux de qualité de service (QoS) MQTT 0 et 1 uniquement. AWS IoT ne prend pas en charge la publication ou l'abonnement avec QoS de niveau 2. Lorsque QoS 2 est requis, l’agent de messages , n’envoie pas de PUBACK ou de SUBACK.
-
En effet AWS IoT, l'abonnement à une rubrique dont le niveau de QoS est 0 signifie qu'un message est délivré zéro fois ou plus. Un message peut être remis plusieurs fois. Les messages remis plusieurs fois peuvent être envoyés avec un ID de paquet différent. Dans ce cas, l'indicateur DUP n'est pas défini.
-
Lorsqu'il répond à une demande de connexion, l'agent de messages envoie un message CONNACK. Ce message contient un indicateur précisant si la connexion reprend une session précédente.
-
Avant d’envoyer des paquets de contrôle supplémentaires ou une demande de déconnexion, le client doit attendre que le message CONNACK soit reçu sur son appareil par l’agent de messages AWS IoT .
-
Lorsqu'un client s'abonne à une rubrique, il peut y avoir un délai entre le moment où l'agent de messages envoie un SUBACK et le moment où le client commence à recevoir de nouveaux messages correspondants.
-
Lorsqu’un client utilise le caractère générique
#dans le filtre de rubrique pour s’abonner à une rubrique, toutes les chaînes situées à son niveau ou inférieur dans la hiérarchie des rubriques sont mises en correspondance. Cependant, la rubrique parent ne correspond pas. Par exemple, un abonnement à la rubriquesensor/#reçoit les messages publiés dans les rubriquessensor/,sensor/temperature,sensor/temperature/room1, mais pas les messages publiés danssensor. Pour plus d’informations sur les caractères génériques, consultez Filtres de noms de sujets. -
L'agent de messages utilise l'ID de client pour identifier chaque client. L'ID de client est transmis depuis le client à l'agent de messages dans le cadre de la charge utile MQTT. Deux clients possédant le même ID de client ne peuvent pas être connectés simultanément à l’agent de messages. Lorsqu'un client se connecte à l'agent de messages à l'aide d'un ID de client qu'un autre client utilise, la nouvelle connexion client est acceptée et le client connecté précédemment est déconnecté. Vous pouvez également déconnecter manuellement les clients à l'aide de la console ou des API. Pour de plus amples informations, veuillez consulter Gestion des connexions MQTT.
-
À de rares occasions, l'agent de messages peut renvoyer le même message PUBLISH logique avec un ID de paquet différent.
-
L’abonnement aux filtres de rubrique contenant un caractère générique ne permet pas de recevoir les messages retenus. Pour recevoir un message retenu, la demande d’abonnement doit contenir un filtre de rubrique correspondant exactement à la rubrique du message retenu.
-
L’agent de messages ne garantit pas l’ordre dans lequel les messages et les ACK sont reçus.
-
AWS IoT peuvent avoir des limites différentes des spécifications. Pour plus d’informations veuillez consulter AWS IoT Core Limites et quotas de l’agent de messages et des protocoles dans le AWS IoT Guide de référence.
-
L'indicateur MQTT DUP n'est pas pris en charge.
Gestion des connexions MQTT
AWS IoT Core fournit des API et des fonctionnalités de console pour vous aider à gérer les connexions MQTT, notamment la possibilité de déconnecter les clients, d'afficher les détails des connexions et de gérer leurs sessions. Ces fonctionnalités vous permettent de mieux contrôler votre parc de AWS IoT clients et de résoudre les problèmes de connexion.
Dans cette section
Déconnexion des clients MQTT
Utilisez l'DeleteConnectionAPI pour déconnecter les appareils MQTT AWS IoT Core en spécifiant leurs identifiants clients. Lorsque vous déconnectez un client, vous le AWS IoT Core déconnectez du courtier de AWS IoT Core messages et vous pouvez éventuellement nettoyer l'état de la session et supprimer le message LWT (LWT).
Lorsque vous appelez l'DeleteConnectionAPI, AWS IoT Core exécute plusieurs actions pour garantir une déconnexion correcte. AWS IoT Core envoie d'abord un message de déconnexion MQTT au client pour mettre fin à la session MQTT. Le service ferme ensuite le TCP/TLS socket sous-jacent.
Le courtier de messages envoie un DISCONNECT paquet à l'appareil et publie un événement du cycle de vie avec la raison de la déconnexionAPI_INITIATED_DISCONNECT. Cela vous permet d'identifier le moment où une déconnexion a été initiée via l'API plutôt que par le client ou en raison de problèmes réseau. Vous pouvez surveiller ces événements à des fins de visibilité, de résolution des problèmes et d'audit. Par exemple, vous pouvez utiliser des AWS IoT règles pour traiter ces événements afin de savoir quand et pourquoi les clients ont été déconnectés.
Si vous définissez le cleanSession paramètre surtrue, AWS IoT Core supprime l'état de session du client, y compris tous les abonnements et les messages en file d'attente. Si vous nettoyez une session, la session persistante est interrompue. Si le client était une session persistante et que le preventWillMessage paramètre est défini surfalse, le service envoie le message LWT s'il est disponible, ce qui est utile lors des opérations de maintenance planifiées.
Lorsque vous appelez l'DeleteConnectionAPI, le processus de déconnexion commence immédiatement, mais le moment exact auquel le client reconnaît la déconnexion peut varier en fonction des conditions du réseau et de l'implémentation du client. La plupart des clients détectent la déconnexion en quelques secondes, mais dans certains cas, en cas de mauvaise connectivité réseau, le client peut mettre plus de temps à reconnaître qu'il a été déconnecté.
Note
En forçant une déconnexion, le client doit s'authentifier et autoriser à nouveau sa session avec un nouvel état de session. L'appel d'API lui-même n'empêche pas la reconnexion des clients. Si cela est souhaité, les informations d'identification ou la politique d'un client doivent également être modifiées avant de lancer l'appel d'DeleteConnectionAPI.
Pour plus d’informations sur la tarification, consultez Tarification AWS IoT Core
Cas d’utilisation
L'DeleteConnectionAPI est utile pour gérer les clients qui se comportent mal ou consomment des ressources excessives. En forçant une déconnexion, vous pouvez vous assurer que les clients rétablissent leurs connexions avec une authentification et une autorisation appropriées, ce qui peut aider à résoudre les problèmes de consommation de ressources.
Les scénarios de redirection de clients bénéficient également de cette API. Lorsque vous devez rediriger des clients vers différents points de terminaison ou Régions AWS que vous pouvez les déconnecter par programme et les reconnecter à un autre AWS IoT Core point de terminaison en modifiant les paramètres DNS. Cette API peut aider à résoudre les connexions bloquées ou à éliminer les états de session problématiques susceptibles d'empêcher le fonctionnement normal.
Paramètres d'API
L'DeleteConnectionAPI accepte les paramètres suivants :
- ClientiD (obligatoire)
-
Identifiant unique du client MQTT à déconnecter. Ceci est spécifié dans le chemin de l'URL. L'ID client ne peut pas commencer par le signe du dollar ($).
Note
Les identifiants des clients MQTT peuvent contenir des caractères non valides dans les requêtes HTTP. Lorsque vous utilisez l'
DeleteConnectionAPI, vous devez encoder par URL (encodage en pourcentage) tous les caractères de l'ID client valides en MQTT mais pas en HTTP. Cela inclut les caractères spéciaux tels que les espaces, les barres obliques (/) et UTF-8 les caractères. Par exemple, un espace devient %20, une barre oblique devient %2F et le UTF-8 caractère ü devient %C 3% BC. Un codage correct garantit que les identifiants des clients MQTT sont correctement transmis lors de l'appel HTTP-based d'API. - CleanSession (facultatif)
-
Spécifie s'il faut supprimer l'état de session du client lors de la déconnexion. Réglez sur
truepour supprimer toutes les informations de session, y compris les abonnements et les messages en file d'attente. Définissez surfalsepour préserver l'état de la session. Par défaut, ce paramètre est défini surfalse(préserve l'état de la session). Pour les sessions propres, ce paramètre est ignoré. - prévenir WillMessage (facultatif)
-
Contrôle si le message AWS IoT Core LWT (LWT) est envoyé s'il est disponible lors de la déconnexion. Définissez sur
truepour empêcher l'envoi du message LWT. Réglez surfalsepour autoriser l'envoi. Par défaut, ce paramètre est défini surfalse(envoie LWT si disponible).
Syntaxe de l'API
L'DeleteConnectionAPI utilise le format de requête HTTP suivant :
DELETE /connections/<clientId>?cleanSession=<cleanSession>&preventWillMessage=<preventWillMessage> HTTP/1.1
Exemples de demandes :
// Basic disconnect (preserves session, allows LWT message) DELETE /connections/myDevice123 HTTP/1.1 // Disconnect and clear session DELETE /connections/myDevice123?cleanSession=TRUE HTTP/1.1 // Disconnect, clear session, and prevent LWT message DELETE /connections/myDevice123?cleanSession=TRUE&preventWillMessage=TRUE HTTP/1.1
Les requêtes réussies renvoient HTTP 200 OK sans aucun corps de réponse.
Note
Le nom du service utilisé par AWS Signature Version 4 pour signer les demandes est : iotdevicegateway. Vous pouvez trouver votre point de terminaison à l'aide de la aws iot describe-endpoint --endpoint-type iot:Data-ATS commande.
Autorisations requises
Pour utiliser l'DeleteConnectionAPI, vous devez disposer de l'autorisation IAM suivante :
iot:DeleteConnection
Vous pouvez étendre cette autorisation à des ID clients spécifiques à l'aide de politiques basées sur les ressources. Par exemple :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:DeleteConnection", "Resource": "arn:aws:iot:us-east-1:987654321:client/myDevice*" } ] }
Considérations importantes
Les clients déconnectés peuvent immédiatement tenter de se reconnecter, sauf si vous avez implémenté une logique supplémentaire pour empêcher la reconnexion. L'opération de déconnexion met uniquement fin à la connexion en cours et n'empêche pas la reconnexion d'une connexion. Si vous devez empêcher la reconnexion, envisagez d'implémenter une logique côté client ou de désactiver les informations d'identification d'un appareil.
Les limites de débit s'appliquent à l'API dans le cadre de la limitation de débit standard de AWS IoT Core l'API. Lorsque vous planifiez des opérations de déconnexion en masse, assurez-vous de tenir compte de ces limites et de mettre en œuvre une logique de nouvelle tentative et des stratégies de traitement par lots appropriées pour éviter les ralentissements. Pour plus d’informations, consultez Points de terminaison et quotas AWS IoT Core.
Réponses d'erreur
L'DeleteConnectionAPI peut renvoyer les réponses d'erreur suivantes :
- InvalidRequestException
-
La demande n'est pas valide. Cela peut se produire si le format de l'identifiant client n'est pas valide, contient un préfixe du signe dollar ($) ou si les paramètres requis sont manquants.
- ResourceNotFoundException
-
L'ID client spécifié n'existe pas ou n'est pas connecté actuellement, et il n'a pas de session permanente.
- UnauthorizedException
-
Vous n'êtes pas autorisé à effectuer cette opération. Assurez-vous d'avoir l'
iot:DeleteConnectionautorisation requise. - ForbiddenException
-
L'appelant n'est pas autorisé à faire la demande. Cela peut être dû à des autorisations IAM insuffisantes ou à des restrictions de politique basées sur les ressources.
- ThrottlingException
-
Le tarif dépasse la limite. Réduisez la fréquence de vos appels d'API et implémentez une logique de nouvelle tentative appropriée avec un ralentissement exponentiel.
- InternalFailureException
-
Une erreur inattendue est survenue. Réessayez la demande après un bref délai.
- ServiceUnavailableException
-
Le service est temporairement indisponible. Réessayez la demande après un bref délai.
Affichage des informations de connexion
Utilisez l'GetConnectionAPI pour récupérer des informations détaillées sur les connexions clientes MQTT actives, notamment l'état de la connexion, les détails des sessions et les informations réseau.
L'GetConnectionAPI renvoie des métadonnées de connexion complètes qui aident à résoudre les problèmes de connectivité, à surveiller le comportement des clients et à auditer les modèles de connexion. Vous pouvez utiliser ces informations pour comprendre le cycle de vie des connexions client et diagnostiquer les problèmes liés aux sessions MQTT. Les informations de connexion sont disponibles pendant 30 minutes après la déconnexion, que le client ait utilisé une session propre ou persistante. Pour les métadonnées déconnectées au-delà de 30 minutes, utilisez l'GetThingConnectivityDataAPI qui nécessite l'activation de l'indexation du parc.
Cas d’utilisation
L'GetConnectionAPI est utile pour résoudre les problèmes de connexion et surveiller le comportement des clients. Vous pouvez vérifier l'état de connectivité du client, vérifier les paramètres de session permanente et consulter les horodatages des connexions pour comprendre les modèles de connectivité des clients.
Les diagnostics réseau bénéficient également de cette API. Les détails de connexion incluent les adresses IP et les ports source et cible, qui permettent d'identifier les problèmes de routage réseau ou les problèmes de point de terminaison de connexion. Ces informations sont précieuses pour résoudre les problèmes de connectivité ou optimiser les configurations réseau.
Paramètres d'API
L'GetConnectionAPI accepte les paramètres suivants :
- ClientiD (obligatoire)
-
Identifiant unique du client MQTT pour lequel récupérer les détails de connexion. Ceci est spécifié dans le chemin de l'URL. L'ID client ne peut pas commencer par le signe du dollar ($).
Note
Les identifiants des clients MQTT peuvent contenir des caractères non valides dans les requêtes HTTP. Lorsque vous utilisez l'
GetConnectionAPI, vous devez encoder par URL (encodage en pourcentage) tous les caractères de l'ID client valides en MQTT mais pas en HTTP. Cela inclut les caractères spéciaux tels que les espaces, les barres obliques (/) et UTF-8 les caractères. Par exemple, un espace devient %20, une barre oblique devient %2F et le UTF-8 caractère ü devient %C 3% BC. Un codage correct garantit que les identifiants des clients MQTT sont correctement transmis lors de l'appel HTTP-based d'API.Considérations relatives au routage : le codage des URL est requis lorsque les identifiants clients contiennent à la fois des barres obliques et la chaîne « abonnements ». Sans encodage approprié, la structure du chemin peut être mal interprétée et votre demande sera acheminée vers l'
ListSubscriptionsAPI au lieu de.GetConnectionPar exemple, un identifiant client client/subscriptions doit être codé sous la forme Client%FSubscriptions pour garantir que la demande est correctement acheminée vers un appelGetConnectionplutôt que d'être interprétée comme un appel.ListSubscriptions - inclure SocketInformation (facultatif)
-
Type : Boolean
Valeur par défaut : false
Le
includeSocketInformationparamètre contrôle si les informations réseau au niveau du socket sont incluses dans la réponse de l'API. Lorsqu'elle est définie surtrue, la réponse inclut les champs suivants :sourceIpsourcePort,targetIp,targetPort,vpcEndpointId. Lorsqu'il n'includeSocketInformationest pas spécifié ou défini surfalse, ces champs de socket sont exclus de la réponse. Si leincludeSocketInformationparamètre est défini surtruemais que l'appelant n'est pas autorisé à consulter les informations du socket, l'appel d'API complet échoue avec 403 Forbidden.
Syntaxe de l'API
L'GetConnectionAPI utilise le format de requête HTTP suivant :
GET /connections/<client-id>?includeSocketInformation=false HTTP/1.1
Exemples de demandes :
GET /connections/myDevice123?includeSocketInformation=false HTTP/1.1 // Get connection details for a client with special characters (URL encoded) // Original client ID: "my device/123" GET /connections/my%20device%2F123?includeSocketInformation=true HTTP/1.1
Exemple de réponse pour un client connecté :
{ "clientId": "abcd12345fvgbh", "connected": true, "cleanSession": false, "connectedSince": 1573002340451, "thingName": "deviceABC", "sourceIp": "203.0.113.1", "sourcePort": 8883, "targetIp": "198.51.100.1", "targetPort": 8883, "keepAliveDuration": 60, "disconnectReason": null, "sessionExpiry": 3600 }
Champs de réponse :
- clientId
L'ID client du client MQTT.
- connected
État de connexion du client. Renvoie
truesi le client est actuellement connecté à AWS IoT Core, oufalses'il n'est pas connecté.- Séance propre
Indique si le client utilise une session propre. Retourne
truepour les sessions propres oufalsepour les sessions persistantes. Les sessions propres ne conservent pas leur état après la déconnexion, tandis que les sessions persistantes conservent les abonnements et les messages en file d'attente.- Connecté depuis
Horodatage Unix (en millisecondes) indiquant le moment où le client s'est connecté. Présent uniquement quand
connectedc'est le castrue.- Déconnecté depuis
Horodatage Unix (en millisecondes) indiquant le moment où le client s'est déconnecté. Présent uniquement quand
connectedc'est le casfalse.- thingName
Nom d'objet du client, présent uniquement lorsqu'un objet est associé au ClientiD.
- disconnectReason
La raison de la dernière déconnexion, si le client est actuellement déconnecté. Ce champ permet de déterminer si la déconnexion a été initiée par le client, par le serveur ou si elle est due à des problèmes de réseau. Présent uniquement quand
connectedc'est le casfalse. Pour les codes de motif de déconnexion, voir LifeCycleEvents.- garder AliveDuration
Intervalle de conservation en secondes spécifié par le client lors de l'établissement de la connexion. Cela détermine la fréquence à laquelle le client envoie des messages de maintien en vie pour maintenir la connexion.
- sourceIp
Adresse IP du client qui a initié la connexion. Elle n'
includeSocketInformationest renvoyée que si elle est définie surtrueet si vous êtes autorisé à récupérer ces informations.- sourcePort
Numéro de port utilisé par le client pour la connexion. Elle n'
includeSocketInformationest renvoyée que si elle est définie surtrueet si vous êtes autorisé à récupérer ces informations.- IP cible
Adresse IP à laquelle la demande de connexion a été envoyée. Elle n'
includeSocketInformationest renvoyée que si elle est définie surtrueet si vous êtes autorisé à récupérer ces informations.- Port cible
Numéro de port du AWS IoT Core point de terminaison auquel le client s'est connecté. Elle n'
includeSocketInformationest renvoyée que si elle est définie surtrueet si vous êtes autorisé à récupérer ces informations.- vpc EndpointId
ID du service de point de terminaison de VPC. Présent pour les clients connectés AWS IoT Core via un point de terminaison VPC. Elle n'
includeSocketInformationest renvoyée que si elle est définie surtrueet si vous êtes autorisé à récupérer ces informations.- Expiration de session
Configuration d'expiration de session persistante spécifiée ou définie par défaut par le client lors de l'établissement de la connexion. Cela détermine la durée pendant laquelle une session reste active après la déconnexion du client.
Note
Le nom du service utilisé par AWS Signature Version 4 pour signer les demandes est : iotdevicegateway. Vous pouvez trouver votre point de terminaison à l'aide de la aws iot describe-endpoint --endpoint-type iot:Data-ATS commande.
Autorisations requises
Pour utiliser l'GetConnectionAPI, vous devez disposer de l'autorisation IAM suivante :
iot:GetConnection
Vous pouvez étendre cette autorisation à des ID clients spécifiques à l'aide de politiques basées sur les ressources.
Astuce
Utilisez iot:IncludeSocketInformation cette condition pour mettre en œuvre un contrôle d'accès granulaire en fonction des exigences de confidentialité de votre organisation.
Exemples de politiques d'autorisation
Exemple 1 : Autoriser GetConnection avec des informations de socket pour tous les clients
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:GetConnection", "Resource": "arn:aws:iot:us-east-1:987654321:client/*" } ] }
Avec cette politique, l'appel d'API suivant renvoie les détails de connexion, y compris les informations du socket :
GET /connections/myDevice123?includeSocketInformation=true HTTP/1.1
Résultat : l'API renvoie tous les champs de connexionsourceIp, y comprissourcePort,targetIp, ettargetPort.
Exemple 2 : autoriser GetConnection mais refuser les informations de socket pour des clients spécifiques
Vous pouvez utiliser une approche basée sur les conditions ou une approche de refus explicite :
Condition-based approche :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:GetConnection", "Resource": "arn:aws:iot:us-east-1:987654321:client/myDevice*", "Condition": { "Bool": { "iot:IncludeSocketInformation": "false" } } } ] }
Approche de refus explicite :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "iot:GetConnection", "Resource": "arn:aws:iot:us-east-1:987654321:client/myDevice*", "Condition": { "Bool": { "iot:IncludeSocketInformation": "true" } } }, { "Effect": "Allow", "Action": ["iot:GetConnection"], "Resource": "arn:aws:iot:us-east-1:987654321:client/myDevice*" } ] }
Quelle que soit la politique, l'appel d'API suivant est refusé :
GET /connections/myDevice123?includeSocketInformation=true HTTP/1.1
Résultat : L'API renvoie une erreur 403 Forbidden car l'accès aux informations du socket est restreint pour ces clients.
Réponses d'erreur
L'GetConnectionAPI peut renvoyer les réponses d'erreur suivantes :
- InvalidRequestException
La demande n'est pas valide. Cela peut se produire si le format de l'identifiant client n'est pas valide, contient un préfixe du signe dollar ($) ou si les paramètres requis sont manquants. Code d’état HTTP : 400
- ResourceNotFoundException
L'ID client spécifié n'existe pas ou n'est pas connecté actuellement, et il n'a pas de session permanente. Code d’état HTTP :404
- ForbiddenException
L'appelant n'est pas autorisé à faire la demande. Cela peut être dû à des autorisations IAM insuffisantes ou à des restrictions de politique basées sur les ressources. Code d’état HTTP : 403
- ThrottlingException
Le tarif dépasse la limite. Réduisez la fréquence de vos appels d'API et implémentez une logique de nouvelle tentative appropriée avec un ralentissement exponentiel. Code d’état HTTP : 429
- InternalFailureException
Une erreur inattendue est survenue. Réessayez la demande après un bref délai. Code d’état HTTP : 500
Gestion des abonnements des clients
Utilisez l'ListSubscriptionsAPI pour récupérer tous les abonnements aux rubriques d'une session client MQTT. Cette API renvoie les abonnements aux clients connectés et aux clients hors ligne avec des sessions persistantes, offrant ainsi une visibilité sur les modèles d'abonnement des clients et aidant à résoudre les problèmes liés aux abonnements.
L'ListSubscriptionsAPI fournit des informations complètes sur les abonnements qui permettent d'auditer le comportement des clients, de résoudre les problèmes de livraison des messages et de comprendre les modèles d'abonnement sur l'ensemble de votre parc d'appareils. Vous pouvez utiliser ces informations pour vérifier que les clients sont abonnés aux rubriques attendues et identifier les conflits d'abonnement potentiels.
Cas d’utilisation
L'ListSubscriptionsAPI vous aide à résoudre les problèmes de livraison des messages et à vérifier le comportement des clients en matière d'abonnement. Utilisez cette API pour vérifier les sujets auxquels un client est abonné, valider les niveaux de QoS et identifier les abonnements qui se chevauchent ou les cartes whildcards trop permissives.
Les scénarios de gestion des abonnements bénéficient également de cette API. Lorsque des clients signalent des messages manquants ou une livraison inattendue, vous pouvez utiliser cette API pour vérifier leurs abonnements actuels et vous assurer qu'ils correspondent à la configuration attendue. Cela est particulièrement utile pour le débogage de hiérarchies d'abonnement complexes et de configurations d'abonnement partagées.
Paramètres d'API
L'ListSubscriptionsAPI accepte les paramètres suivants :
- ClientiD (obligatoire)
-
Identifiant unique du client MQTT pour lequel récupérer les abonnements. Ceci est spécifié dans le chemin de l'URL. L'ID client ne peut pas commencer par le signe du dollar ($).
Note
Les identifiants des clients MQTT peuvent contenir des caractères non valides dans les requêtes HTTP. Lorsque vous utilisez l'
ListSubscriptionsAPI, vous devez encoder par URL (encodage en pourcentage) tous les caractères de l'ID client valides en MQTT mais pas en HTTP. Cela inclut les caractères spéciaux tels que les espaces, les barres obliques (/) et UTF-8 les caractères. Par exemple, un espace devient %20, une barre oblique devient %2F et le UTF-8 caractère ü devient %C 3% BC. Un codage correct garantit que les identifiants des clients MQTT sont correctement transmis lors de l'appel HTTP-based d'API.Considérations relatives au routage : le codage des URL est requis lorsque les identifiants clients contiennent à la fois des barres obliques et la chaîne « abonnements ». Sans encodage approprié, la structure du chemin peut être mal interprétée et votre demande sera acheminée vers l'
ListSubscriptionsAPI au lieu de.GetConnectionPar exemple, un identifiant client client/subscriptions doit être codé sous la forme Client%FSubscriptions pour garantir que la demande est correctement acheminée vers un appelGetConnectionplutôt que d'être interprétée comme un appel.ListSubscriptions - NextToken (facultatif)
-
Le jeton de pagination permettant de récupérer le prochain ensemble de résultats. Utilisez ce jeton issu d'une réponse précédente pour continuer à paginer dans de grandes listes d'abonnés.
- MaxResults (facultatif)
-
Le nombre maximum d'abonnements à renvoyer dans une seule réponse. La plage valide est comprise entre 1 et 200. La valeur par défaut est 20.
Syntaxe de l'API
L'ListSubscriptionsAPI utilise le format de requête HTTP suivant :
GET /connections/<client-id>/subscriptions?nextToken=token&maxResults=max HTTP/1.1
Exemples de demandes :
// Get subscriptions for a specific client GET /connections/myDevice123/subscriptions HTTP/1.1 // Get subscriptions with custom page size GET /connections/myDevice123/subscriptions?maxResults=50 HTTP/1.1 // Get next page of results using pagination token GET /connections/myDevice123/subscriptions?nextToken=eyJhbGciOiJIUzI1NiJ9&maxResults=50 HTTP/1.1
Exemple de réponse :
{ "subscriptions": [ {"topicFilter": "device/myDevice123/commands", "qos": 1}, {"topicFilter": "device/myDevice123/shadow", "qos": 0} ], "nextToken": "eyJhbGciOiJIUzI1NiJ9" }
Champs de réponse :
- abonnements
Un ensemble d'objets d'abonnement, chacun contenant un filtre de rubrique et un niveau de QoS.
- Filtre thématique
Le filtre de rubrique MQTT auquel le client est abonné. Cela peut inclure des caractères génériques (+, #) pour la correspondance des modèles.
- qos
Le niveau de qualité de service de l'abonnement (0 ou 1).
- nextToken
Le jeton de pagination permettant de récupérer des résultats supplémentaires. Présent uniquement lorsqu'il y a plus d'abonnements à récupérer.
Note
Le nom du service utilisé par AWS Signature Version 4 pour signer les demandes est : iotdevicegateway. Vous pouvez trouver votre point de terminaison à l'aide de la aws iot describe-endpoint --endpoint-type iot:Data-ATS commande.
Autorisations requises
Pour utiliser l'ListSubscriptionsAPI, vous devez disposer de l'autorisation IAM suivante :
iot:ListSubscriptions
Vous pouvez étendre cette autorisation à des ID clients spécifiques à l'aide de politiques basées sur les ressources. Par exemple :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:ListSubscriptions", "Resource": "arn:aws:iot:us-east-1:987654321:client/myDevice*" } ] }
Réponses d'erreur
L'ListSubscriptionsAPI peut renvoyer les réponses d'erreur suivantes :
- InvalidRequestException
La demande n'est pas valide. Code d’état HTTP : 400
- ResourceNotFoundException
La ressource spécifiée n'existe pas. Code d’état HTTP :404
- ForbiddenException
L'appelant n'est pas autorisé à faire la demande. Code d’état HTTP : 403
- ThrottlingException
Le tarif dépasse la limite. Code d’état HTTP : 429
- InternalFailureException
Une erreur inattendue est survenue. Code d’état HTTP : 500
Gestion des connexions MQTT à l'aide de la console
Vous pouvez utiliser la AWS IoT console pour déconnecter les appareils MQTT et gérer leurs connexions. La console fournit une interface intuitive permettant de visualiser les appareils connectés et d'effectuer des opérations de déconnexion.
Afficher les clients MQTT connectés
Cette procédure explique comment afficher les périphériques MQTT actuellement connectés dans la AWS IoT console.
Pour afficher les appareils MQTT connectés
-
Ouvrez la AWS IoT console
. -
Dans le volet de navigation de gauche, choisissez Gérer, puis Tous les appareils.
-
Choisissez Connexions client pour afficher la liste des appareils MQTT actuellement connectés.
-
La page Connexions client affiche des informations complètes sur chaque appareil connecté. Vous pouvez consulter l'ID client, qui sert d'identifiant unique pour le périphérique MQTT, et l'état de la connexion qui indique si le périphérique est actuellement connecté. La page affiche également l'horodatage Connecté depuis le moment où l'appareil a établi sa connexion, l'adresse IP source à partir de laquelle le périphérique se connecte et l'intervalle Keep alive configuré pour la connexion de l'appareil.
Afficher les abonnements aux clients MQTT
Cette procédure explique comment afficher les abonnements aux rubriques pour un client MQTT spécifique à l'aide de la AWS IoT console.
Pour consulter les abonnements des clients
-
Ouvrez la AWS IoT console
. -
Dans le volet de navigation de gauche, choisissez Gérer, puis Tous les appareils.
-
Choisissez Connexions client pour afficher la liste des périphériques MQTT.
-
Recherchez l'ID client spécifique pour lequel vous souhaitez consulter les abonnements à l'aide de la fonctionnalité de recherche.
-
Sélectionnez l'ID client pour afficher sa page de détails.
-
Sur la page des détails du client, recherchez le tableau des sujets abonnés. Ce tableau affiche tous les filtres de rubrique auxquels le client est actuellement abonné, ainsi que les niveaux de qualité de service (QoS) correspondants.
-
Le tableau des sujets souscrits indique :
Filtre de sujet : modèle de sujet MQTT auquel le client est abonné, qui peut inclure des caractères génériques (+, #)
QoS : niveau de qualité de service de l'abonnement (0 ou 1)
Note
Les informations d'abonnement sont disponibles à la fois pour les clients connectés et pour les clients hors ligne ayant des sessions persistantes. Si un client n'a aucun abonnement actif, le tableau sera vide.
Déconnecter un appareil MQTT
Cette procédure explique comment déconnecter un périphérique MQTT spécifique à l'aide de la AWS IoT console.
Pour déconnecter un périphérique MQTT
-
Sur la page Connexions client, localisez l'appareil que vous souhaitez déconnecter.
-
Sélectionnez l'appareil en cliquant sur le bouton radio situé à côté de l'ID client.
-
Choisissez Actions, puis sélectionnez Déconnecter le client.
-
Dans la boîte de dialogue du client de déconnexion, configurez les options de déconnexion :
-
Pour Nettoyer la session, vous pouvez choisir de conserver ou d'effacer l'état de la session. L'option Conserver l'état de session permet de conserver les informations de session de l'appareil, y compris les abonnements et les messages en file d'attente, ce qui permet à l'appareil de reprendre sa session précédente lors de sa reconnexion. Vous pouvez également choisir Effacer l'état de session pour supprimer toutes les informations de session lors de la déconnexion de l'appareil, le forçant à établir une toute nouvelle session lorsqu'il se reconnecte.
-
Pour les messages de dernière volonté, vous pouvez contrôler si le message LWT de l'appareil est publié lors de la déconnexion. Si vous sélectionnez Autoriser le message LWT, le message de dernière volonté de l'appareil est publié lors de la déconnexion, qui informe les autres appareils de la déconnexion inattendue. Si vous sélectionnez Empêcher le message LWT, vous empêchez la publication du message Last Will and Testament, ce qui est utile lors de la maintenance planifiée ou des déconnexions contrôlées.
-
-
Choisissez Déconnecter pour confirmer l'action.
-
La console affiche un message de confirmation lorsque l'appareil est correctement déconnecté. L'appareil n'apparaîtra plus dans la liste des appareils connectés.
Note
Les appareils déconnectés peuvent immédiatement tenter de se reconnecter, sauf si vous avez implémenté une logique supplémentaire pour empêcher la reconnexion. L'opération de déconnexion met uniquement fin à la connexion en cours.
AWS IoT différences par rapport aux spécifications MQTT
L’implémentation de l’agent de messages est basée sur les spécifications MQTT v3.1.1
AWS IoT ne prend pas en charge les paquets suivants pour MQTT 3 : PUBREC, PUBREL et PUBCOMP.
AWS IoT ne prend pas en charge les paquets suivants pour MQTT 5 : PUBREC, PUBREL, PUBCOMP et AUTH.
AWS IoT ne prend pas en charge la redirection du serveur MQTT 5.
AWS IoT prend en charge les niveaux de qualité de service (QoS) MQTT 0 et 1 uniquement. AWS IoT ne prend pas en charge la publication ou l'abonnement avec QoS de niveau 2. Lorsque QoS 2 est requis, l’agent de messages , n’envoie pas de PUBACK ou de SUBACK.
En effet AWS IoT, l'abonnement à une rubrique dont le niveau de QoS est 0 signifie qu'un message est délivré zéro fois ou plus. Un message peut être remis plusieurs fois. Les messages remis plusieurs fois peuvent être envoyés avec un ID de paquet différent. Dans ce cas, l'indicateur DUP n'est pas défini.
Lorsqu'il répond à une demande de connexion, l'agent de messages envoie un message CONNACK. Ce message contient un indicateur précisant si la connexion reprend une session précédente.
CloudWatch Journaux AWS IoT entrées du journal
Le courtier de AWS IoT messages génère une entrée de journal avec un « eventType of » Connect lorsqu'un client MQTT se connecte.
Exemple d'entrée dans le journal Connect
{ "timestamp": "2017-08-10 15:37:23.476", "logLevel": "INFO", "traceId": "20b23f3f-d7f1-feae-169f-82263394fbdb", "accountId": "123456789012", "status": "Success", "eventType": "Connect", "protocol": "MQTT", "clientId": "abf27092886e49a8a5c1922749736453", "thingName": "myDevice", "principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167", "sourceIp": "205.251.233.181", "sourcePort": 13490, "keepAliveDuration": 60, "sessionExpiry": 3600, "cleanSession": boolean }
Outre les attributs courants des CloudWatch journaux, les entrées du journal Connect contiennent les attributs suivants :
- clientId
L'ID du client formulant la demande.
- principalId
L'ID du mandataire formulant la demande.
- thingName
Le nom de l'objet du client. Renvoie une valeur lorsqu'un objet est associé à l'ID client.
- protocole ;
Protocole utilisé pour effectuer la demande. Les valeurs valides sont MQTT ou HTTP.
- sourceIp
L'adresse IP d'origine de la demande.
- sourcePort
Le port d'origine de la demande.
- garder AliveDuration
Intervalle de conservation en secondes spécifié par le client lors de l'établissement de la connexion.
- Expiration de session
Configuration d'expiration de session persistante spécifiée par le client lors de l'établissement de la connexion.
- Séance propre
Indique si le client utilise une session propre.