Inviare messaggi da cloud a dispositivo con l'hub IoT (Java)Send cloud-to-device messages with IoT Hub (Java)

L'hub IoT di Azure è un servizio completamente gestito che consente di abilitare comunicazioni bidirezionali affidabili e sicure tra milioni di dispositivi e un back-end della soluzione.Azure IoT Hub is a fully managed service that helps enable reliable and secure bi-directional communications between millions of devices and a solution back end. L'esercitazione Introduzione all'hub IoT di Azure illustra come creare un hub IoT, effettuare il provisioning dell'identità di un dispositivo al suo interno e creare il codice di un'app per dispositivo simulato che invia messaggi da dispositivo a cloud.The [Get started with IoT Hub] tutorial shows how to create an IoT hub, provision a device identity in it, and code a simulated device app that sends device-to-cloud messages.

Questa esercitazione si basa su Introduzione all'hub IoT di Azure.This tutorial builds on [Get started with IoT Hub]. Illustra le operazioni seguenti:It shows you how to:

  • Dal back-end della soluzione inviare messaggi da cloud a dispositivo a un singolo dispositivo tramite l'hub IoT.From your solution back end, send cloud-to-device messages to a single device through IoT Hub.
  • Ricevere messaggi da cloud a dispositivo in un dispositivo.Receive cloud-to-device messages on a device.
  • Dal back-end della soluzione richiedere l'acknowledgement di recapito (feedback) per i messaggi inviati a un dispositivo dall'hub IoT.From your solution back end, request delivery acknowledgement (feedback) for messages sent to a device from IoT Hub.

Per altre informazioni sui messaggi da cloud a dispositivo, vedere laGuida per sviluppatori dell'hub IoT.You can find more information on cloud-to-device messages in the IoT Hub developer guide.

Al termine di questa esercitazione, vengono eseguite due app console Java:At the end of this tutorial, you run two Java console apps:

  • simulated-device, una versione modificata dell'app creata in Introduzione all'hub IoT di Azure, che si connette all'hub IoT e riceve messaggi da cloud a dispositivo.simulated-device, a modified version of the app created in [Get started with IoT Hub], which connects to your IoT hub and receives cloud-to-device messages.
  • send-c2d-messages, che invia un messaggio da cloud a dispositivo all'app per dispositivo simulato tramite l'hub IoT e riceve quindi l'acknowledgement del recapito.send-c2d-messages, which sends a cloud-to-device message to the simulated device app through IoT Hub, and then receives its delivery acknowledgement.

Nota

L’hub IoT dispone del supporto SDK per molte piattaforme e linguaggi (inclusi C, Java e Javascript) tramite gli SDK del dispositivo IoT Azure.IoT Hub has SDK support for many device platforms and languages (including C, Java, and Javascript) through Azure IoT device SDKs. Per istruzioni dettagliate su come connettere il dispositivo al codice dell'esercitazione e in generale all'hub IoT di Azure, vedere il Centro per sviluppatori Azure IoT.For step-by-step instructions on how to connect your device to this tutorial's code, and generally to Azure IoT Hub, see the [Azure IoT Developer Center].

Per completare l'esercitazione, sono necessari gli elementi seguenti:To complete this tutorial, you need the following:

Ricevere messaggi nell'app per dispositivo simulatoReceive messages in the simulated device app

In questa sezione si modificherà l'app per il dispositivo simulato creata in Introduzione all'hub IoT di Azure per ricevere i messaggi da cloud a dispositivo dall'hub IoT.In this section, you modify the simulated device app you created in [Get started with IoT Hub] to receive cloud-to-device messages from the IoT hub.

  1. Usando un editor di testo, aprire il file simulated-device\src\main\java\com\mycompany\app\App.java.Using a text editor, open the simulated-device\src\main\java\com\mycompany\app\App.java file.

  2. Aggiungere la seguente classe MessageCallback come classe annidata all'interno della classe App.Add the following MessageCallback class as a nested class inside the App class. Il metodo execute viene richiamato quando il dispositivo riceve un messaggio dall'hub IoT.The execute method is invoked when the device receives a message from IoT Hub. In questo esempio, il dispositivo notifica sempre all'hub IoT di aver completato il messaggio:In this example, the device always notifies the IoT hub that it has completed the message:

    private static class AppMessageCallback implements MessageCallback {
      public IotHubMessageResult execute(Message msg, Object context) {
        System.out.println("Received message from hub: "
          + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET));
    
        return IotHubMessageResult.COMPLETE;
      }
    }
    
  3. Modificare il metodo main per creare un'istanza di AppMessageCallback e chiamare il metodo setMessageCallback prima dell'apertura del client, come indicato di seguito:Modify the main method to create an AppMessageCallback instance and call the setMessageCallback method before it opens the client as follows:

    client = new DeviceClient(connString, protocol);
    
    MessageCallback callback = new AppMessageCallback();
    client.setMessageCallback(callback, null);
    client.open();
    

    Nota

    Se si usa HTTPS invece di MQTT o AMQP per il trasporto, l'istanza di DeviceClient controlla raramente i messaggi provenienti dall'hub IoT (meno di 25 minuti).If you use HTTPS instead of MQTT or AMQP as the transport, the DeviceClient instance checks for messages from IoT Hub infrequently (less than every 25 minutes). Per altre informazioni sulle differenze tra il supporto di MQTT, AMQP e HTTPS e sulla limitazione delle richieste dell'hub IoT, vedere Guida per gli sviluppatori dell'hub IoT.For more information about the differences between MQTT, AMQP and HTTPS support, and IoT Hub throttling, see the IoT Hub developer guide.

  4. Per compilare l'app simulated-device con Maven, eseguire questo comando al prompt dei comandi nella cartella simulated-device:To build the simulated-device app using Maven, execute the following command at the command prompt in the simulated-device folder:

    mvn clean package -DskipTests
    

Inviare un messaggio da cloud a dispositivoSend a cloud-to-device message

In questa sezione si crea un'app console Java che invia messaggi da cloud a dispositivo all'app del dispositivo simulato.In this section, you create a Java console app that sends cloud-to-device messages to the simulated device app. È necessario l'ID del dispositivo aggiunto nell'esercitazione Introduzione all'hub IoT di Azure .You need the device ID of the device you added in the [Get started with IoT Hub] tutorial. È necessaria anche la stringa di connessione per l'hub IoT, disponibile nel portale di Azure.You also need the IoT Hub connection string for your hub that you can find in the [Azure portal].

  1. Creare un progetto Maven denominato send-c2d-messages eseguendo questo comando al prompt dei comandi.Create a Maven project called send-c2d-messages using the following command at your command prompt. Si noti che si tratta di un lungo comando singolo:Note this command is a single, long command:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=send-c2d-messages -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. Al prompt dei comandi passare alla nuova cartella send-c2d-messages.At your command prompt, navigate to the new send-c2d-messages folder.

  3. In un editor di testo aprire il file pom.xml nella cartella send-c2d-messages e aggiungere la dipendenza seguente al nodo dependencies .Using a text editor, open the pom.xml file in the send-c2d-messages folder and add the following dependency to the dependencies node. L'aggiunta della dipendenza consente di usare il pacchetto iothub-java-service-client nell'applicazione per comunicare con il servizio hub IoT:Adding the dependency enables you to use the iothub-java-service-client package in your application to communicate with your IoT hub service:

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

    Nota

    È possibile cercare la versione più recente di iot-service-client usando la ricerca di Maven.You can check for the latest version of iot-service-client using Maven search.

  4. Salvare e chiudere il file pom.xml.Save and close the pom.xml file.

  5. In un editor di testo aprire il file send-c2d-messages\src\main\java\com\mycompany\app\App.java.Using a text editor, open the send-c2d-messages\src\main\java\com\mycompany\app\App.java file.

  6. Aggiungere al file le istruzioni import seguenti:Add the following import statements to the file:

    import com.microsoft.azure.sdk.iot.service.*;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
  7. Aggiungere le variabili a livello di classe seguenti alla classe App, sostituendo {yourhubconnectionstring} e {yourdeviceid} con i valori annotati prima:Add the following class-level variables to the App class, replacing {yourhubconnectionstring} and {yourdeviceid} with the values your noted earlier:

    private static final String connectionString = "{yourhubconnectionstring}";
    private static final String deviceId = "{yourdeviceid}";
    private static final IotHubServiceClientProtocol protocol = IotHubServiceClientProtocol.AMQPS;
    
  8. Sostituire il metodo main con il codice seguente.Replace the main method with the following code. Il codice seguente si connette all'hub IoT, invia un messaggio al dispositivo e quindi attende un riconoscimento che il dispositivo ha ricevuto ed elaborato il messaggio:This code connects to your IoT hub, sends a message to your device, and then waits for an acknowledgment that the device received and processed the message:

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

    Nota

    Per semplicità, in questa esercitazione non si implementa alcun criterio di nuovi tentativi.For simplicity's sake, this tutorial does not implement any retry policy. Nel codice di produzione è consigliabile implementare criteri di ripetizione dei tentativi, ad esempio un backoff esponenziale, come indicato nell'articolo di MSDN Transient Fault Handling.In production code, you should implement retry policies (such as exponential backoff), as suggested in the MSDN article Transient Fault Handling.

  9. Per compilare l'app simulated-device con Maven, eseguire questo comando al prompt dei comandi nella cartella simulated-device:To build the simulated-device app using Maven, execute the following command at the command prompt in the simulated-device folder:

    mvn clean package -DskipTests
    

Eseguire le applicazioniRun the applications

A questo punto è possibile eseguire le applicazioni.You are now ready to run the applications.

  1. Al prompt dei comandi nella cartella simulated-device eseguire questo comando per iniziare a inviare i dati di telemetria all'hub IoT e rimanere in ascolto dei messaggi da cloud a dispositivo inviati dall'hub:At a command prompt in the simulated-device folder, run the following command to begin sending telemetry to your IoT hub and to listen for cloud-to-device messages sent from your hub:

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

    Eseguire un'app di dispositivo simulato

  2. A un prompt dei comandi nella cartella send-c2d-messages eseguire questo comando per inviare un messaggio da cloud a dispositivo e attendere un acknowledgment di feedback:At a command prompt in the send-c2d-messages folder, run the following command to send a cloud-to-device message and wait for a feedback acknowledgment:

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

    Eseguire il comando per inviare il messaggio dal cloud al dispositivo

Passaggi successiviNext steps

In questa esercitazione è stato descritto come inviare e ricevere messaggi da cloud a dispositivo.In this tutorial, you learned how to send and receive cloud-to-device messages.

Per avere degli esempi di soluzioni complete che utilizzano l'hub IoT, vedere la Azure IoT Suite.To see examples of complete end-to-end solutions that use IoT Hub, see Azure IoT Suite.

Per altre informazioni sullo sviluppo delle soluzioni con l'hub IoT, vedere la Guida per sviluppatori dell'hub IoT.To learn more about developing solutions with IoT Hub, see the [IoT Hub developer guide].