Wysyłanie komunikatów z chmury do urządzeń przy użyciu IoT Hub (Node.js)

Azure IoT Hub to w pełni zarządzana usługa, która ułatwia niezawodną i bezpieczną dwukierunkową komunikację między milionami urządzeń a zapleczem rozwiązania.

W tym artykule wyjaśniono, jak:

  • Wysyłanie komunikatów z zaplecza rozwiązania do urządzenia w chmurze (C2D) do jednego urządzenia za pośrednictwem IoT Hub

  • Odbieranie komunikatów z chmury do urządzeń na urządzeniu

  • Żądanie potwierdzenia dostarczania (opinia) z zaplecza rozwiązania w przypadku komunikatów wysyłanych do urządzenia z IoT Hub

Uwaga

Funkcje opisane w tym artykule są dostępne tylko w warstwie Standardowa IoT Hub. Aby uzyskać więcej informacji na temat warstw podstawowych i standardowych/bezpłatnych IoT Hub, zobacz Wybieranie odpowiedniej warstwy IoT Hub dla rozwiązania.

Na końcu tego artykułu uruchomisz dwie aplikacje konsolowe Node.js:

  • simple_sample_device: przykładowa aplikacja urządzenia dołączona do zestawu MICROSOFT Azure IoT SDK dla Node.js, która łączy się z centrum IoT i odbiera komunikaty z chmury do urządzenia.

  • SendCloudToDevice: aplikacja usługi, która wysyła komunikat z chmury do urządzenia za pośrednictwem IoT Hub, a następnie otrzymuje potwierdzenie dostarczenia.

Uwaga

IoT Hub ma obsługę zestawu SDK dla wielu platform urządzeń i języków (C, Java, Python i JavaScript) za pośrednictwem zestawów SDK urządzeń usługi Azure IoT.

Aby dowiedzieć się więcej na temat komunikatów z chmury do urządzenia, zobacz Wysyłanie komunikatów z chmury do urządzenia z centrum IoT Hub.

Wymagania wstępne

  • Subskrypcja platformy Azure. Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

  • Centrum IoT w subskrypcji platformy Azure. Jeśli nie masz jeszcze centrum, możesz wykonać kroki opisane w temacie Tworzenie centrum IoT.

  • Urządzenie zarejestrowane w centrum IoT. Jeśli urządzenie nie zostało jeszcze zarejestrowane, zarejestruj je w Azure Portal.

  • W tym artykule użyto przykładowego kodu z zestawu Azure IoT SDK dla Node.js.

    • Pobierz lub sklonuj repozytorium zestawu SDK z usługi GitHub do maszyny deweloperskiej.
    • Upewnij się, że na maszynie dewelopera zainstalowano Node.js w wersji 10.0.x lub nowszej. W artykule Przygotowanie środowiska deweloperskiego opisano sposób instalowania Node.js dla tego artykułu w systemie Windows lub Linux.
  • Upewnij się, że port 8883 jest otwarty w zaporze. Przykład urządzenia w tym artykule używa protokołu MQTT, który komunikuje się za pośrednictwem portu 8883. Ten port może zostać zablokowany w niektórych środowiskach sieci firmowych i edukacyjnych. Aby uzyskać więcej informacji i sposobów obejścia tego problemu, zobacz Łączenie się z IoT Hub (MQTT).

Pobieranie parametrów połączenia urządzenia

W tym artykule uruchomisz przykładową aplikację, która symuluje urządzenie, które odbiera komunikaty z chmury do urządzenia wysyłane za pośrednictwem IoT Hub. Przykładowa aplikacja simple_sample_device dołączona do zestawu MICROSOFT Azure IoT SDK dla Node.js łączy się z centrum IoT i działa jako symulowane urządzenie. W przykładzie użyto podstawowych parametrów połączenia zarejestrowanego urządzenia w centrum IoT.

Aby uzyskać podstawowe parametry połączenia dla urządzenia zarejestrowanego w centrum IoT, wykonaj następujące kroki:

  1. W Azure Portal wybierz pozycję Grupy zasobów. Wybierz grupę zasobów, w której znajduje się centrum, a następnie wybierz centrum z listy zasobów.

  2. W okienku po lewej stronie centrum IoT w obszarze Zarządzanie urządzeniami wybierz pozycję Urządzenia.

  3. Z listy urządzeń wybierz odpowiednie urządzenie.

  4. Skopiuj podstawowe parametry połączenia i zapisz wartość.

    Zrzut ekranu przedstawiający sposób pobierania podstawowych parametrów połączenia dla urządzenia zarejestrowanego w centrum IoT w Azure Portal.

Odbieranie komunikatów w aplikacji urządzenia

W tej sekcji uruchom przykładową aplikację urządzenia simple_sample_device, aby odbierać komunikaty C2D wysyłane za pośrednictwem centrum IoT. Otwórz nowy wiersz polecenia i przejdź do folderu azure-iot-sdk-node\device\samples\javascript w folderze, w którym rozszerzono zestaw SDK usługi Azure IoT Node.js. Uruchom następujące polecenia, zastępując wartość symbolu zastępczego {Your device connection string} parametrami połączenia urządzenia skopiowanymi z zarejestrowanego urządzenia w centrum IoT.

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

Następujące dane wyjściowe pochodzą z przykładowej aplikacji urządzenia po pomyślnym uruchomieniu i nawiązaniu połączenia z centrum 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}

W tym przykładzie urządzenie wywołuje pełną funkcję, aby powiadomić IoT Hub, że przetworzyła komunikat i że można ją bezpiecznie usunąć z kolejki urządzenia. Wywołanie do ukończenia nie jest wymagane, jeśli używasz transportu MQTT i można go pominąć. Jest to wymagane dla protokołu AMQP i HTTPS.

W przypadku protokołu AMQP i HTTPS, ale nie MQTT, urządzenie może również wykonywać następujące czynności:

  • Porzucanie komunikatu, co powoduje, że IoT Hub zachować komunikat w kolejce urządzenia do przyszłego użycia.
  • Odrzuć komunikat, który trwale usuwa komunikat z kolejki urządzenia.

Jeśli coś się stanie, co uniemożliwia ukończenie, porzucenie lub odrzucenie komunikatu przez urządzenie, IoT Hub nastąpi ponowne utworzenie kolejki komunikatu w celu dostarczenia. Z tego powodu logika przetwarzania komunikatów w aplikacji urządzenia musi być idempotentna, dzięki czemu odbieranie tego samego komunikatu wiele razy generuje ten sam wynik.

Aby uzyskać więcej informacji na temat cyklu życia komunikatów z chmury do urządzenia i IoT Hub sposobu przetwarzania komunikatów w chmurze do urządzenia, zobacz Wysyłanie komunikatów z chmury do urządzenia z centrum IoT Hub.

Uwaga

Jeśli używasz protokołu HTTPS zamiast protokołu MQTT lub AMQP jako transportu, wystąpienie klienta sprawdza komunikaty z IoT Hub rzadko (co najmniej co 25 minut). Aby uzyskać więcej informacji na temat różnic między obsługą protokołu MQTT, AMQP i HTTPS, zobacz Wskazówki dotyczące komunikacji między chmurą a urządzeniem i Wybieranie protokołu komunikacyjnego.

Pobieranie parametrów połączenia centrum IoT Hub

W tym artykule utworzysz usługę zaplecza do wysyłania komunikatów z chmury do urządzenia za pośrednictwem IoT Hub. Aby wysyłać komunikaty z chmury do urządzenia, usługa wymaga uprawnień połączenia z usługą . Domyślnie każda IoT Hub jest tworzona z zasadami dostępu współdzielonego o nazwie usługa, która przyznaje to uprawnienie.

Aby uzyskać IoT Hub parametry połączenia dla zasad usługi, wykonaj następujące kroki:

  1. W Azure Portal wybierz pozycję Grupy zasobów. Wybierz grupę zasobów, w której znajduje się centrum, a następnie wybierz centrum z listy zasobów.

  2. W okienku po lewej stronie centrum IoT wybierz pozycję Zasady dostępu współdzielonego.

  3. Z listy zasad wybierz zasady usługi .

  4. Skopiuj podstawowe parametry połączenia i zapisz wartość.

Zrzut ekranu przedstawiający sposób pobierania parametrów połączenia z IoT Hub w Azure Portal.

Aby uzyskać więcej informacji na temat zasad i uprawnień dostępu współdzielonego IoT Hub, zobacz Kontrola dostępu i uprawnienia.

Wysyłanie komunikatu z chmury do urządzenia

W tej sekcji utworzysz aplikację konsolową Node.js, która wysyła komunikaty z chmury do urządzenia do aplikacji symulowanego urządzenia. Potrzebny jest identyfikator urządzenia z urządzenia i parametry połączenia centrum IoT Hub.

  1. Utwórz pusty folder o nazwie sendcloudtodevicemessage. Otwórz wiersz polecenia, przejdź do folderu sendcloudtodevicemessage , a następnie uruchom następujące polecenie, aby utworzyć package.json plik w tym folderze. Naciśnij klawisz Enter w npm każdym wierszu polecenia, aby zaakceptować ustawienie domyślne dla tego wiersza polecenia:

    npm init
    
  2. W wierszu polecenia w folderze sendcloudtodevicemessage uruchom następujące polecenie, aby zainstalować pakiet azure-iothub :

    npm install azure-iothub --save
    
  3. Za pomocą edytora tekstów utwórz plik SendCloudToDeviceMessage.js w folderze sendcloudtodevicemessage .

  4. Dodaj następujące require instrukcje na początku pliku SendCloudToDeviceMessage.js :

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. Dodaj następujący kod do plikuSendCloudToDeviceMessage.js . Zastąp wartości zastępcze "{iot hub connection string}" i "{device ID}" parametrami połączenia centrum IoT i identyfikatorem urządzenia zanotowanymi wcześniej:

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. Dodaj następującą funkcję, aby wydrukować wyniki operacji w konsoli:

    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. Dodaj następującą funkcję, aby wydrukować komunikaty zwrotne dotyczące dostarczania do konsoli:

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. Dodaj następujący kod, aby wysłać komunikat do urządzenia i obsłużyć komunikat opinii, gdy urządzenie potwierdzi komunikat z chmury do urządzenia:

    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. Zapisz i zamknij plikSendCloudToDeviceMessage.js .

Uruchamianie aplikacji

Teraz możesz przystąpić do uruchamiania aplikacji.

  1. W wierszu polecenia w folderze azure-iot-sdk-node\device\samples\javascript uruchom następujące polecenie, aby wysłać dane telemetryczne do IoT Hub i nasłuchiwać komunikatów z chmury do urządzenia:

    node simple_sample_device.js
    

    Uruchamianie aplikacji symulowanego urządzenia

  2. W wierszu polecenia w folderze sendcloudtodevicemessage uruchom następujące polecenie, aby wysłać komunikat z chmury do urządzenia i poczekać na opinię dotyczącą potwierdzenia:

    node SendCloudToDeviceMessage.js
    

    Uruchom aplikację, aby wysłać polecenie cloud-to-device

    Uwaga

    Dla uproszczenia ten artykuł nie implementuje żadnych zasad ponawiania prób. W kodzie produkcyjnym należy zaimplementować zasady ponawiania (takie jak wycofywanie wykładnicze), zgodnie z sugestią w artykule Obsługa błędów przejściowych.

Następne kroki

W tym artykule przedstawiono sposób wysyłania i odbierania komunikatów z chmury do urządzenia.