Skicka meddelanden från moln till enhet med IoT Hub (Java)

Azure IoT Hub är en fullständigt hanterad tjänst som möjliggör tillförlitlig och säker dubbelriktad kommunikation mellan miljontals enheter och en serverdelslösning.

Den här artikeln visar hur du:

  • Skicka meddelanden från moln till enhet (C2D) från lösningsserverdelen till en enda enhet via IoT Hub

  • Ta emot meddelanden från moln till enhet på en enhet

  • Bekräftelse av leveransbegäran (feedback) från din lösningsserverdel för meddelanden som skickas till en enhet från IoT Hub

Anteckning

Funktionerna som beskrivs i den här artikeln är endast tillgängliga på standardnivån för IoT Hub. Mer information om nivåerna grundläggande och standard/kostnadsfri IoT Hub finns i Välj rätt IoT Hub nivå för din lösning.

I slutet av den här artikeln kör du två Java-konsolappar:

  • HandleMessages: en exempelenhetsapp som ingår i Microsoft Azure IoT SDK för Java, som ansluter till din IoT-hubb och tar emot meddelanden från molnet till enheten.

  • SendCloudToDevice: skickar ett meddelande från moln till enhet till enhetsappen via IoT Hub och tar sedan emot leveransbekräftelse.

Anteckning

IoT Hub har SDK-stöd för många enhetsplattformar och språk (C, Java, Python och JavaScript) via Azure IoT-enhets-SDK:er.

Mer information om meddelanden från molnet till enheten finns i Skicka meddelanden från molnet till enheten från en IoT-hubb.

Förutsättningar

  • En Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.

  • En IoT-hubb i din Azure-prenumeration. Om du inte har någon hubb ännu kan du följa stegen i Skapa en IoT-hubb.

  • En enhet som är registrerad i din IoT-hubb. Om du inte har registrerat en enhet än registrerar du en i Azure Portal.

  • Den här artikeln använder exempelkod från Azure IoT SDK för Java.

    • Ladda ned eller klona SDK-lagringsplatsen från GitHub till utvecklingsdatorn.
    • Kontrollera att Java SE Development Kit 8 är installerat på utvecklingsdatorn. Se till att du väljer Java 8 under Långsiktigt stöd för att komma till nedladdningar för JDK 8.
  • Maven 3

  • Kontrollera att port 8883 är öppen i brandväggen. Enhetsexemplet i den här artikeln använder MQTT-protokollet, som kommunicerar över port 8883. Den här porten kan blockeras i vissa företags- och utbildningsnätverksmiljöer. Mer information och sätt att kringgå det här problemet finns i Ansluta till IoT Hub (MQTT).

Hämta enhetens anslutningssträng

I den här artikeln kör du en exempelapp som simulerar en enhet som tar emot meddelanden från molnet till enheten som skickas via din IoT Hub. HandleMessages-exempelappen som ingår i Microsoft Azure IoT SDK för Java ansluter till din IoT-hubb och fungerar som din simulerade enhet. Exemplet använder den primära anslutningssträngen för den registrerade enheten på din IoT-hubb.

Följ dessa steg för att hämta den primära anslutningssträngen för en enhet som är registrerad på din IoT-hubb:

  1. I Azure Portal väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan din hubb i listan över resurser.

  2. Välj Enheter under Enhetshantering i fönstret till vänster i IoT-hubben.

  3. I listan över enheter väljer du lämplig enhet.

  4. Kopiera den primära anslutningssträngen och spara värdet.

    Skärmbild som visar hur du hämtar den primära anslutningssträngen för en enhet som är registrerad på din IoT-hubb i Azure Portal.

Ta emot meddelanden i enhetsappen

I det här avsnittet kör du exempelenhetsappen HandleMessages för att ta emot C2D-meddelanden som skickas via din IoT-hubb. Öppna en ny kommandotolk och navigera till mappen azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages under mappen där du expanderade Azure IoT Java SDK. Kör följande kommandon och ersätt {Your device connection string} platshållarvärdet med enhetsanslutningssträngen som du kopierade från den registrerade enheten i IoT-hubben.

mvn clean package -DskipTests
java -jar ./target/handle-messages-1.0.0-with-deps.jar "{Your device connection string}"

Följande utdata kommer från exempelenhetsappen när den har startats och ansluter till din IoT-hubb:

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

Metoden execute i AppMessageCallback klassen returnerar IotHubMessageResult.COMPLETE. Den här statusen meddelar IoT Hub att meddelandet har bearbetats och att meddelandet kan tas bort från enhetskön på ett säkert sätt. Enheten bör returnera det här värdet när bearbetningen slutförs oavsett vilket protokoll den använder.

Med AMQP och HTTPS, men inte MQTT, kan enheten också:

  • Avbryt ett meddelande, vilket resulterar i IoT Hub att behålla meddelandet i enhetskön för framtida förbrukning.
  • Avvisa ett meddelande som permanent tar bort meddelandet från enhetskön.

Om något händer som hindrar enheten från att slutföra, överge eller avvisa meddelandet, kommer IoT Hub efter en fast tidsgräns att köa meddelandet för leverans igen. Därför måste logiken för meddelandebearbetning i enhetsappen vara idempotent, så att samma meddelande tas emot flera gånger ger samma resultat.

Mer information om meddelandelivscykeln från moln till enhet och hur IoT Hub bearbetar meddelanden från moln till enhet finns i Skicka meddelanden från molnet till enheten från en IoT-hubb.

Anteckning

Om du använder HTTPS i stället för MQTT eller AMQP som transport söker DeviceClient-instansen efter meddelanden från IoT Hub sällan (minst var 25:e minut). Mer information om skillnaderna mellan MQTT-, AMQP- och HTTPS-stöd finns i Vägledning för kommunikation från moln till enhet och Välj ett kommunikationsprotokoll.

Hämta IoT Hub-anslutningssträngen

I den här artikeln skapar du en serverdelstjänst för att skicka meddelanden från moln till enhet via din IoT Hub. Om du vill skicka meddelanden från molnet till enheten behöver din tjänst behörighet att ansluta till tjänsten . Som standard skapas varje IoT Hub med en princip för delad åtkomst med namnet tjänst som ger den här behörigheten.

Följ dessa steg för att hämta IoT Hub anslutningssträng för tjänstprincipen:

  1. I Azure Portal väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan din hubb i listan över resurser.

  2. I fönstret till vänster i IoT-hubben väljer du Principer för delad åtkomst.

  3. I listan över principer väljer du tjänstprincipen .

  4. Kopiera den primära anslutningssträngen och spara värdet.

Skärmbild som visar hur du hämtar anslutningssträngen från din IoT Hub i Azure Portal.

Mer information om IoT Hub principer och behörigheter för delad åtkomst finns i Åtkomstkontroll och behörigheter.

Skicka ett meddelande från moln till enhet

I det här avsnittet skapar du en Java-konsolapp som skickar meddelanden från moln till enhet till den simulerade enhetsappen. Du behöver enhets-ID:t från enheten och IoT Hub-anslutningssträngen.

  1. Skapa ett Maven-projekt med namnet send-c2d-messages med följande kommando i kommandotolken. Observera att det här kommandot är ett enda långt kommando:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=send-c2d-messages -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. Gå till den nya mappen send-c2d-messages i kommandotolken.

  3. Med hjälp av en textredigerare öppnar du filen pom.xml i mappen send-c2d-messages och lägger till följande beroende till noden beroenden . Genom att lägga till beroendet kan du använda iothub-java-service-client-paketet i ditt program för att kommunicera med din IoT Hub-tjänst:

    <dependency>
      <groupId>com.microsoft.azure.sdk.iot</groupId>
      <artifactId>iot-service-client</artifactId>
      <version>1.7.23</version>
    </dependency>
    

    Anteckning

    Du kan söka efter den senaste versionen av iot-service-client med Maven-sökning.

  4. Spara och stäng filen pom.xml.

  5. Öppna filen send-c2d-messages\src\main\java\com\mycompany\app\App.java med hjälp av en textredigerare.

  6. Lägg till följande Import-instruktioner i filen:

    import com.microsoft.azure.sdk.iot.service.*;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
  7. Lägg till följande variabler på klassnivå i klassen App och ersätt {yourhubconnectionstring} och {yourdeviceid} med de värden som du antecknade tidigare:

    private static final String connectionString = "{yourhubconnectionstring}";
    private static final String deviceId = "{yourdeviceid}";
    private static final IotHubServiceClientProtocol protocol =    
        IotHubServiceClientProtocol.AMQPS;
    
  8. Ersätt huvudmetoden med följande kod. Den här koden ansluter till din IoT-hubb, skickar ett meddelande till enheten och väntar sedan på en bekräftelse på att enheten har tagit emot och bearbetat meddelandet:

    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();
      }
    }
    

    Anteckning

    För enkelhetens skull implementerar den här artikeln inte en återförsöksprincip. I produktionskoden bör du implementera återförsöksprinciper (till exempel exponentiell backoff) enligt vad som föreslås i artikeln Hantering av tillfälliga fel.

  9. Om du vill skapa appen send-c2d-messages med Maven kör du följande kommando i kommandotolken i mappen simulated-device:

    mvn clean package -DskipTests
    

Köra programmen

Nu är du redo att köra programmen.

  1. I en kommandotolk i mappen azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages kör du följande kommandon och ersätter {Your device connection string} platshållarvärdet med enhetsanslutningssträngen som du kopierade från den registrerade enheten i IoT-hubben. Det här steget startar exempelenhetsappen, som skickar telemetri till din IoT-hubb och lyssnar efter meddelanden från molnet till enheten som skickas från hubben:

    java -jar ./target/handle-messages-1.0.0-with-deps.jar "{Your device connection string}"
    

    Skärmbild av exempelenhetsappen som körs i ett konsolfönster.

  2. I en kommandotolk i mappen send-c2d-messages kör du följande kommando för att skicka ett meddelande från molnet till enheten och vänta på en feedbackbekräftelse:

    mvn exec:java -Dexec.mainClass="com.mycompany.app.App"
    

    Skärmbild av exempeltjänstappen som körs i ett konsolfönster.

Nästa steg

I artikeln har du lärt dig hur du skickar och tar emot meddelanden från molnet till enheten.