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:
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.
W okienku po lewej stronie centrum IoT w obszarze Zarządzanie urządzeniami wybierz pozycję Urządzenia.
Z listy urządzeń wybierz odpowiednie urządzenie.
Skopiuj podstawowe parametry połączenia i zapisz wartość.
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:
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.
W okienku po lewej stronie centrum IoT wybierz pozycję Zasady dostępu współdzielonego.
Z listy zasad wybierz zasady usługi .
Skopiuj podstawowe parametry połączenia i zapisz wartość.
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.
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 wnpm
każdym wierszu polecenia, aby zaakceptować ustawienie domyślne dla tego wiersza polecenia:npm init
W wierszu polecenia w folderze sendcloudtodevicemessage uruchom następujące polecenie, aby zainstalować pakiet azure-iothub :
npm install azure-iothub --save
Za pomocą edytora tekstów utwórz plik SendCloudToDeviceMessage.js w folderze sendcloudtodevicemessage .
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;
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);
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); }; }
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')); }); }
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')); } });
Zapisz i zamknij plikSendCloudToDeviceMessage.js .
Uruchamianie aplikacji
Teraz możesz przystąpić do uruchamiania aplikacji.
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
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
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.
Aby dowiedzieć się więcej o komunikatach chmura-urządzenie, zobacz Wysyłanie komunikatów z chmury do urządzenia z centrum IoT Hub.
Aby dowiedzieć się więcej o formatach komunikatów IoT Hub, zobacz Tworzenie i odczytywanie komunikatów IoT Hub.