Routing dei messaggi tramite Hub IoT (Java)Routing messages with IoT Hub (Java)

L'hub IoT di Azure è un servizio completamente gestito che consente comunicazioni bidirezionali affidabili e sicure tra milioni di dispositivi e un back-end della soluzione.Azure IoT Hub is a fully managed service that enables reliable and secure bi-directional communications between millions of devices and a solution back end. Altre esercitazioni, ad esempio Get started with IoT Hub e Inviare messaggi da cloud a dispositivo con l'hub IoT, illustrano come usare le funzionalità di messaggistica di base da dispositivo a cloud e da cloud a dispositivo dell'hub IoT.Other tutorials (Get started with IoT Hub and Send cloud-to-device messages with IoT Hub) show you how to use the basic device-to-cloud and cloud-to-device messaging functionality of IoT Hub.

Questa esercitazione è basata sul codice mostrato nell'esercitazione Get started with IoT Hub e come usare il routing dei messaggi per elaborare i messaggi da dispositivo a cloud in modo scalabile.This tutorial builds on the code shown in the Get started with IoT Hub tutorial, and shows you how to use message routing to process device-to-cloud messages in a scalable way. L'esercitazione illustra come elaborare i messaggi che richiedono un intervento immediato dal back-end della soluzione.The tutorial illustrates how to process messages that require immediate action from the solution back end. Ad esempio, un dispositivo potrebbe inviare un messaggio di avviso che attiva l'inserimento di un ticket in un sistema CRM.For example, a device might send an alarm message that triggers inserting a ticket into a CRM system. Al contrario, i messaggi di punto dati vengono semplicemente inseriti in un motore di analisi.By contrast, data-point messages simply feed into an analytics engine. Ad esempio, i dati di telemetria sulla temperatura di un dispositivo che devono essere archiviati per una successiva analisi costituiscono un messaggio di punti dati.For example, temperature telemetry from a device that is to be stored for later analysis is a data-point message.

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

  • SimulatedDevice, una versione modificata dell'app creata nell'esercitazione Get started with IoT Hub , che invia messaggi di punti dati da dispositivo a cloud ogni secondo e messaggi interattivi da dispositivo a cloud ogni 10 secondi.simulated-device, a modified version of the app created in the Get started with IoT Hub tutorial, sends data-point device-to-cloud messages every second, and interactive device-to-cloud messages every 10 seconds. Questa app usa il protocollo AMQP per comunicare con l'hub IoT.This app uses the AMQP protocol to communicate with IoT Hub.
  • read-d2c-messages consente di visualizzare i dati di telemetria inviati dall'app per dispositivo.read-d2c-messages displays the telemetry sent by your device app.
  • read-critical-queue rimuove dalla coda i messaggi dalla coda importanti della coda del bus di servizio collegato all'hub IoT.read-critical-queue de-queues the critical messages from the Service Bus queue attached to the IoT hub.

Nota

L'hub IoT offre il supporto SDK per molte piattaforme e linguaggi, inclusi C, Java e JavaScript.IoT Hub has SDK support for many device platforms and languages, including C, Java, and JavaScript. Per istruzioni su come sostituire il dispositivo in questa esercitazione con un dispositivo fisico e su come connettere dispositivi a un hub IoT, fare riferimento al Centro per sviluppatori Azure IoT.For instructions on how to replace the device in this tutorial with a physical device, and how to connect devices to an 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:

Si consiglia anche la lettura della documentazione su Archiviazione di Azure e Bus di servizio di Azure.We also recommend reading about [Azure Storage] and [Azure Service Bus].

Inviare messaggi interattivi da un'app per dispositiviSend interactive messages from a device app

In questa sezione viene modificata l'app per dispositivi creata nell'esercitazione Get started with IoT Hub per inviare occasionalmente messaggi che richiedono un intervento immediato.In this section, you modify the device app you created in the Get started with IoT Hub tutorial to occasionally send messages that require immediate processing.

  1. Usare un editor di testo per aprire il file simulated-device\src\main\java\com\mycompany\app\App.java.Use a text editor to open the simulated-device\src\main\java\com\mycompany\app\App.java file. Questo file contiene il codice dell'app simulated-device creata durante l'esercitazione di Get started with IoT Hub .This file contains the code for the simulated-device app you created in the Get started with IoT Hub tutorial.

  2. Sostituire la classe MessageSender con il codice seguente:Replace the MessageSender class with the following code:

    private static class MessageSender implements Runnable {
    
        public void run()  {
            try {
                double minTemperature = 20;
                double minHumidity = 60;
                Random rand = new Random();
    
                while (true) {
                    String msgStr;
                    Message msg;
                    if (new Random().nextDouble() > 0.7) {
                        if (new Random().nextDouble() > 0.5) {
                            msgStr = "This is a critical message.";
                            msg = new Message(msgStr);
                            msg.setProperty("level", "critical");
                        } else {
                            msgStr = "This is a storage message.";
                            msg = new Message(msgStr);
                            msg.setProperty("level", "storage");
                        }
                    } else {
                        double currentTemperature = minTemperature + rand.nextDouble() * 15;
                        double currentHumidity = minHumidity + rand.nextDouble() * 20; 
                        TelemetryDataPoint telemetryDataPoint = new TelemetryDataPoint();
                        telemetryDataPoint.deviceId = deviceId;
                        telemetryDataPoint.temperature = currentTemperature;
                        telemetryDataPoint.humidity = currentHumidity;
    
                        msgStr = telemetryDataPoint.serialize();
                        msg = new Message(msgStr);
                    }
    
                    System.out.println("Sending: " + msgStr);
    
                    Object lockobj = new Object();
                    EventCallback callback = new EventCallback();
                    client.sendEventAsync(msg, callback, lockobj);
    
                    synchronized (lockobj) {
                        lockobj.wait();
                    }
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                System.out.println("Finished.");
            }
        }
    }
    

    Questo metodo aggiunge in modo casuale la proprietà "level": "critical" e "level": "storage" ai messaggi inviati dal dispositivo, simulando così un messaggio che richiede l'intervento immediato del back-end dell'applicazione o uno che richiede l'archiviazione permanente.This method randomly adds the property "level": "critical" and "level": "storage" to messages sent by the device, which simulates a message that requires immediate action by the application back-end or one that needs to be permanently stored. L'applicazione passa queste informazioni nelle proprietà del messaggio anziché nel corpo del messaggio, in modo che l'hub IoT possa indirizzare il messaggio alla destinazione messaggi appropriata.The application passes this information in the message properties, instead of in the message body, so that IoT Hub can route the message to the proper message destination.

    Nota

    È possibile usare le proprietà del messaggio per indirizzare i messaggi in diversi scenari, tra cui l'elaborazione del percorso a freddo, oltre all'esempio del percorso a caldo mostrato qui.You can use message properties to route messages for various scenarios including cold-path processing, in addition to the hot path example shown here.

  3. Salvare e chiudere il file simulated-device\src\main\java\com\mycompany\app\App.java.Save and close the simulated-device\src\main\java\com\mycompany\app\App.java file.

    Nota

    È consigliabile implementare criteri di ripetizione dei tentativi, ad esempio un backoff esponenziale, come indicato nell'articolo di MSDN relativo alla Transient Fault Handling.We strongly recommend that you implement a retry policy such as exponential backoff, as suggested in the MSDN article Transient Fault Handling.

  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
    

Aggiungere una coda all'hub IoT e indirizzarvi i messaggiAdd a queue to your IoT hub and route messages to it

In questa sezione, viene illustrato come creare una coda del bus di servizio, connetterla all'hub IoT e configurare l'hub IoT per inviare messaggi alla coda in base alla presenza di una proprietà del messaggio.In this section, you create a Service Bus queue, connect it to your IoT hub, and configure your IoT hub to send messages to the queue based on the presence of a property on the message. Per altre informazioni su come elaborare i messaggi dalle code del bus di servizio, vedere Get started with queues (Introduzione alle code).For more information about how to process messages from Service Bus queues, see Get started with queues.

  1. Creare una coda del bus di servizio, come descritto in Get started with queues (Introduzione alle code).Create a Service Bus queue as described in Get started with queues. Prendere nota dello spazio dei nomi e del nome della coda.Make a note of the namespace and queue name.

  2. Nel Portale di Azure, aprire l'hub IoT e fare clic su Endpoint.In the Azure portal, open your IoT hub and click Endpoints.

    Endpoint in hub IoT

  3. Nel pannello Endpoint fare clic su Aggiungi in alto per aggiungere la coda all'hub IoT.In the Endpoints blade, click Add at the top to add your queue to your IoT hub. Denominare l'endpoint CriticalQueue e usare il menu a discesa per selezionare Coda del bus di servizio, lo spazio dei nomi del bus di servizio in cui si trova la coda e il nome della coda.Name the endpoint CriticalQueue and use the drop-downs to select Service Bus queue, the Service Bus namespace in which your queue resides, and the name of your queue. Al termine, fare clic su Salva nella parte inferiore.When you are done, click Save at the bottom.

    Aggiunta di un endpoint

  4. Fare clic su Route nell'hub IoT.Now click Routes in your IoT Hub. Fare clic su Aggiungi nella parte superiore del pannello per creare una regola di routing che indirizzi i messaggi alla coda appena aggiunta.Click Add at the top of the blade to create a routing rule that routes messages to the queue you just added. Selezionare DeviceTelemetry come origine dei dati.Select DeviceTelemetry as the source of data. Immettere level="critical" come condizione, quindi scegliere la coda appena aggiunta come endpoint personalizzato, come endpoint della regola di routing.Enter level="critical" as the condition, and choose the queue you just added as a custom endpoint as the routing rule endpoint. Al termine, fare clic su Salva nella parte inferiore.When you are done, click Save at the bottom.

    Aggiunta di un route

    Assicurarsi che il route di fallback sia impostato su ON.Make sure the fallback route is set to ON. Questa impostazione è la configurazione predefinita dell'hub IoT.This setting is the default configuration of an IoT hub.

    Route di fallback

(Facoltativo) Lettura dell'endpoint della coda(Optional) Read from the queue endpoint

È facoltativamente possibile leggere i messaggi dall'endpoint della coda seguendo le istruzioni contenute in Get started with queues (Introduzione alle code).You can optionally read the messages from the queue endpoint by following the instructions in Get started with queues. Denominare l'app read-critical-queue.Name the app read-critical-queue.

Eseguire le applicazioniRun the applications

A questo punto è possibile eseguire le tre applicazioni.Now you are ready to run the three applications.

  1. Per eseguire l'applicazione read-d2c-messages in un prompt dei comandi o nella shell passare alla cartella read-d2c ed eseguire il comando seguente:To run the read-d2c-messages application, in a command prompt or shell navigate to the read-d2c folder and execute the following command:

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

    Eseguire read-d2c-messages

  2. Per eseguire l'applicazione read-critical-queue in un prompt dei comandi o nella shell passare alla cartella read-critical-queue ed eseguire il comando seguente:To run the read-critical-queue application, in a command prompt or shell navigate to the read-critical-queue folder and execute the following command:

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

    Eseguire read-critical-queue

  3. Per eseguire l'app simulated-device, in un prompt dei comandi o nella shell passare alla cartella simulated-device ed eseguire questo comando:To run the simulated-device app, in a command prompt or shell navigate to the simulated-device folder and execute the following command:

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

    Eseguire simulated-device

(Facoltativo) Aggiungere un contenitore di archiviazione all'hub IoT ed eseguirvi il routing dei messaggi(Optional) Add Storage Container to your IoT hub and route messages to it

In questa sezione, viene illustrato come creare un account di archiviazione, come connettere tale account all'hub IoT e come configurare l'hub IoT per inviare messaggi all'account in base alla presenza di una proprietà del messaggio.In this section, you create a Storage account, connect it to your IoT hub, and configure your IoT hub to send messages to the account based on the presence of a property on the message. Per altre informazioni su come gestire l'archiviazione, vedere la documentazione di Archiviazione di Azure.For more information about how to manage storage, see [Get started with Azure Storage][Azure Storage].

Nota

Se lo scenario non è limitato a un endpoint, è possibile configurare l'endpoint StorageContainer oltre all'endpoint CriticalQueue ed eseguire entrambi contemporaneamente.If you are not limited to one Endpoint, you may setup the StorageContainer in addition to the CriticalQueue and run both simulatneously.

  1. Creare un account di archiviazione come descritto nella [documentazione di Archiviazione di Azure][lnk-storage].Create a Storage account as described in [Azure Storage Documentation][lnk-storage]. Prendere nota del nome dell'account.Make a note of the account name.

  2. Nel Portale di Azure, aprire l'hub IoT e fare clic su Endpoint.In the Azure portal, open your IoT hub and click Endpoints.

  3. Nel pannello Endpoint selezionare l'endpoint CriticalQueue e fare clic su Elimina.In the Endpoints blade, select the CriticalQueue endpoint, and click Delete. Fare clic su e quindi su Aggiungi.Click Yes, and then click Add. Assegnare un nome all'endpoint StorageContainer, usare gli elenchi a discesa per selezionare Contenitore di archiviazione di Azure e creare un account di archiviazione e un contenitore di archiviazione.Name the endpoint StorageContainer and use the drop-downs to select Azure Storage Container, and create a Storage account and a Storage container. Prendere nota dei nomi.Make note of the names. Al termine, fare clic su OK nella parte inferiore.When you are done, click OK at the bottom.

    Nota

    Se lo scenario non è limitato a un endpoint, non è necessario eliminare l'endpoint CriticalQueue.If you are not limited to one Endpoint, you do not need to delete the CriticalQueue.

  4. Fare clic su Route nell'hub IoT.Click Routes in your IoT Hub. Fare clic su Aggiungi nella parte superiore del pannello per creare una regola di routing che indirizzi i messaggi alla coda appena aggiunta.Click Add at the top of the blade to create a routing rule that routes messages to the queue you just added. Selezionare Messaggi del dispositivo come origine dei dati.Select Device Messages as the source of data. Immettere level="storage" come condizione e scegliere StorageContainer come endpoint personalizzato, come endpoint della regola di routing.Enter level="storage" as the condition, and choose StorageContainer as a custom endpoint as the routing rule endpoint. Fare clic su Salva nella parte inferiore.Click Save at the bottom.

    Assicurarsi che il route di fallback sia impostato su ON.Make sure the fallback route is set to ON. Questa impostazione è la configurazione predefinita dell'hub IoT.This setting is the default configuration of an IoT hub.

  5. Verificare che le applicazioni precedenti siano ancora in esecuzione.Make sure your previous applications are still running.

  6. Nel portale di Azure passare all'account di archiviazione, in Servizio BLOB fare clic su Esplora BLOB. Selezionare il contenitore, passare al file JSON e fare clic su di esso e quindi fare clic su Download per visualizzare i dati.In the Azure Portal, go to your storage account, under Blob Service, click Browse blobs.... Select your container, navigate to and click the JSON file, and click Download to view the data.

Passaggi successiviNext steps

In questa esercitazione è stato descritto come inviare i messaggi da dispositivo a cloud in modo affidabile usando la funzionalità di routing dei messaggi dell'hub IoT.In this tutorial, you learned how to reliably dispatch device-to-cloud messages by using the message routing functionality of IoT Hub.

L'esercitazione Come inviare messaggi da cloud a dispositivo con l'hub IoT descrive le modalità di invio dei messaggi ai dispositivi dal back-end della soluzione.The How to send cloud-to-device messages with IoT Hub shows you how to send messages to your devices from your solution back end.

Per avere esempi di soluzioni complete che usano l'hub IoT, vedere 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].

Per ulteriori informazioni sul routing dei messaggi nell'hub IoT, vedere Inviare e ricevere messaggi con l'hub IoT.To learn more about message routing in IoT Hub, see Send and receive messages with IoT Hub.