Share via


Senden von C2D-Nachrichten mit IoT Hub (Node.js)

Azure IoT Hub ist ein vollständig verwalteter Dienst, der eine zuverlässige und sichere bidirektionale Kommunikation zwischen Millionen von Geräten und einem Lösungs-Back-End ermöglicht.

In diesem Artikel lernen Sie Folgendes:

  • Senden von Cloud-zu-Gerät (C2D)-Nachrichten von Ihrem Lösungs-Back-End an ein einzelnes Gerät über IoT Hub

  • Empfangen von Cloud-zu-Gerät-Nachrichten auf einem Gerät

  • Anfordern einer Übermittlungsbestätigung (Feedback) bei Ihrem Lösungs-Back-End für Nachrichten, die von IoT Hub an ein Gerät gesendet wurden

Hinweis

Die in diesem Artikel beschriebenen Features stehen nur im Standard-Tarif von IoT Hub zur Verfügung. Weitere Informationen zu den IoT Hub-Tarifen „Basic“ und „Standard/Free“ finden Sie unter Wählen des richtigen IoT Hub-Tarifs für Ihre Lösung.

Am Ende dieses Artikels führen Sie zwei Node.js-Konsolen-Apps aus:

  • simple_sample_device: Eine im Microsoft Azure IoT SDK für .NET enthaltene Beispiel-Geräte-App, die eine Verbindung mit Ihrem IoT Hub herstellt und Cloud-zu-Gerät-Nachrichten empfängt.

  • SendCloudToDevice: Eine Dienst-App, die über IoT Hub eine Cloud-zu-Gerät-Nachricht an die Geräte-App sendet und die zugehörige Übermittlungsbestätigung empfängt.

Hinweis

IoT Hub bietet durch die Azure IoT-Geräte-SDKs Unterstützung für zahlreiche Geräteplattformen und Sprachen, (C, Java, Python und JavaScript).

Weitere Informationen zu Cloud-zu-Gerät-Nachrichten finden Sie unter Senden von Cloud-zu-Gerät-Nachrichten von einem IoT-Hub.

Voraussetzungen

  • Ein Azure-Abonnement. Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

  • Ein IoT Hub in Ihrem Azure-Abonnement. Wenn Sie noch keinen Hub haben, können Sie die Schritte unter Erstellen eines IoT-Hubs ausführen.

  • Ein in Ihrem IoT-Hub registriertes Gerät. Wenn Sie noch kein Gerät registriert haben, registrieren Sie eins im Azure-Portal.

  • In diesem Artikel wird Beispielcode aus dem Azure IoT-SDK für Node.js verwendet.

    • Sie können das SDK-Repository von GitHub auf Ihren Entwicklungscomputer herunterladen oder klonen.
    • Stellen Sie sicher, dass auf dem Entwicklungscomputer mindestens die Node.js-Version 10.0.x installiert ist. In Vorbereiten Ihrer Entwicklungsumgebung wird beschrieben, wie Node.js für diesen Artikel entweder auf Windows oder Linux installiert wird.
  • Stellen Sie sicher, dass der Port 8883 in Ihrer Firewall geöffnet ist. Das Beispielgerät in diesem Artikel verwendet das MQTT-Protokoll, das über Port 8883 kommuniziert. In einigen Netzwerkumgebungen von Unternehmen oder Bildungseinrichtungen ist dieser Port unter Umständen blockiert. Weitere Informationen und Problemumgehungen finden Sie unter Herstellen einer Verbindung mit IoT Hub (MQTT).

Abrufen der Geräte-Verbindungszeichenfolge

In diesem Artikel führen Sie eine Beispiel-App aus, die ein Gerät simuliert, das Cloud-zu-Gerät-Nachrichten empfängt, die über Ihren IoT Hub gesendet werden. Die Beispiel-App simple_sample_device, die im Microsoft Azure IoT SDK für Node.js enthalten ist, stellt eine Verbindung mit Ihrem IoT Hub her und fungiert als simuliertes Gerät. Im Beispiel wird die primäre Verbindungszeichenfolge des registrierten Geräts in Ihrem IoT Hub verwendet.

Führen Sie die folgenden Schritte aus, um die primäre Verbindungszeichenfolge für ein Gerät abzurufen, das bei Ihrem IoT Hub registriert ist:

  1. Wählen Sie im Azure-Portal die Option Ressourcengruppen aus. Wählen Sie die Ressourcengruppe aus, in der sich der Hub befindet, und wählen Sie dann in der Liste der Ressourcen Ihren Hub aus.

  2. Wählen Sie im linken Bereich Ihres IoT Hubs unter Geräteverwaltung die Option Geräte aus.

  3. Wählen Sie in der Liste das entsprechende Gerät aus.

  4. Kopieren Sie die primäre Verbindungszeichenfolge und speichern Sie den Wert.

    Screenshot, der zeigt, wie Sie die primäre Verbindungszeichenfolge für ein bei Ihrem IoT Hub registriertes Gerät im Azure-Portal abrufen können.

Empfangen von Nachrichten in der Geräte-App

Führen Sie in diesem Abschnitt die Beispiel-Geräte-App simple_sample_device aus, um C2D-Nachrichten zu empfangen, die über Ihren IoT Hub gesendet werden. Öffnen Sie eine neue Eingabeaufforderung und navigieren Sie zum Ordner azure-iot-sdk-node\device\samples\javascript unter dem Ordner, in dem Sie das Azure IoT Node.js-SDK erweitert haben. Führen Sie die folgenden Befehle aus und ersetzen Sie den Platzhalterwert {Your device connection string} durch die Geräteverbindungszeichenfolge, die Sie vom registrierten Gerät in Ihrem IoT Hub kopiert haben.

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

Die folgende Ausgabe stammt aus der Beispiel-Geräte-App, nachdem sie erfolgreich gestartet wurde und eine Verbindung mit Ihrem IoT Hub hergestellt hat:

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}

In diesem Beispiel ruft das Gerät die Funktion complete zur Benachrichtigung von IoT Hub auf, dass die Nachricht verarbeitet wurde und aus der Gerätewarteschlange sicher entfernt werden kann. Der Aufruf von complete ist nicht erforderlich, wenn Sie den MQTT-Transport verwenden. Er kann weggelassen werden. Für AMQP und HTTPS ist er erforderlich.

Mit AMQP und HTTPS, aber nicht MQTT, kann das Gerät auch folgende Aktionen ausführen:

  • Eine Nachricht vorübergehend verwerfen, sodass IoT Hub sie für zukünftige Nutzung in der Gerätewarteschlange beibehält.
  • Eine Nachricht ablehnen, wodurch sie dauerhaft aus der Gerätewarteschlange entfernt wird.

Wenn etwas passiert, wodurch verhindert wird, dass das Gerät die Nachricht abschließt, vorübergehend verwirft oder ablehnt, stellt IoT Hub sie nach einem festgelegten Zeitlimit zur erneuten Übermittlung in die Warteschlange. Aus diesem Grund muss die Nachrichtenverarbeitungslogik in der Geräte-App idempotent sein, sodass der mehrmalige Empfang derselben Nachricht dasselbe Ergebnis erzeugt.

Ausführlichere Informationen zum Lebenszyklus von Cloud-zu-Gerät-Nachrichten und zur Weise, in der IoT Hub Cloud-zu-Gerät-Nachrichten verarbeitet, finden Sie unter Senden von C2D-Nachrichten von einem IoT Hub.

Hinweis

Wenn Sie statt MQTT oder AMQP den HTTPS-Transport verwenden, prüft die Client-Instanz nur selten (mindestens alle 25 Minuten), ob Nachrichten von IoT Hub vorliegen. Weitere Informationen zu den Unterschieden zwischen der Unterstützung für MQTT, AMQP und HTTPS finden Sie unter Leitfaden zur C2D-Kommunikation und Auswählen eines Kommunikationsprotokolls.

Abrufen der IoT-Hub-Verbindungszeichenfolge

In diesem Artikel erstellen Sie einen Back-End-Dienst, um Cloud-zu-Gerät-Nachrichten über Ihren IoT Hub zu senden. Damit Ihr Dienst Cloud-zu-Gerät-Nachrichten senden kann, muss er über die Berechtigung Dienstverbindung verfügen. Standardmäßig wird jeder IoT-Hub mit einer SAS-Richtlinie namens service erstellt, die diese Berechtigung erteilt.

Führen Sie zum Abrufen der IoT-Hub-Verbindungszeichenfolge für die Richtlinie service die folgenden Schritte aus:

  1. Wählen Sie im Azure-Portal die Option Ressourcengruppen aus. Wählen Sie die Ressourcengruppe aus, in der sich der Hub befindet, und wählen Sie dann in der Liste der Ressourcen Ihren Hub aus.

  2. Wählen Sie im linken Bereich Ihres IoT-Hubs Freigegebene Zugriffsrichtlinien aus.

  3. Wählen Sie in der Liste der Richtlinien die Richtlinie service aus.

  4. Kopieren Sie die primäre Verbindungszeichenfolge und speichern Sie den Wert.

Screenshot, der das Abrufen der Verbindungszeichenfolge von Ihrem IoT Hub im Azure-Portal zeigt.

Weitere Informationen zu SAS-Richtlinien und Berechtigungen für IoT-Hubs finden Sie unter Access Control und Berechtigungen.

Senden einer C2D-Nachricht

In diesem Abschnitt erstellen Sie eine Node.js-Konsolen-App, die C2D-Nachrichten an die simulierte Geräte-App sendet. Sie benötigen die Geräte-ID Ihres Geräts und die Verbindungszeichenfolge Ihres IoT Hubs.

  1. Erstellen Sie einen neuen leeren Ordner mit dem Namen sendcloudtodevicemessage. Öffnen Sie eine Eingabeaufforderung, navigieren Sie zum Ordner sendcloudtodevicemessage, und führen Sie dann den folgenden Befehl aus, um eine Datei package.json in diesem Ordner zu erstellen. Drücken Sie bei jeder Eingabeaufforderung des Befehls npm die EINGABETASTE, um die Standardeinstellung für diese Eingabeaufforderung zu übernehmen:

    npm init
    
  2. Führen Sie an der Eingabeaufforderung im Ordner sendcloudtodevicemessage den folgenden Befehl aus, um das Paket azure-iothub zu installieren:

    npm install azure-iothub --save
    
  3. Erstellen Sie mithilfe eines Text-Editors die Datei SendCloudToDeviceMessage.js im Ordner sendcloudtodevicemessage.

  4. Fügen Sie am Anfang der Datei SendCloudToDeviceMessage.js die folgenden require-Anweisungen hinzu:

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. Fügen Sie der Datei SendCloudToDeviceMessage.js den folgenden Code hinzu. Ersetzen Sie die Platzhalterwerte „{IoTHubConnectionString}“ und „{deviceID}“ durch die IoT-Hub-Verbindungszeichenfolge und die Geräte-ID, die Sie zuvor notiert haben:

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. Fügen Sie die folgende Funktion hinzu, um Ergebnisse des Vorgangs an der Konsole auszugeben:

    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. Fügen Sie die folgende Funktion hinzu, um Übermittlungsfeedbacknachrichten an der Konsole auszugeben:

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. Fügen Sie den folgenden Code hinzu, um eine Nachricht an Ihr Gerät zu senden und die Feedbacknachricht zu verarbeiten, wenn das Gerät die C2D-Nachricht bestätigt:

    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. Speichern und schließen Sie die Datei SendCloudToDeviceMessage.js .

Ausführen der Anwendungen

Sie können nun die Anwendungen ausführen.

  1. Führen Sie im Ordner azure-iot-sdk-node\device\samples\javascript an der Eingabeaufforderung den folgenden Befehl aus, um Telemetriedaten an IoT Hub zu senden und auf C2D-Nachrichten zu lauschen:

    node simple_sample_device.js
    

    Ausführen der simulierten Geräte-App

  2. Führen Sie im Ordner sendcloudtodevicemessage an einer Eingabeaufforderung den folgenden Befehl aus, um eine C2D-Nachricht zu senden, und warten Sie auf das Bestätigungsfeedback:

    node SendCloudToDeviceMessage.js
    

    Ausführen der App zum Senden des C2D-Befehls

    Hinweis

    Der Einfachheit halber wird in diesem Artikel keine Wiederholungsrichtlinie implementiert. Im Produktionscode sollten Sie Wiederholungsrichtlinien implementieren (z.B. exponentielles Backoff), wie es im Artikel Behandeln vorübergehender Fehler vorgeschlagen wird.

Nächste Schritte

In diesem Artikel haben Sie gelernt, wie C2D-Nachrichten gesendet und empfangen werden.