Procedura per vedere un dispositivo che manda dati a un hub IoT e un programma .NET che li legge, senza avere un dispositivo. Al posto del Raspberry Pi si usa il simulatore che Microsoft pubblica sul web: è una pagina, non si installa niente.

Occorre: un account Azure con una sottoscrizione attiva, .NET 10 sul computer, un browser. Durata: circa venticinque minuti. Costo: il piano gratuito F1 costa 0 USD al mese e accetta 8000 messaggi al giorno. Di hub gratuiti se ne può tenere uno solo per sottoscrizione.

Il portale delle schermate è in inglese: i nomi dei comandi sono riportati come appaiono a schermo.

Preparare l'hub

1. Crea l'hub IoT

Nel portale, Create a resource, cerca IoT hub e premi Create. Nella scheda Basics, accanto a Resource group, premi Create new e scrivi rg-guide-iot-01.

Il gruppo di risorse creato dentro il modulo dell'hub

2. Scegli il piano gratuito

Compila il resto della scheda:

  • IoT hub name: iot-guide-01
  • Region: West Europe
  • Tier: Free

Scelto Free, il limite giornaliero passa da solo a 8000 messaggi e il prezzo a 0 USD al mese. Il portale avvisa che il piano gratuito non si può né allargare né promuovere a pagamento: serve a provare, non a reggere un impianto.

La scheda Basics con il piano Free e 8000 messaggi al giorno

3. Controlla e crea

Premi Review + create. Il riepilogo riporta 0 USD al mese, il gruppo, il nome, la regione e il piano.

Il riepilogo prima della creazione

Premi Create. La creazione dura poco più di un minuto. Quando finisce, apri l'hub: nella panoramica compaiono il nome di rete (iot-guide-01.azure-devices.net), il piano e il contatore dei messaggi, ancora a zero.

La panoramica dell'hub appena creato

4. Registra il dispositivo

Nel menu dell'hub, Device management > Devices, poi Add Device. Scrivi raspberry-01 come Device ID e lascia il resto com'è: chiave simmetrica, chiavi generate dal portale, dispositivo abilitato.

Il modulo di creazione del dispositivo

Premi Save.

5. Copia la stringa di connessione del dispositivo

Riapri raspberry-01 dall'elenco. La scheda mostra due chiavi e due stringhe di connessione, nascoste. Premi l'occhio accanto a Primary connection string e copiala: è la credenziale del dispositivo, vale solo per lui.

La scheda del dispositivo con chiavi e stringhe di connessione

Far parlare il simulatore

6. Apri il simulatore e incolla la stringa

Apri azure-samples.github.io/raspberry-pi-web-simulator. A sinistra c'è un Raspberry Pi disegnato con un sensore di temperatura e umidità; a destra c'è il codice Node.js che il simulatore esegue.

Nel codice, alla riga 15, sostituisci il segnaposto con la stringa copiata:

const connectionString =
  'HostName=iot-guide-01.azure-devices.net;DeviceId=raspberry-01;SharedAccessKey=...';

7. Premi Run

Premi Run. Il riquadro in basso comincia a scorrere: un messaggio ogni due secondi, con numero progressivo, temperatura e umidità, e la conferma Message sent to Azure IoT Hub.

Il simulatore che invia messaggi all'hub

Lascialo acceso: serve nei passi seguenti. Il bottone è diventato Stop.

Leggere la telemetria da .NET

L'hub tiene i messaggi ricevuti in un endpoint compatibile con Event Hubs, già pronto e conservato per un giorno. Un programma .NET lo legge con la libreria di Event Hubs: non serve nessuna libreria di IoT.

8. Prendi l'endpoint integrato

Nel menu dell'hub, Hub settings > Built-in endpoints. In Shared access policy scegli service, che è la politica col solo permesso di leggere i messaggi, e copia il valore di Event Hub-compatible endpoint.

La pagina degli endpoint integrati con la politica service

La stringa contiene già il nome dell'entità, quindi al programma basta quella.

9. Crea il progetto

dotnet new console -n iot-demo
cd iot-demo
dotnet add package Azure.Messaging.EventHubs --version 5.12.2

10. Scrivi il programma

Sostituisci Program.cs:

using Azure.Messaging.EventHubs.Consumer;
using System.Globalization;
using System.Text;
using System.Text.Json;

CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

string connessione = Environment.GetEnvironmentVariable("IOT_EVENTHUB")!;

await using EventHubConsumerClient lettore = new(
    EventHubConsumerClient.DefaultConsumerGroupName,
    connessione);

Console.WriteLine("In ascolto sull'endpoint integrato dell'hub.\n");

using CancellationTokenSource stop = new(TimeSpan.FromSeconds(45));

try
{
    await foreach (PartitionEvent evento in lettore.ReadEventsAsync(
        startReadingAtEarliestEvent: false,
        cancellationToken: stop.Token))
    {
        string testo = Encoding.UTF8.GetString(evento.Data.EventBody.ToArray());
        string dispositivo = evento.Data
            .SystemProperties["iothub-connection-device-id"].ToString()!;

        JsonElement messaggio = JsonDocument.Parse(testo).RootElement;
        double temperatura = messaggio.GetProperty("temperature").GetDouble();
        double umidita = messaggio.GetProperty("humidity").GetDouble();

        Console.WriteLine($"{dispositivo}  {temperatura:F1} C  {umidita:F1} %");
    }
}
catch (OperationCanceledException)
{
    Console.WriteLine("\nTempo scaduto, mi fermo.");
}

startReadingAtEarliestEvent: false fa partire la lettura dai messaggi nuovi, non da quelli già accumulati. Il corpo del messaggio è il JSON scritto dal simulatore, da cui il programma tira fuori temperatura e umidità. Il nome del dispositivo non è lì dentro: lo scrive l'hub fra le proprietà di sistema, ed è quello il nome di cui fidarsi.

11. Esegui

Metti la stringa nella variabile d'ambiente e avvia:

export IOT_EVENTHUB="<endpoint compatibile con Event Hubs copiato dal portale>"
dotnet run

Su Windows, in PowerShell:

$env:IOT_EVENTHUB = "<endpoint compatibile con Event Hubs copiato dal portale>"
dotnet run

Il programma stampa i messaggi man mano che arrivano, uno ogni due secondi, e si ferma da solo dopo quarantacinque secondi:

In ascolto sull'endpoint integrato dell'hub.

raspberry-01  30.6 C  68.7 %
raspberry-01  30.0 C  76.7 %
raspberry-01  31.1 C  70.8 %
raspberry-01  31.0 C  69.6 %
raspberry-01  31.6 C  63.9 %

Dentro il messaggio il simulatore scrive un suo deviceId, its-device-1, che non è il dispositivo registrato: il nome buono è raspberry-01, quello che l'hub mette a inizio riga.

Torna al simulatore e premi Stop.

Pulire

12. Elimina il gruppo di risorse

Apri rg-guide-iot-01: contiene solo l'hub.

Il gruppo di risorse con l'hub dentro

Premi Delete resource group, riscrivi il nome del gruppo e premi Delete.

Il pannello di eliminazione con il nome riscritto

Conferma nella finestra che compare.

La richiesta di conferma definitiva

Eliminato l'hub, il piano gratuito torna libero per la sottoscrizione.

Nomi dei comandi e schermate rilevati sul portale di Azure il 5 novembre 2026, regione West Europe, con .NET 10.0.401 e l'interfaccia a riga di comando di Azure 2.91.0.