Partager via


Envoi de messages cloud à appareil avec IoT Hub (Node.js)

Azure IoT Hub est un service entièrement géré qui permet d’autoriser des communications bidirectionnelles fiables et sécurisées entre des millions d’appareils et un serveur principal de solution.

Cet article vous montre comment :

  • Envoyer des messages cloud-à-appareil (C2D) de votre back-end de solution vers un seul appareil par IoT Hub

  • Recevoir des messages cloud-à-appareil sur un appareil

  • À partir du back-end de votre solution, demandez l’accusé de réception (commentaires) pour les messages envoyés à un appareil depuis IoT Hub

Notes

Les fonctionnalités décrites dans cet article sont uniquement disponibles au niveau Standard d’IoT Hub. Pour plus d’informations sur les niveaux de base et standard/gratuit d’IoT Hub, consultez Choisir le niveau IoT Hub correspondant à votre solution.

À la fin de cet article, vous exécuterez deux applications de console Node.js :

  • simple_sample_device : exemple d’application d’appareil incluse avec le kit de développement logiciel (SDK) Microsoft Azure IoT pour Node.js, qui se connecte à votre hub IoT et reçoit des messages cloud à appareil.

  • SendCloudToDevice : application de service qui envoie un message cloud-à-appareil à l’application d’appareil par le biais d’IoT Hub, puis reçoit son accusé de réception.

Notes

IoT Hub offre la prise en charge de kits SDK pour plusieurs plateformes d’appareils et langages (notamment C, Java, Python et JavaScript) par le biais de kits Azure IoT device SDK.

Pour en savoir plus sur les messages cloud-à-appareil, consultez Envoyer des messages cloud-à-appareil à partir d’IoT Hub.

Prérequis

  • Un abonnement Azure. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

  • Un hub IoT dans votre abonnement Azure. Si vous n’avez pas encore de hub, vous pouvez suivre les étapes décrites dans Créer un hub IoT.

  • Un appareil inscrit dans votre hub IoT. Si vous n’avez pas encore inscrit d’appareil, inscrivez-en un dans le portail Azure.

  • Cet article utilise des exemples de code issus du SDK Azure IoT pour Node.js.

    • Téléchargez ou clonez le référentiel du SDK depuis GitHub sur votre machine de développement.
    • Assurez-vous que Node.js version 10.0.x ou supérieure est installé sur votre ordinateur de développement. Préparer votre environnement de développement décrit l’installation de Node.js sur Windows ou sur Linux.
  • Vérifiez que le port 8883 est ouvert dans votre pare-feu. L’exemple d’appareil décrit dans cet article utilise le protocole MQTT, qui communique via le port 8883. Ce port peut être bloqué dans certains environnements réseau professionnels et scolaires. Pour plus d’informations sur les différentes façons de contourner ce problème, consultez Connexion à IoT Hub (MQTT).

Obtention de la chaîne de connexion de l’appareil

Dans cet article, vous exécutez un exemple d’application qui simule un appareil, qui reçoit des messages cloud à appareil envoyés via votre IoT Hub. L’exemple d’application simple_sample_device inclus avec le SDK Microsoft Azure IoT pour Node.js se connecte à votre hub IoT et agit comme votre appareil simulé. L’exemple utilise la chaîne de connexion principale de l’appareil inscrit sur votre hub IoT.

Pour obtenir la chaîne de connexion principale d’un appareil inscrit sur votre hub IoT, procédez comme suit :

  1. Dans le portail Azure, sélectionnez Groupes de ressources. Sélectionnez le groupe de ressources dans lequel se trouve votre hub, puis sélectionnez votre hub dans la liste des ressources.

  2. Dans le volet gauche de votre IoT Hub, sous Gestion des appareils, sélectionnez Appareils.

  3. Dans la liste des appareils, sélectionnez l’appareil approprié.

  4. Copiez la Chaîne de connexion principale, puis enregistrez la valeur.

    Capture d’écran qui montre comment récupérer la chaîne de connexion primaire pour un appareil inscrit dans votre IoT Hub dans le portail Azure.

Recevoir des messages dans l’application d’appareil

Dans cette section, exécutez l’exemple d’application d’appareil simple_sample_device pour recevoir les messages C2D envoyés via votre hub IoT. Ouvrez une nouvelle invite de commandes et accédez au dossier azure-iot-sdk-node\device\samples\javascript, dans le dossier où vous avez développé le SDK C# Azure IoT. Exécutez les commandes suivantes, en remplaçant la valeur de l’espace réservé {Your device connection string} par la chaîne de connexion de l’appareil que vous avez copiée à partir de l’appareil inscrit dans votre hub IoT.

set IOTHUB_DEVICE_CONNECTION_STRING={Your device connection string}
node simple_sample_device.js

La sortie suivante provient de l’exemple d’application d’appareil après son démarrage et sa connexion à votre hub IoT :

Client connected
Client connected
Client connected
Sending message: {"deviceId":"myFirstDevice","windSpeed":10.949952400617569,"temperature":26.0096515658525,"humidity":72.59398225838534}
Client connected
Client connected
send status: MessageEnqueued
Sending message: {"deviceId":"myFirstDevice","windSpeed":12.917649160180087,"temperature":27.336831253904613,"humidity":77.37300365434534}

Dans cet exemple, l'appareil appelle la fonction complete afin de notifier IoT Hub qu'il a traité le message et que celui-ci peut être supprimé de la file d'attente de l'appareil. L’appel de la fonction complete n’est pas nécessaire et peut être omis si vous utilisez le transport MQTT. En revanche, il est obligatoire pour AMQP et HTTPS.

Avec AMQP et HTTPS, mais pas MQTT, l’appareil peut également :

  • abandonner un message - IoT Hub conserve alors le message dans la file d’attente de l’appareil pour un traitement ultérieur ;
  • rejeter un message, ce qui le supprime définitivement de la file d’attente de l’appareil.

S’il se produit un événement qui empêche l’appareil de traiter, d’abandonner ou de rejeter le message, IoT Hub le met à nouveau en file d’attente après un délai d’attente déterminé. C’est la raison pour laquelle la logique de traitement des messages de l’application pour périphérique doit être idempotente pour qu’un message identique reçu plusieurs fois produise le même résultat.

Pour plus d’informations sur le cycle de vie des messages cloud-à-appareil et sur la manière dont l’IoT Hub traite les messages cloud-à-appareil, consultez Envoyer des messages cloud-à-appareil à partir d’un hub IoT.

Notes

Si vous utilisez HTTPS plutôt que MQTT ou AMQP comme moyen de transport, l'instance Client ne vérifie pas régulièrement les messages provenant d'IoT Hub (au minimum toutes les 25 minutes). Pour plus d’informations sur les différences de prise en charge entre MQTT, AMQP et HTTPS, consultez Conseils sur les communications cloud-à-appareil et Choisir un protocole de communication.

Obtenir la chaîne de connexion du hub IoT

Dans cet article, vous allez créer un service principal pour envoyer des messages cloud-à-appareil via votre IoT Hub. Pour envoyer des messages cloud-à-appareil, votre service a besoin de l'autorisation de connexion de service. Par défaut, chaque IoT Hub est créé avec une stratégie d’accès partagé nommée service qui accorde cette autorisation.

Pour obtenir la chaîne de connexion IoT Hub pour la stratégie service, procédez comme suit :

  1. Dans le portail Azure, sélectionnez Groupes de ressources. Sélectionnez le groupe de ressources dans lequel se trouve votre hub, puis sélectionnez votre hub dans la liste des ressources.

  2. Dans le volet de gauche de votre IoT Hub, sélectionnez Stratégies d’accès partagé.

  3. Dans la liste des stratégies, sélectionnez la stratégie service.

  4. Copiez la Chaîne de connexion principale, puis enregistrez la valeur.

Capture d’écran qui montre comment récupérer la chaîne de connexion de votre IoT Hub dans le portail Azure.

Pour plus d’informations sur les autorisations et les stratégies d’accès partagé IoT Hub, consultez Contrôle d’accès et autorisations.

Envoi d’un message cloud vers appareil

Dans cette section, vous allez créer une application de console Node.js qui envoie des messages cloud-à-appareil à l’application de l’appareil simulé. Vous avez besoin de l’ID d’appareil de votre appareil et de votre chaîne de connexion IoT Hub.

  1. Créez un dossier vide appelé sendcloudtodevicemessage. Ouvrez une invite de commandes, accédez au dossier sendcloudtodevicemessage, puis exécutez la commande suivante pour créer un fichier package.json dans ce dossier. Appuyez sur Entrée à chaque invite présentée par la commande npm pour accepter la valeur par défaut des invites :

    npm init
    
  2. À l’invite de commandes, dans le dossier sendcloudtodevicemessage, exécutez la commande suivante pour installer le package azure-iothub :

    npm install azure-iothub --save
    
  3. À l’aide d’un éditeur de texte, créez un fichier SendCloudToDeviceMessage.js dans le dossier sendcloudtodevicemessage.

  4. Ajoutez les instructions require ci-dessous au début du fichier SendCloudToDeviceMessage.js :

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. Ajoutez le code suivant au fichier SendCloudToDeviceMessage.js . Remplacez les valeurs d’espace réservé « {iot hub connection string} » et « {device ID} » par la chaîne de connexion de Hub IoT et l’ID d’appareil que vous avez notés précédemment :

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. Ajoutez la fonction suivante pour imprimer les résultats de l’opération sur la console :

    function printResultFor(op) {
      return function printResult(err, res) {
        if (err) console.log(op + ' error: ' + err.toString());
        if (res) console.log(op + ' status: ' + res.constructor.name);
      };
    }
    
  7. Ajoutez la fonction suivante pour imprimer les messages d’accusé de réception sur la console :

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. Ajoutez le code suivant pour envoyer un message à votre appareil et gérer le message de commentaires lorsque l’appareil accuse réception d’un message cloud-à-appareil :

    serviceClient.open(function (err) {
      if (err) {
        console.error('Could not connect: ' + err.message);
      } else {
        console.log('Service client connected');
        serviceClient.getFeedbackReceiver(receiveFeedback);
        var message = new Message('Cloud to device message.');
        message.ack = 'full';
        message.messageId = "My Message ID";
        console.log('Sending message: ' + message.getData());
        serviceClient.send(targetDevice, message, printResultFor('send'));
      }
    });
    
  9. Enregistrez et fermez le fichier SendCloudToDeviceMessage.js .

Exécution des applications

Vous êtes maintenant prêt à exécuter les applications.

  1. Lors de l'invite de commandes du dossier azure-iot-sdk-node\device\samples\javascript, exécutez la commande suivante pour envoyer les données de télémétrie à IoT Hub et écouter les messages cloud-à-appareil :

    node simple_sample_device.js
    

    Exécution de l’application de périphérique simulé

  2. À l’invite de commandes dans le dossier sendcloudtodevicemessage, exécutez la commande suivante pour envoyer un message cloud-à-appareil, puis attendez de recevoir l’accusé de réception :

    node SendCloudToDeviceMessage.js
    

    Exécutez l’application pour envoyer la commande cloud-à-appareil

    Notes

    Par souci de simplicité, cet article n’implémente aucune stratégie de nouvelles tentatives. Dans le code de production, vous devez implémenter des stratégies de nouvelle tentative (par exemple, une interruption exponentielle), comme indiqué dans l’article Gestion des erreurs temporaires.

Étapes suivantes

Dans cet article, vous avez appris à envoyer et recevoir des messages de cloud-à-appareil.