Wysyłanie komunikatów z chmury do urządzenia za pomocą IoT Hub (Java)
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 Java:
HandleMessages: przykładowa aplikacja urządzenia dołączona do zestawu MICROSOFT Azure IoT SDK dla języka Java, która łączy się z centrum IoT Hub i odbiera komunikaty z chmury do urządzenia.
SendCloudToDevice: wysyła komunikat z chmury do urządzenia za pośrednictwem IoT Hub, a następnie odbiera 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 języka Java.
- Pobierz lub sklonuj repozytorium zestawu SDK z usługi GitHub do maszyny deweloperskiej.
- Upewnij się, że na komputerze deweloperskim jest zainstalowany zestaw Java SE Development Kit 8 . Upewnij się, że wybrano pozycję Java 8 w obszarze Obsługa długoterminowa , aby pobrać zestaw JDK 8.
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 HandleMessages dołączona do zestawu SDK usługi Microsoft Azure IoT dla języka Java łączy się z centrum IoT Hub 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 HandleMessages , aby odbierać komunikaty C2D wysyłane za pośrednictwem centrum IoT. Otwórz nowy wiersz polecenia i przejdź do folderu azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages w folderze, w którym rozszerzono zestaw SDK języka Java usługi Azure IoT. 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.
mvn clean package -DskipTests
java -jar ./target/handle-messages-1.0.0-with-deps.jar "{Your device connection string}"
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:
5/22/2023 11:13:18 AM> Press Control+C at any time to quit the sample.
Starting...
Beginning setup.
Successfully read input parameters.
Using communication protocol MQTT.
2023-05-23 09:51:06,062 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
2023-05-23 09:51:06,187 DEBUG (main) [com.microsoft.azure.sdk.iot.device.ClientConfiguration] - Device configured to use software based SAS authentication provider
2023-05-23 09:51:06,187 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
2023-05-23 09:51:06,202 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.1.5
Successfully created an IoT Hub client.
Successfully set message callback.
2023-05-23 09:51:06,205 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection...
2023-05-23 09:51:06,218 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet...
2023-05-23 09:51:07,308 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged
2023-05-23 09:51:07,308 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/US60536-device/messages/devicebound/#
2023-05-23 09:51:07,388 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/US60536-device/messages/devicebound/# was acknowledged
2023-05-23 09:51:07,388 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully
2023-05-23 09:51:07,388 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established
2023-05-23 09:51:07,404 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK
2023-05-23 09:51:07,404 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads
2023-05-23 09:51:07,408 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details
CONNECTION STATUS UPDATE: CONNECTED
CONNECTION STATUS REASON: CONNECTION_OK
CONNECTION STATUS THROWABLE: null
The connection was successfully established. Can send messages.
2023-05-23 09:51:07,408 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully
2023-05-23 09:51:07,408 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully
Opened connection to IoT Hub. Messages sent to this device will now be received.
Press any key to exit...
Metoda execute
w AppMessageCallback
klasie zwraca wartość IotHubMessageResult.COMPLETE
. Ten stan powiadamia IoT Hub, że komunikat został pomyślnie przetworzony i że komunikat można bezpiecznie usunąć z kolejki urządzenia. Urządzenie powinno zwrócić tę wartość po pomyślnym zakończeniu przetwarzania niezależnie od używanego protokołu.
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 DeviceClient 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ą Java, 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 projekt Maven o nazwie send-c2d-messages przy użyciu następującego polecenia w wierszu polecenia. Zwróć uwagę, że to polecenie jest pojedynczym, długim poleceniem:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=send-c2d-messages -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
W wierszu polecenia przejdź do nowego folderu send-c2d-messages.
Za pomocą edytora tekstów otwórz plik pom.xml w folderze send-c2d-messages i dodaj następującą zależność do węzła zależności. Dodanie zależności umożliwia używanie pakietu iothub-java-service-client w aplikacji do komunikowania się z usługą IoT Hub:
<dependency> <groupId>com.microsoft.azure.sdk.iot</groupId> <artifactId>iot-service-client</artifactId> <version>1.7.23</version> </dependency>
Uwaga
Możesz sprawdzić dostępność najnowszej wersji pakietu iot-service-client za pomocą funkcji wyszukiwania narzędzia Maven.
Zapisz i zamknij plik pom.xml.
Za pomocą edytora tekstów otwórz plik send-c2d-messages\src\main\java\com\mycompany\app\App.java.
Dodaj do pliku następujące instrukcje importowania:
import com.microsoft.azure.sdk.iot.service.*; import java.io.IOException; import java.net.URISyntaxException;
Dodaj następujące zmienne na poziomie klasy do klasy App , zastępując ciąg {yourhubconnectionstring} i {yourdeviceid} zanotowaną wcześniej wartością:
private static final String connectionString = "{yourhubconnectionstring}"; private static final String deviceId = "{yourdeviceid}"; private static final IotHubServiceClientProtocol protocol = IotHubServiceClientProtocol.AMQPS;
Zastąp metodę main poniższym kodem. Ten kod łączy się z centrum IoT Hub, wysyła wiadomość do urządzenia, a następnie czeka na potwierdzenie, że urządzenie odebrało i przetworzyło komunikat:
public static void main(String[] args) throws IOException, URISyntaxException, Exception { ServiceClient serviceClient = ServiceClient.createFromConnectionString( connectionString, protocol); if (serviceClient != null) { serviceClient.open(); FeedbackReceiver feedbackReceiver = serviceClient .getFeedbackReceiver(); if (feedbackReceiver != null) feedbackReceiver.open(); Message messageToSend = new Message("Cloud to device message."); messageToSend.setDeliveryAcknowledgement(DeliveryAcknowledgement.Full); serviceClient.send(deviceId, messageToSend); System.out.println("Message sent to device"); FeedbackBatch feedbackBatch = feedbackReceiver.receive(10000); if (feedbackBatch != null) { System.out.println("Message feedback received, feedback time: " + feedbackBatch.getEnqueuedTimeUtc().toString()); } if (feedbackReceiver != null) feedbackReceiver.close(); serviceClient.close(); } }
Uwaga
Dla uproszczenia ten artykuł nie implementuje zasad ponawiania prób. W kodzie produkcyjnym należy zaimplementować zasady ponawiania prób (takie jak wycofywanie wykładnicze), jak sugerowano w artykule Obsługa błędów przejściowych.
Aby skompilować aplikację send-c2d-messages przy użyciu narzędzia Maven, wykonaj następujące polecenie w wierszu polecenia w folderze simulated-device:
mvn clean package -DskipTests
Uruchamianie aplikacji
Teraz możesz przystąpić do uruchamiania aplikacji.
W wierszu polecenia w folderze azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages uruchom następujące polecenia, zastępując
{Your device connection string}
wartość symbolu zastępczego parametrami połączenia urządzenia skopiowanymi z zarejestrowanego urządzenia w centrum IoT. Ten krok uruchamia przykładową aplikację urządzenia, która wysyła dane telemetryczne do centrum IoT i nasłuchuje komunikatów z chmury do urządzenia wysyłanych z centrum:java -jar ./target/handle-messages-1.0.0-with-deps.jar "{Your device connection string}"
W wierszu polecenia w folderze send-c2d-messages uruchom następujące polecenie, aby wysłać komunikat z chmury do urządzenia i poczekać na potwierdzenie opinii:
mvn exec:java -Dexec.mainClass="com.mycompany.app.App"
Następne kroki
W artykule przedstawiono sposób wysyłania i odbierania komunikatów z chmury do urządzenia.
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.
Aby dowiedzieć się więcej o formatach komunikatów IoT Hub, zobacz Tworzenie i odczytywanie komunikatów IoT Hub.