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.

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.

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

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.

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.

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.

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.

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 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.210. 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 runSu Windows, in PowerShell:
$env:IOT_EVENTHUB = "<endpoint compatibile con Event Hubs copiato dal portale>"
dotnet runIl 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.

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

Conferma nella finestra che compare.

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.