Connettere il dispositivo all'hub IoT usando .NET

Introduzione

L'hub IoT di Azure è un servizio completamente gestito che consente comunicazioni bidirezionali affidabili e sicure tra milioni di dispositivi IoT (Internet delle cose) e un back-end della soluzione. Una delle maggiori difficoltà con i progetti IoT consiste nel connettere in modo affidabile e sicuro i dispositivi al back-end della soluzione. Per affrontare questa sfida, l'hub IoT:

  • Offre messaggistica affidabile da dispositivo a cloud e da cloud a dispositivo su vasta scala.
  • Rende possibili comunicazioni sicure mediante le credenziali di sicurezza per i singoli dispositivi e il controllo di accesso.
  • Comprende librerie di dispositivi per i linguaggi e le piattaforme più diffusi.

Questa esercitazione illustra come:

  • Usare il portale di Azure per creare un hub IoT.
  • Creare un'identità del dispositivo nell'hub IoT.
  • Creare un'app per dispositivo simulato che invii dati di telemetria al back-end della soluzione.

Al termine di questa esercitazione si avranno tre app di console .NET:

  • CreateDeviceIdentity, che crea un'identità del dispositivo e la chiave di sicurezza associata per connettere l'app per dispositivi.
  • ReadDeviceToCloudMessages, che visualizza i dati di telemetria inviati dall'app per dispositivi.
  • SimulatedDevice, che si connette all'hub IoT con l'identità del dispositivo creata in precedenza e invia un messaggio di telemetria ogni secondo usando il protocollo MQTT.

È possibile scaricare o clonare la soluzione di Visual Studio contenente le tre app da Github.

git clone https://github.com/Azure-Samples/iot-hub-dotnet-simulated-device-client-app.git
Nota

Per informazioni sugli Azure IoT SDK che consentono di compilare le applicazioni da eseguire nei dispositivi e i back-end della soluzione, vedere Azure IoT SDK.

Per completare l'esercitazione, sono necessari gli elementi seguenti:

  • Visual Studio 2015 o Visual Studio 2017.
  • Un account Azure attivo. Se non si ha un account, è possibile creare un account gratuito in pochi minuti.

Creare un hub IoT

Creare un hub IoT per connettere l'app per dispositivo simulato. La procedura seguente illustra come completare questa attività usando il portale di Azure.

  1. Accedere al portale di Azure.
  2. Nell'indice fare clic su Nuovo > Internet delle cose > Hub IoT.

    Indice del portale di Azure

  3. Nel pannello Hub IoT scegliere la configurazione per l'hub IoT.

    Pannello Hub IoT

    1. Nella casella Nome immettere un nome per l'hub IoT. Se il Nome è valido e disponibile, appare un segno di spunta verde nella casella Nome.

      Importante

      L'hub IoT sarà individuabile pubblicamente come endpoint DNS, quindi evitare di indicare informazioni riservate nell'assegnazione del nome.

    2. Selezionare un piano tariffario e un livello di scalabilità. Per questa esercitazione non è necessario un livello specifico. Per questa esercitazione, usare il livello F1 gratuito.

    3. In Gruppo di risorse creare un gruppo di risorse o selezionarne uno esistente. Per altre informazioni, vedere Using resource groups to manage your Azure resources (Uso di Gruppi di risorse per gestire le risorse di Azure).
    4. In Percorsoselezionare il percorso per ospitare l'hub IoT. Per questa esercitazione, scegliere la località più vicina.
  4. Dopo aver scelto le opzioni di configurazione dell'hub IoT, fare clic su Crea. La creazione dell'hub IoT da parte di Azure può richiedere alcuni minuti. Per verificare lo stato, è possibile monitorare l'avanzamento nella Schermata iniziale o nel pannello Notifiche.

    Stato del nuovo hub IoT

  5. Dopo avere creato l'hub IoT, fare clic sul nuovo riquadro per l'hub IoT nel portale di Azure per aprire il pannello del nuovo hub IoT. Annotare il Nome host, quindi fare clic su Criteri di accesso condiviso.

    Pannello del nuovo hub IoT

  6. Nel pannello Criteri di accesso condivisi fare clic sul criterio iothubowner, quindi copiare e annotare la stringa di connessione dell'hub IoT nel pannello iothubowner. Per altre informazioni, vedere Controllo di accesso nella "Guida per gli sviluppatori dell'hub IoT".

    Pannello Criteri di accesso condivisi

L'hub IoT è stato così creato e sono ora disponibili il nome host e la stringa di connessione dell'hub necessari per completare il resto di questa esercitazione.

Creare un'identità del dispositivo

In questa sezione si scriverà un'app console .NET che crea un'identità del dispositivo nel registro delle identità dell'hub IoT. Un dispositivo non può connettersi all'hub IoT a meno che non abbia una voce nel registro di identità. Per altre informazioni, vedere la sezione "Registro di identità" della Guida per gli sviluppatori dell'hub IoT. Quando si esegue questa app console vengono generati un ID dispositivo univoco e una chiave con cui il dispositivo può identificarsi quando invia messaggi da dispositivo a cloud all'hub IoT. Gli ID dispositivo fanno distinzione tra maiuscole e minuscole.

  1. In Visual Studio aggiungere un progetto desktop classico di Windows Visual C# a una nuova soluzione usando il modello di progetto App console (.NET Framework). Verificare che la versione di .NET Framework sia 4.5.1 o successiva. Denominare il progetto CreateDeviceIdentity e denominare la soluzione IoTHubGetStarted.

    Nuovo progetto desktop di Windows classico in Visual C#

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto CreateDeviceIdentity e quindi scegliere Gestisci pacchetti NuGet.
  3. Nella finestra Gestione pacchetti NuGet selezionare Esplora, cercare microsoft.azure.devices, selezionare Installa per installare il pacchetto Microsoft.Azure.Devices e accettare le condizioni per l'uso. Questa procedura scarica, installa e aggiunge un riferimento al pacchetto NuGet Azure IoT - SDK per dispositivi e alle relative dipendenze.

    Finestra Gestione pacchetti NuGet

  4. Aggiungere le istruzione using seguenti all'inizio del file Program.cs :

     using Microsoft.Azure.Devices;
     using Microsoft.Azure.Devices.Common.Exceptions;
    
  5. Aggiungere i campi seguenti alla classe Program . Sostituire il valore del segnaposto con la stringa di connessione dell'hub IoT creato nella sezione precedente.

     static RegistryManager registryManager;
     static string connectionString = "{iot hub connection string}";
    
  6. Aggiungere il metodo seguente alla classe Program :

     private static async Task AddDeviceAsync()
     {
         string deviceId = "myFirstDevice";
         Device device;
         try
         {
             device = await registryManager.AddDeviceAsync(new Device(deviceId));
         }
         catch (DeviceAlreadyExistsException)
         {
             device = await registryManager.GetDeviceAsync(deviceId);
         }
         Console.WriteLine("Generated device key: {0}", device.Authentication.SymmetricKey.PrimaryKey);
     }
    

    Questo metodo crea un'identità del dispositivo con ID myFirstDevice. Se questo ID dispositivo è già disponibile nel registro delle identità, il codice recupera semplicemente le informazioni sul dispositivo esistenti. L'app visualizzerà quindi la chiave primaria per l'identità. Questa chiave verrà usata dall'app per dispositivo simulato per connettersi all'hub IoT.

    Importante

    L'ID dispositivo può essere visibile nei log raccolti per il supporto tecnico e la risoluzione dei problemi, quindi evitare di indicare informazioni riservate nell'assegnazione del nome.

  7. Aggiungere infine le righe seguenti al metodo Main :

     registryManager = RegistryManager.CreateFromConnectionString(connectionString);
     AddDeviceAsync().Wait();
     Console.ReadLine();
    
  8. Eseguire l'applicazione e prendere nota della chiave del dispositivo.

    Chiave del dispositivo generata dall'applicazione

Nota

Il registro di identità dell'hub IoT archivia solo le identità del dispositivo per abilitare l'accesso sicuro all'hub. Archivia gli ID dispositivo e le chiavi da usare come credenziali di sicurezza e un flag di attivazione/disattivazione che consente di disabilitare l'accesso per un singolo dispositivo. Se l'applicazione deve archiviare altri metadati specifici del dispositivo, dovrà usare un archivio specifico dell'applicazione. Per altre informazioni, vedere la Guida per gli sviluppatori dell'hub IoT.

Ricezione di messaggi da dispositivo a cloud

In questa sezione si crea un'app console di .NET che legge i messaggi da dispositivo a cloud dall'hub IoT. Un hub IoT espone un endpoint compatibile con gli hub eventi di Azure per abilitare la lettura dei messaggi dispositivo a cloud. Per semplicità, questa esercitazione crea un lettore di base non adatto per una distribuzione con velocità effettiva elevata. Per informazioni sull'elaborazione di messaggi dispositivo a cloud su vasta scala, vedere l'esercitazione Elaborare messaggi dispositivo a cloud. Per altre informazioni su come elaborare i messaggi da Hub eventi, vedere l'esercitazione Introduzione all'Hub eventi. Questa esercitazione è applicabile agli endpoint compatibili con Hub eventi di hub IoT.

Nota

L'endpoint compatibile con Hub eventi per la lettura di messaggi da dispositivo a cloud usa sempre il protocollo AMQP.

  1. In Visual Studio aggiungere un progetto desktop di Windows classico Visual C# alla soluzione corrente usando il modello di progetto App console (.NET Framework). Verificare che la versione di .NET Framework sia 4.5.1 o successiva. Denominare il progetto ReadDeviceToCloudMessages.

    Nuovo progetto desktop di Windows classico in Visual C#

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto ReadDeviceToCloudMessages e quindi scegliere Gestisci pacchetti NuGet.

  3. Nella finestra Gestione pacchetti NuGet cercare WindowsAzure.ServiceBus, fare clic su Installa e accettare le condizioni per l'uso. Questa procedura scarica, installa e aggiunge un riferimento al bus di servizio di Microsoft Azure con le relative dipendenze. Questo pacchetto consente all'applicazione di connettersi all'endpoint compatibile con l'hub eventi dell'hub IoT.

  4. Aggiungere le istruzione using seguenti all'inizio del file Program.cs :

    using Microsoft.ServiceBus.Messaging;
    using System.Threading;
    
  5. Aggiungere i campi seguenti alla classe Program . Sostituire il valore del segnaposto con la stringa di connessione dell'hub IoT creato nella sezione "Creare un hub IoT".

    static string connectionString = "{iothub connection string}";
    static string iotHubD2cEndpoint = "messages/events";
    static EventHubClient eventHubClient;
    
  6. Aggiungere il metodo seguente alla classe Program :

    private static async Task ReceiveMessagesFromDeviceAsync(string partition, CancellationToken ct)
    {
        var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.UtcNow);
        while (true)
        {
            if (ct.IsCancellationRequested) break;
            EventData eventData = await eventHubReceiver.ReceiveAsync();
            if (eventData == null) continue;
    
            string data = Encoding.UTF8.GetString(eventData.GetBytes());
            Console.WriteLine("Message received. Partition: {0} Data: '{1}'", partition, data);
        }
    }
    

    Questo metodo usa un'istanza EventHubReceiver per ricevere i messaggi da tutte le partizioni di ricezione da dispositivo a cloud dell'hub IoT. Si noti come viene passato un parametro DateTime.Now quando si crea l'oggetto EventHubReceiver in modo che riceva solo i messaggi inviati dopo l'avvio. Questo filtro è utile in un ambiente di test perché consente di visualizzare il set di messaggi corrente. In un ambiente di produzione, il codice deve verificare di avere elaborato tutti i messaggi. Per altre informazioni, vedere l'esercitazione Come elaborare messaggi da dispositivo a cloud dell'hub IoT.

  7. Aggiungere infine le righe seguenti al metodo Main :

    Console.WriteLine("Receive messages. Ctrl-C to exit.\n");
    eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, iotHubD2cEndpoint);
    
    var d2cPartitions = eventHubClient.GetRuntimeInformation().PartitionIds;
    
    CancellationTokenSource cts = new CancellationTokenSource();
    
    System.Console.CancelKeyPress += (s, e) =>
    {
        e.Cancel = true;
        cts.Cancel();
        Console.WriteLine("Exiting...");
    };
    
    var tasks = new List<Task>();
    foreach (string partition in d2cPartitions)
    {
        tasks.Add(ReceiveMessagesFromDeviceAsync(partition, cts.Token));
    }  
    Task.WaitAll(tasks.ToArray());
    

Creare un'app per dispositivi

In questa sezione si crea un'app console di .NET che simula un dispositivo che invia messaggi da dispositivo a cloud a un hub IoT.

  1. In Visual Studio aggiungere un progetto desktop di Windows classico Visual C# alla soluzione corrente usando il modello di progetto App console (.NET Framework). Verificare che la versione di .NET Framework sia 4.5.1 o successiva. Denominare il progetto SimulatedDevice.

    Nuovo progetto desktop di Windows classico in Visual C#

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto SimulatedDevice e quindi scegliere Gestisci pacchetti NuGet.

  3. Nella finestra Gestione pacchetti NuGet selezionare Esplora, cercare Microsoft.Azure.Devices.Client, selezionare Installa per installare il pacchetto Microsoft.Azure.Devices.Client e accettare le condizioni per l'uso. Questa procedura scarica, installa e aggiunge un riferimento al pacchetto NuGet Azure IoT SDK per dispositivi e alle relative dipendenze.

  4. Aggiungere l'istruzione using seguente all'inizio del file Program.cs :

    using Microsoft.Azure.Devices.Client;
    using Newtonsoft.Json;
    
  5. Aggiungere i campi seguenti alla classe Program . Sostituire {iot hub hostname} con il nome host dell'hub IoT recuperato nella sezione relativa alla creazione di un hub IoT. Sostituire {device key} con la chiave di dispositivo recuperata nella sezione relativa alla creazione di un'identità del dispositivo.

    static DeviceClient deviceClient;
    static string iotHubUri = "{iot hub hostname}";
    static string deviceKey = "{device key}";
    
  6. Aggiungere il metodo seguente alla classe Program :

    private static async void SendDeviceToCloudMessagesAsync()
    {
        double minTemperature = 20;
        double minHumidity = 60;
        int messageId = 1;
        Random rand = new Random();
    
        while (true)
        {
            double currentTemperature = minTemperature + rand.NextDouble() * 15;
            double currentHumidity = minHumidity + rand.NextDouble() * 20;
    
            var telemetryDataPoint = new
            {
                messageId = messageId++,
                deviceId = "myFirstDevice",
                temperature = currentTemperature,
                humidity = currentHumidity
            };
            var messageString = JsonConvert.SerializeObject(telemetryDataPoint);
            var message = new Message(Encoding.ASCII.GetBytes(messageString));
            message.Properties.Add("temperatureAlert", (currentTemperature > 30) ? "true" : "false");
    
            await deviceClient.SendEventAsync(message);
            Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, messageString);
    
            await Task.Delay(1000);
        }
    }
    

    Questo metodo invia un nuovo messaggio da dispositivo a cloud ogni secondo. Il messaggio contiene un oggetto serializzato JSON con ID dispositivo e numeri generati casualmente per simulare un sensore temperatura e un sensore umidità.

  7. Aggiungere infine le righe seguenti al metodo Main :

    Console.WriteLine("Simulated device\n");
    deviceClient = DeviceClient.Create(iotHubUri, new DeviceAuthenticationWithRegistrySymmetricKey ("myFirstDevice", deviceKey), TransportType.Mqtt);
    
    SendDeviceToCloudMessagesAsync();
    Console.ReadLine();
    

    Per impostazione predefinita, il metodo Create in un'app .NET Framework crea un'istanza di DeviceClient che usa il protocollo AMQP per comunicare con l'hub IoT. Per usare il protocollo MQTT o HTTP, usare l'override del metodo Crea, che consente di specificare il protocollo. I client UWP e PCL usano il protocollo HTTP per impostazione predefinita. Se si usa il protocollo HTTP, è necessario aggiungere anche il pacchetto NuGet Microsoft.AspNet.WebApi.Client al progetto per includere lo spazio dei nomi System.Net.Http.Formatting.

Questa esercitazione illustra i passaggi per creare un'app per dispositivi dell'hub IoT. È anche possibile usare l'estensione di Visual Studio Connected Service for Azure IoT Hub (Servizio connesso per hub IoT Azure) per aggiungere il codice necessario all'app per dispositivo.

Nota

Per semplicità, in questa esercitazione non si implementa alcun criterio di ripetizione dei tentativi. Nel codice di produzione è consigliabile implementare criteri per i tentativi, ad esempio un backoff esponenziale, come illustrato nell'articolo di MSDN Transient Fault Handling (Gestione degli errori temporanei).

Eseguire le app

A questo punto è possibile eseguire le app.

  1. In Esplora soluzioni in Visual Studio fare clic con il pulsante destro del mouse sulla soluzione e quindi scegliere Imposta progetti di avvio. Selezionare Progetti di avvio multipli e quindi selezionare Avvio come azione per entrambi i progetti ReadDeviceToCloudMessages e SimulatedDevice.

    Proprietà del progetto di avvio

  2. Premere F5 avviare entrambe le app in esecuzione. L'output della console dall'app SimulatedDevice visualizza i messaggi inviati dall'app per dispositivi all'hub IoT. L'output della console dall'app ReadDeviceToCloudMessages visualizza i messaggi ricevuti dall'hub IoT.

    Output della console dalle app

  3. Il riquadro Utilizzo nel portale di Azure mostra il numero di messaggi inviati all'hub IoT:

    Riquadro Utilizzo del portale di Azure

Passaggi successivi

In questa esercitazione è stato configurato un hub IoT nel portale di Azure ed è stata quindi creata un'identità del dispositivo nel registro di identità dell'hub IoT. Questa identità del dispositivo è stata usata per consentire all'app per dispositivi di inviare messaggi da dispositivo a cloud all'hub IoT. È stata anche creata un'app che visualizza i messaggi ricevuti dall'hub IoT.

Per altre informazioni sulle attività iniziali con l'hub IoT e per esplorare altri scenari IoT, vedere:

Per informazioni sull'estensione della soluzione IoT e l'elaborazione di messaggi dispositivo a cloud su vasta scala, vedere l'esercitazione Elaborare messaggi dispositivo a cloud.

Per altre informazioni sulle attività iniziali con l'hub IoT di Azure e per esplorare altri scenari IoT, vedere: