Communiquer avec DPS à l’aide du protocole MQTT
Azure IoT Device Provisioning Service (DPS) permet aux appareils de communiquer avec le point de terminaison d’appareil DPS en utilisant :
- MQTT v3.1.1 sur le port 8883
- MQTT v3.1.1 sur WebSocket sur le port 443.
DPS n’est pas un MQTT broker complet et ne prend pas en charge tous les comportements spécifiés dans la norme MQTT v3.1.1. Cet article décrit comment les appareils peuvent utiliser des comportements MQTT pris en charge pour communiquer avec DPS.
Toutes les communications des appareils avec DPS doivent être sécurisées à l’aide de TLS/SSL. Par conséquent, DPS ne prend pas en charge les connexions non sécurisées sur le port 1883.
Remarque
Actuellement, DPS ne prend pas en charge les appareils utilisant le mécanisme d'attestation TPM via le protocole MQTT.
Connexion à DPS
Un appareil peut utiliser le protocole MQTT pour se connecter à une instance DPS en utilisant l’une des options suivantes.
- Bibliothèques des SDK d’approvisionnement Azure IoT.
- Protocole MQTT directement.
Utilisation directe du protocole MQTT (en tant qu’appareil)
Si un appareil ne peut pas utiliser les SDK d’appareil, il peut toujours se connecter aux points de terminaison d’appareil publics à l’aide du protocole MQTT sur le port 8883. Dans le paquet CONNECT, l’appareil doit utiliser les valeurs suivantes :
Dans le champ ClientId, utilisez registrationId.
Pour le champ Username, utilisez
{idScope}/registrations/{registration_id}/api-version=2019-03-31
, où{idScope}
est l’étendue de l’ID du DPS, et{registration_id}
l’ID d’inscription de votre appareil.Remarque
Si vous utilisez une authentification par certificat X.509, l’ID d’inscription est fourni par le nom commun sujet de votre certificat feuille/d’appareil (entité finale).
{registration_id}
dans le champ Username doit correspondre au nom commun.Dans le champ Password, utilisez un jeton SAP. Le format du jeton SAP est identique pour les protocoles HTTPS et AMQP :
SharedAccessSignature sr={URL-encoded-resourceURI}&sig={signature-string}&se={expiry}&skn=registration
resourceURI doit respecter le format{idScope}/registrations/{registration_id}
. Le nom de la stratégie (skn
) doit être défini surregistration
.Remarque
Si vous utilisez l’authentification par certificat X.509, les mots de passe de jeton SAS ne sont pas obligatoires.
Pour plus d'informations sur la génération de jetons SAS, voir la section consacrée aux jetons de sécurité dans Contrôler l’accès à DPS.
La liste suivante inclut les comportements spécifiques à l’implémentation de DPS :
DPS ne prend pas en charge les sessions persistantes. DPS traite chaque session comme non persistante, quelle que soit la valeur de l’indicateur CleanSession. Nous vous recommandons de définir CleanSession sur true.
Quand une application d’appareil s’abonne à une rubrique avec QoS 2, DPS accorde le niveau QoS 1 maximal dans le paquet SUBACK. Après cela, DPS remet les messages à l’appareil à l’aide de QoS 1.
Configuration TLS/SSL
Pour utiliser le protocole MQTT directement, votre client doit se connecter via le protocole TLS 1.2. Sans cette étape, des erreurs de connexion se produiront.
Inscription d’un appareil
Pour inscrire un appareil via DPS, l’appareil doit s’abonner en utilisant un $dps/registrations/res/#
en tant que Filtre de rubrique. Le caractère générique à plusieurs niveaux #
dans le Filtre de rubrique est utilisé uniquement pour autoriser l’appareil à recevoir d’autres propriétés dans le nom de la rubrique. DPS n’autorise pas l’utilisation des caractères génériques #
ou ?
pour filtrer les sous-rubriques. DPS n’étant pas un broker de messagerie éditeur-abonné à usage général, il prend uniquement en charge les noms de rubriques et les filtres de rubriques documentés.
L'appareil doit publier un message de registre sur DPS en utilisant $dps/registrations/PUT/iotdps-register/?$rid={request_id}
comme Topic Name. La charge utile doit contenir l'objet Device Registration au format JSON.
Dans un scénario réussi, l’appareil reçoit une réponse sur le nom de rubrique $dps/registrations/res/202/?$rid={request_id}&retry-after=x
, où x est la valeur retry-after en secondes.
Interrogation de l'état de l'opération d'inscription
L'appareil doit interroger le service périodiquement pour recevoir le résultat de l'opération d'inscription de l'appareil. En supposant que l’appareil est déjà inscrit à la rubrique $dps/registrations/res/#
, il peut publier un message get operation status (obtenir l’état d’une l’opération) dans le nom de la rubrique $dps/registrations/GET/iotdps-get-operationstatus/?$rid={request_id}&operationId={operationId}
. L'ID d'opération dans ce message doit être la valeur reçue dans le message de réponse RegistrationOperationStatus à l'étape précédente. Dans le cas réussi, le service répond dans la rubrique $dps/registrations/res/200/?$rid={request_id}
. La charge utile de la réponse contient l’objet RegistrationOperationStatus. L'appareil doit continuer à interroger le service si le code de réponse est 202 après un délai égal à la période retry-after. L'opération d'inscription de l'appareil est réussie si le service renvoie un code d'état 200.
Connexion via WebSocket
Lors d'une connexion via WebSocket, spécifiez le sous-protocole comme mqtt
. Suivez RFC 6455.
Étapes suivantes
Pour plus d’informations sur le protocole MQTT, consultez la documentation de MQTT.
Pour parcourir un exemple de code MQTT, consultez Exemples d’application MQTT.
Pour explorer davantage les capacités de DPS, consultez :