Routing dei messaggi tramite Hub IoT (.NET)Routing messages with IoT Hub (.NET)

Questa esercitazione si basa sull'esercitazione Introduzione a hub IoT.This tutorial builds on the [Get started with IoT Hub] tutorial. L'esercitazione:The tutorial:

  • Illustra come usare le regole di routing per inviare i messaggi da dispositivo a cloud con un semplice metodo basato sulla configurazione.Shows you how to use routing rules to dispatch device-to-cloud messages in an easy, configuration-based way.
  • Illustra come isolare i messaggi interattivi che richiedono un intervento immediato del back-end della soluzione per essere elaborati in seguito.Illustrates how to isolate interactive messages that require immediate action from the solution back end for further processing. 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, come ad esempio la telemetria di temperatura, vengono semplicemente inseriti in un motore di analisi.In contrast, data-point messages, such as temperature telemetry, feed into an analytics engine.

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

  • SimulatedDevice, una versione modificata dell'app creata nell'esercitazione Introduzione a hub IoT, che invia messaggi di punti dati da dispositivo a cloud ogni secondo e messaggi interattivi da dispositivo a cloud ogni 10 secondi.SimulatedDevice, 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.
  • ReadDeviceToCloudMessages mostra i dati di telemetria non fondamentali inviati dall'app per dispositivi.ReadDeviceToCloudMessages that displays the non-critical telemetry sent by your device app.
  • ReadCriticalQueue rimuove i messaggi importanti inviati dall'app per dispositivi da una coda del bus di servizio.ReadCriticalQueue de-queues the critical messages sent by your device app from a Service Bus queue. Questa coda è collegata all'hub IoT.This queue is 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 informazioni su come sostituire il dispositivo simulato in questa esercitazione con un dispositivo fisico, fare riferimento al Centro per sviluppatori Azure IoT.To learn how to replace the simulated device in this tutorial with a physical device, see the [Azure IoT Developer Center].

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

  • Visual Studio 2015 o Visual Studio 2017.Visual Studio 2015 or Visual Studio 2017.
  • Un account Azure attivo.An active Azure account.
    Se non si ha un account, è possibile creare un account gratuito in pochi minuti.If you don't have an account, you can create a free account in just a couple of minutes.

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 interattiviSend interactive messages

Modificare l'app per dispositivi creata nell'esercitazione Introduzione a hub IoT per inviare occasionalmente messaggi interattivi.Modify the device app you created in the [Get started with IoT Hub] tutorial to occasionally send interactive messages.

In Visual Studio, nel progetto SimulatedDevice sostituire il metodo SendDeviceToCloudMessagesAsync con il codice seguente:In Visual Studio, in the SimulatedDevice project, replace the SendDeviceToCloudMessagesAsync method with the following code:

private static async void SendDeviceToCloudMessagesAsync()
{
    double minTemperature = 20;
    double minHumidity = 60;
    Random rand = new Random();

    while (true)
    {
        double currentTemperature = minTemperature + rand.NextDouble() * 15;
        double currentHumidity = minHumidity + rand.NextDouble() * 20;

        var telemetryDataPoint = new
        {
            deviceId = "myFirstDevice",
            temperature = currentTemperature,
            humidity = currentHumidity
        };
        var messageString = JsonConvert.SerializeObject(telemetryDataPoint);
        string levelValue;

        if (rand.NextDouble() > 0.7)
        {
            if (rand.NextDouble() > 0.5)
            {
                messageString = "This is a critical message";
                levelValue = "critical";
            }
            else 
            {
                messageString = "This is a storage message";
                levelValue = "storage";
            }
        }
        else
        {
            levelValue = "normal";
        }

        var message = new Message(Encoding.ASCII.GetBytes(messageString));
        message.Properties.Add("level", levelValue);

        await deviceClient.SendEventAsync(message);
        Console.WriteLine("{0} > Sent message: {1}", DateTime.Now, messageString);

        await Task.Delay(1000);
    }
}

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.

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.

Eseguire il routing dei messaggi a una coda nell'hub IoTRoute messages to a queue in your IoT hub

In questa sezione verrà illustrato come:In this section, you:

  • Creare una coda del bus di servizio.Create a Service Bus queue.
  • Collegarla all'hub IoT.Connect it to your IoT hub.
  • Configurare l'hub IoT per inviare messaggi alla coda in base alla presenza di una proprietà del messaggio.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. La coda deve trovarsi nella stessa area e nella stessa sottoscrizione dell'hub IoT.The queue must be in the same subscription and region as your IoT hub. Prendere nota dello spazio dei nomi e del nome della coda.Make a note of the namespace and queue name.

    Nota

    Nelle code e negli argomenti del bus di servizio usati come endpoint dell'hub IoT non devono essere abilitati le sessioni e il rilevamento duplicati.Service Bus queues and topics used as IoT Hub endpoints must not have Sessions or Duplicate Detection enabled. Se una di queste opzioni è abilitata, l'endpoint risulta non raggiungibile nel portale di Azure.If either of those options are enabled, the endpoint appears as Unreachable in the Azure portal.

  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. Questo valore rappresenta la configurazione predefinita dell'hub IoT.This value is the default configuration for an IoT hub.

    Route di fallback

Lettura dell'endpoint della codaRead from the queue endpoint

In questa sezione è possibile leggere i messaggi dell'endpoint della coda.In this section, you read the messages from the queue endpoint.

  1. In Visual Studio aggiungere un progetto desktop di Windows classico in Visual C# usando il modello di progetto App console (.NET Framework).In Visual Studio, add a Visual C# Windows Classic Desktop project to the current solution, by using the Console App (.NET Framework) project template. Denominare il progetto ReadCriticalQueue.Name the project ReadCriticalQueue.

  2. In Esplora soluzioni fare clic con il tasto destro del mouse sul progetto ReadCriticalQueue e quindi scegliere Gestisci pacchetti NuGet.In Solution Explorer, right-click the ReadCriticalQueue project, and then click Manage NuGet Packages. Viene visualizzata la finestra Gestione pacchetti NuGet.This operation displays the NuGet Package Manager window.

  3. Cercare WindowsAzure.ServiceBus, fare clic su Installa e quindi accettare le condizioni per l'uso.Search for WindowsAzure.ServiceBus, click Install, and accept the terms of use. Viene quindi scaricato e installato il bus di servizio di Azure e viene aggiunto un riferimento ad esso, insieme alle relative dipendenze.This operation downloads, installs, and adds a reference to the Azure Service Bus, with all its dependencies.

  4. All'inizio del file Program.cs aggiungere le istruzioni using seguenti:Add the following using statements at the top of the Program.cs file:

    using System.IO;
    using Microsoft.ServiceBus.Messaging;
    
  5. Aggiungere infine le righe seguenti al metodo Main .Finally, add the following lines to the Main method. Sostituire la stringa di connessione con le autorizzazioni Ascolto per la coda:Substitute the connection string with Listen permissions for the queue:

    Console.WriteLine("Receive critical messages. Ctrl-C to exit.\n");
    var connectionString = "{service bus listen string}";
    var queueName = "{queue name}";
    
    var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
    
    client.OnMessage(message =>
        {
            Stream stream = message.GetBody<Stream>();
            StreamReader reader = new StreamReader(stream, Encoding.ASCII);
            string s = reader.ReadToEnd();
            Console.WriteLine(String.Format("Message body: {0}", s));
        });
    
    Console.ReadLine();
    

Eseguire le applicazioniRun the applications

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

  1. In Esplora soluzioni di Visual Studio fare clic con il pulsante destro del mouse sulla soluzione e scegliere Imposta progetti di avvio.In Visual Studio, in Solution Explorer, right-click your solution and select Set StartUp Projects. Selezionare Progetti di avvio multipli, quindi selezionare Avvio come azione per i progetti ReadDeviceToCloudMessages, SimulatedDevice e ReadCriticalQueue.Select Multiple startup projects, then select Start as the action for the ReadDeviceToCloudMessages, SimulatedDevice, and ReadCriticalQueue projects.
  2. Premere F5 per avviare le tre app console.Press F5 to start the three console apps. L'app ReadDeviceToCloudMessages include solo i messaggi non critici inviati dall'applicazione SimulatedDevice, mentre l'app ReadCriticalQueue include solo i messaggi critici.The ReadDeviceToCloudMessages app has only non-critical messages sent from the SimulatedDevice application, and the ReadCriticalQueue app has only critical messages.

    Tre app console

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