Share via


Cloud-naar-apparaat-berichten verzenden met IoT Hub (Java)

Azure IoT Hub is een volledig beheerde service die betrouwbare en veilige bidirectionele communicatie tussen miljoenen apparaten en een back-end van een oplossing mogelijk maakt.

In dit artikel leest u informatie over:

  • Cloud-naar-apparaat-berichten (C2D) verzenden vanaf de back-end van uw oplossing naar één apparaat via IoT Hub

  • Cloud-naar-apparaat-berichten ontvangen op een apparaat

  • Ontvangstbevestiging (feedback) aanvragen vanuit de back-end van uw oplossing voor berichten die vanaf IoT Hub naar een apparaat worden verzonden

Notitie

De functies die in dit artikel worden beschreven, zijn alleen beschikbaar in de standaardlaag van de IoT Hub. Zie Choose the right IoT Hub tier for your solution (De juiste IoT Hub laag voor uw oplossing kiezen) voor meer informatie over de lagen Basic en Standard/free IoT Hub.

Aan het einde van dit artikel voert u twee Java-console-apps uit:

  • HandleMessages: een voorbeeldapparaat-app die deel uitmaakt van de Microsoft Azure IoT SDK voor Java, die verbinding maakt met uw IoT-hub en cloud-naar-apparaat-berichten ontvangt.

  • SendCloudToDevice: verzendt een cloud-naar-apparaat-bericht naar de apparaat-app via IoT Hub en ontvangt vervolgens de ontvangstbevestiging.

Notitie

IoT Hub biedt SDK-ondersteuning voor veel apparaatplatforms en -talen (C, Java, Python en JavaScript) via de Azure IoT-apparaat-SDK's.

Zie Cloud-naar-apparaat-berichten verzenden vanuit een IoT-hub voor meer informatie over cloud-naar-apparaat-berichten.

Vereisten

  • Een Azure-abonnement. Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint.

  • Een IoT-hub in uw Azure-abonnement. Als u nog geen hub hebt, kunt u de stappen in Een IoT-hub maken volgen.

  • Een apparaat dat is geregistreerd in uw IoT-hub. Als u nog geen apparaat hebt geregistreerd, registreert u er een in de Azure Portal.

  • In dit artikel wordt voorbeeldcode van de Azure IoT SDK voor Java gebruikt.

    • Download of kloon de SDK-opslagplaats van GitHub naar uw ontwikkelcomputer.
    • Zorg ervoor dat Java SE Development Kit 8 is geïnstalleerd op uw ontwikkelcomputer. Zorg ervoor dat u Java 8 selecteert onder Langetermijnondersteuning om naar downloads voor JDK 8 te gaan.
  • Maven 3

  • Zorg ervoor dat de poort 8883 is geopend in de firewall. Het apparaatvoorbeeld in dit artikel maakt gebruik van het MQTT-protocol, dat communiceert via poort 8883. Deze poort is in sommige netwerkomgevingen van bedrijven en onderwijsinstellingen mogelijk geblokkeerd. Zie Verbinding maken met IoT Hub (MQTT) voor meer informatie en manieren om dit probleem te omzeilen.

De verbindingsreeks ophalen

In dit artikel voert u een voorbeeld-app uit waarmee een apparaat wordt gesimuleerd, dat cloud-naar-apparaat-berichten ontvangt die via uw IoT Hub worden verzonden. De HandleMessages-voorbeeld-app die is opgenomen in de Microsoft Azure IoT SDK voor Java , maakt verbinding met uw IoT-hub en fungeert als uw gesimuleerde apparaat. In het voorbeeld wordt de primaire connection string van het geregistreerde apparaat op uw IoT-hub gebruikt.

Voer de volgende stappen uit om de primaire connection string op te halen voor een apparaat dat is geregistreerd bij uw IoT-hub:

  1. Selecteer Resourcegroepenin de Azure Portal. Selecteer de resourcegroep waar uw hub zich bevindt en selecteer vervolgens uw hub in de lijst met resources.

  2. Selecteer apparaten in het linkerdeelvenster van uw IoT-hub onder Apparaatbeheer.

  3. Selecteer het juiste apparaat in de lijst met apparaten.

  4. Kopieer de Primaire connection string en sla de waarde op.

    Schermopname van het ophalen van de primaire connection string voor een apparaat dat is geregistreerd bij uw IoT-hub in de Azure Portal.

Berichten ontvangen in de apparaat-app

Voer in deze sectie de apparaat-app HandleMessages-voorbeeld uit om C2D-berichten te ontvangen die zijn verzonden via uw IoT-hub. Open een nieuwe opdrachtprompt en navigeer naar de map azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages , onder de map waarin u de Azure IoT Java SDK hebt uitgevouwen. Voer de volgende opdrachten uit, waarbij u de waarde van de {Your device connection string} tijdelijke aanduiding vervangt door het apparaat connection string u hebt gekopieerd van het geregistreerde apparaat in uw IoT-hub.

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

De volgende uitvoer is afkomstig van de voorbeeldapparaat-app nadat deze is gestart en verbinding heeft gemaakt met uw IoT-hub:

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

De execute methode in de AppMessageCallback klasse retourneert IotHubMessageResult.COMPLETE. Deze status meldt IoT Hub dat het bericht is verwerkt en dat het bericht veilig uit de apparaatwachtrij kan worden verwijderd. Het apparaat moet deze waarde retourneren wanneer de verwerking is voltooid, ongeacht het protocol dat wordt gebruikt.

Met AMQP en HTTPS, maar niet MQTT, kan het apparaat ook het volgende doen:

  • Een bericht verlaten, waardoor IoT Hub het bericht in de apparaatwachtrij bewaart voor toekomstig gebruik.
  • Een bericht weigeren, waardoor het bericht definitief uit de apparaatwachtrij wordt verwijderd.

Als er iets gebeurt waardoor het apparaat het bericht niet kan voltooien, afbreken of weigeren, zal IoT Hub na een vaste time-outperiode het bericht opnieuw in de wachtrij plaatsen voor bezorging. Daarom moet de logica voor berichtverwerking in de apparaat-app idempotent zijn, zodat hetzelfde bericht meerdere keren wordt ontvangen hetzelfde resultaat oplevert.

Zie Cloud-naar-apparaat-berichten verzenden vanuit een IoT-hub voor meer informatie over de levenscyclus van cloud-naar-apparaat-berichten en hoe IoT Hub cloud-naar-apparaat-berichten verwerkt.

Notitie

Als u HTTPS gebruikt in plaats van MQTT of AMQP als transport, controleert het DeviceClient-exemplaar af en toe op berichten van IoT Hub (minimaal elke 25 minuten). Zie Richtlijnen voor cloud-naar-apparaatcommunicatie en Een communicatieprotocol kiezen voor meer informatie over de verschillen tussen MQTT-, AMQP- en HTTPS-ondersteuning.

De IoT Hub-connection string ophalen

In dit artikel maakt u een back-endservice voor het verzenden van cloud-naar-apparaat-berichten via uw IoT Hub. Als u cloud-naar-apparaat-berichten wilt verzenden, heeft uw service de machtiging serviceverbinding nodig. Standaard wordt elke IoT Hub gemaakt met een gedeeld toegangsbeleid met de naam service die deze machtiging verleent.

Volg deze stappen om de IoT Hub connection string voor het servicebeleid op te halen:

  1. Selecteer Resourcegroepenin de Azure Portal. Selecteer de resourcegroep waar uw hub zich bevindt en selecteer vervolgens uw hub in de lijst met resources.

  2. Selecteer in het linkerdeelvenster van uw IoT-hub beleid voor gedeelde toegang.

  3. Selecteer het servicebeleid in de lijst met beleidsregels.

  4. Kopieer de Primaire connection string en sla de waarde op.

Schermopname van het ophalen van de connection string van uw IoT Hub in de Azure Portal.

Zie Toegangsbeheer en machtigingen voor meer informatie over IoT Hub gedeelde toegangsbeleid en -machtigingen.

Een cloud-naar-apparaat-bericht verzenden

In deze sectie maakt u een Java-console-app waarmee cloud-naar-apparaat-berichten worden verzonden naar de gesimuleerde apparaat-app. U hebt de apparaat-id van uw apparaat en uw IoT Hub connection string nodig.

  1. Maak een Maven-project met de naam send-c2d-messages met behulp van de volgende opdracht bij de opdrachtprompt. Houd er rekening mee dat deze opdracht een enkele, lange opdracht is:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=send-c2d-messages -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. Navigeer bij de opdrachtprompt naar de nieuwe map send-c2d-messages.

  3. Open met een teksteditor het pom.xml-bestand in de map send-c2d-messages en voeg de volgende afhankelijkheid toe aan het knooppunt afhankelijkheden . Als u de afhankelijkheid toevoegt, kunt u het pakket iothub-java-service-client in uw toepassing gebruiken om te communiceren met uw IoT Hub-service:

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

    Notitie

    U vindt de meest recente versie van iot-service-client met Maven zoeken.

  4. Sla het bestand pom.xml op en sluit het af.

  5. Open met een teksteditor het bestand send-c2d-messages\src\main\java\com\mycompany\app\App.java.

  6. Voeg de volgende importinstructies toe aan het bestand:

    import com.microsoft.azure.sdk.iot.service.*;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
  7. Voeg de volgende variabelen op klasseniveau toe aan de app-klasse en vervang {yourhubconnectionstring} en {yourdeviceid} door de waarden die u eerder hebt genoteerd:

    private static final String connectionString = "{yourhubconnectionstring}";
    private static final String deviceId = "{yourdeviceid}";
    private static final IotHubServiceClientProtocol protocol =    
        IotHubServiceClientProtocol.AMQPS;
    
  8. Vervang de main-methode door de volgende code. Deze code maakt verbinding met uw IoT-hub, verzendt een bericht naar uw apparaat en wacht vervolgens op een bevestiging dat het apparaat het bericht heeft ontvangen en verwerkt:

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

    Notitie

    Voor het gemak wordt in dit artikel geen beleid voor opnieuw proberen geïmplementeerd. In productiecode moet u beleid voor opnieuw proberen implementeren (zoals exponentieel uitstel), zoals wordt voorgesteld in het artikel Tijdelijke foutafhandeling.

  9. Als u de app send-c2d-messages wilt bouwen met behulp van Maven, voert u de volgende opdracht uit bij de opdrachtprompt in de map simulated-device:

    mvn clean package -DskipTests
    

De toepassingen uitvoeren

U bent nu klaar om de toepassingen uit te voeren.

  1. Voer bij een opdrachtprompt in de map azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages de volgende opdrachten uit, waarbij u de waarde van de {Your device connection string} tijdelijke aanduiding vervangt door het apparaat connection string u hebt gekopieerd van het geregistreerde apparaat in uw IoT-hub. Met deze stap start u de voorbeeldapparaat-app, die telemetrie verzendt naar uw IoT-hub en luistert naar cloud-naar-apparaat-berichten die vanaf uw hub worden verzonden:

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

    Schermopname van de voorbeeldapparaat-app die wordt uitgevoerd in een consolevenster.

  2. Voer bij een opdrachtprompt in de map send-c2d-messages de volgende opdracht uit om een cloud-naar-apparaat-bericht te verzenden en te wachten op een bevestiging van feedback:

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

    Schermopname van de voorbeeldservice-app die wordt uitgevoerd in een consolevenster.

Volgende stappen

In dit artikel hebt u geleerd hoe u cloud-naar-apparaat-berichten verzendt en ontvangt.