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.
  • Maven 3

  • 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:

  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 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:

  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ą 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.

  1. 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
    
  2. W wierszu polecenia przejdź do nowego folderu send-c2d-messages.

  3. 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.

  4. Zapisz i zamknij plik pom.xml.

  5. Za pomocą edytora tekstów otwórz plik send-c2d-messages\src\main\java\com\mycompany\app\App.java.

  6. Dodaj do pliku następujące instrukcje importowania:

    import com.microsoft.azure.sdk.iot.service.*;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
  7. 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;
    
  8. 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.

  9. 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.

  1. 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}"
    

    Zrzut ekranu przedstawiający przykładową aplikację urządzenia uruchomioną w oknie konsoli.

  2. 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"
    

    Zrzut ekranu przedstawiający przykładową aplikację usługi uruchomioną w oknie konsoli.

Następne kroki

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