Dicembre 2018

Volume 33 numero 12

Internet of Things - sviluppo rapido di IoT con Azure IoT Central

Dal Dawid Borycki

Gli sviluppatori IoT si affrontano numerose sfide. Per fortuna, le tecnologie IoT Microsoft hanno ti serve. È possibile usare Windows 10 IoT Core per sviluppare App Universal Windows Platform (UWP) per smart Device (bit.ly/2yJf6RJ). È possibile creare graficamente gli algoritmi di machine learning (ML) con Azure Machine Learning Studio (bit.ly/2yF2yes). Ed è possibile scegliere tra vari approcci per creare App Web con molti servizi IoT di Azure o Self-sviluppate applicazioni MVC ASP.NET (.NET Framework o .NET Core).

Anche se queste tecnologie offrono un modo completo per lo sviluppo di soluzioni IoT personalizzate, combinazione di queste può essere difficile, specialmente se non si dispone di un cloud precedente o esperienza di programmazione Web. Per risolvere questo problema, Microsoft ha creato Azure IoT Suite (vedere il mio articolo precedente al bit.ly/2yFaIU6), che è stato successive rinominato in acceleratori di soluzioni IoT di Azure (bit.ly/2pYaraX). Acceleratori di soluzioni forniscono una serie di App preconfigurate che target IoT i problemi tipici, inclusi i dashboard, i modelli di Machine Learning, di streaming per la logica dei dati e i componenti a livello di codice che unire tutto insieme. Tuttavia, gli acceleratori di soluzioni sono comunque complessi. Pertanto, per semplificare ulteriormente lo sviluppo IoT, Microsoft ha introdotto Azure IoT Central, basata sul cloud gestito servizio che è possibile usare per creare rapidamente un back-end IoT. Questo è il portale moderno, che contiene i dashboard e i servizi sottostanti per i dati di telemetria, l'elaborazione dati e altro ancora. Utilizzare questo back-end per connettere, monitorare e gestire i dispositivi IoT.

In questo articolo, verrà illustrato come usare Azure IoT Central per creare la soluzione illustrata nel figura 1. Questa soluzione Usa un'app IoT Central personalizzata che raffigura dei dati di telemetria, posizione del dispositivo e le relative impostazioni e due indicatori di prestazioni chiave. Un operatore può usare questo dashboard per visualizzare i dati di telemetria e controllare in remoto il dispositivo tramite le impostazioni. I dati di telemetria vengono trasmessi dall'applicazione console .NET Core (mostrato in alto a destra). Il codice sorgente completo di questa app è disponibile all'indirizzo bit.ly/2D34XnV.

La soluzione IoT che creerò
Figura 1 la soluzione IoT che creerò

Soluzioni e servizi IoT di azure

Prima di spiegare come ho creato la soluzione IoT, verranno brevemente esaminate altri approcci possibili per lo sviluppo di applicazioni IoT con Azure IoT. In primo luogo, è possibile creare una soluzione completamente personalizzata creando un'istanza e configurare manualmente i servizi IoT di Azure dedicati, come illustrato nella figura 2. In questo caso, inizia in genere con l'IoT Hub, che agisce come gateway cloud e viene utilizzato per la gestione dei dispositivi (ad esempio, registrazione del dispositivo) e la comunicazione bidirezionale. I dati trasmessi dai dispositivi remoti tramite l'IoT Hub possono essere pre-elaborati o trasformati con Azure Stream Analitica. Utilizzare questo servizio per filtrare i dati non di telemetria o calcolare la media di brevi parti dei dati di telemetria per ridurre le fluttuazioni rapide di misurazioni. I dati pre-elaborati possono essere inviati al dashboard di Power BI per la visualizzazione, con salvataggio permanente in archiviazione cloud dedicata o trasmessi da Hub eventi per analisi più complessa. Hub eventi può inviare dati pre-elaborati a un modello di Machine Learning per rilevare anomalie o stimare le tendenze nel processo monitorato. Tuttavia, questo approccio può richiedere molto tempo, soprattutto perché non si dispone di un portale Web preconfigurato per fornire una comoda interfaccia per gli utenti e gli operatori.

Una tipica soluzione IoT: I rettangoli denotano servizi e le frecce mostrano il flusso di dati tra componenti della soluzione
Figura 2 la soluzione IoT tipica: I rettangoli denotano servizi e le frecce mostrano il flusso di dati tra componenti della soluzione

In secondo luogo, è possibile iniziare con gli acceleratori di soluzioni IoT, ovvero i modelli che è possibile modificare in base alle esigenze. Acceleratori di soluzioni IoT si basano gli stessi servizi IoT di Azure come una soluzione completamente personalizzata. Tuttavia, gli acceleratori dotati di servizi preconfigurati e codice di esempio che illustrano come sfruttare i vantaggi di tali servizi. In questo caso, hai ancora alcune operazioni da eseguire, ma si avvia con i modelli di variabili.

In terzo luogo, è possibile creare rapidamente un back-end con Azure IoT Central, in cui si riceve un'applicazione IoT completamente preparata. Viene ridotto al minimo la quantità di lavoro e le competenze necessarie. Non occorre alcuna conoscenza di cloud per creare una soluzione IoT completamente funzionale, scalabile e moderna. Tutto ciò che viene creato automaticamente in base gli stessi servizi IoT di Azure, come in una soluzione completamente personalizzata o quando si usano gli acceleratori di soluzioni. Di conseguenza, è possibile concentrarsi sullo sviluppo delle proprie operazioni senza prestando attenzione di altre parti della tua soluzione IoT. Di seguito userà Azure IoT Central per creare rapidamente l'endpoint cloud.

Creazione di un'applicazione IoT Central

Per creare l'app IoT Central è stato usato il portale IoT Central in apps.azureiotcentral.com, il gestore delle applicazioni che visualizzata quando effettua l'accesso con l'account Microsoft. Questa gestione Mostra tutte le app, anche se inizialmente, naturalmente, non saranno tutte le altre app. Pertanto, quando si fa clic il pulsante nuova applicazione, l'apertura di autore dell'applicazione IoT, che consente di scegliere una versione di valutazione gratuita di sette giorni o una sottoscrizione a pagamento (bit.ly/2QLvk4t), nonché il modello di applicazione, nome dell'applicazione e l'URL. Scelto il piano gratuito e il modello di applicazione personalizzato, quindi impostare il nome dell'app all'app MSDN IoT Central, che è stata creata l'URL seguente: msdn-iot-central-app.azureiotcentral.com. Infine, quando si fa clic sul pulsante Crea e, dopo alcuni secondi, l'app è pronta.

L'applicazione IoT Central è costituita da due elementi importanti: la visualizzazione reale e navigazione (barra laterale sinistra). La barra laterale consente di alternare le diverse visualizzazioni: Home page, Device Explorer, set di dispositivi, Analitica, processi, Application Builder e amministrazione. In questo articolo ci lavorerò principalmente con le visualizzazioni Device Explorer e Application Builder.

L'app appena creata viene illustrato il formato predefinito della home page. È possibile personalizzare questa visualizzazione facendo clic su Collega il pulsante Modifica blu per attivare la visualizzazione di modifica, in cui è possibile aggiungere diversi componenti, ad esempio, le etichette, immagini, le impostazioni del dispositivo, mappe e così via. Tuttavia, prima di creare un dashboard è necessario i dati di telemetria. Inizialmente, verranno prodotti i dati di telemetria dal dispositivo simulato. Per aggiungere un dispositivo di questo tipo, è possibile avviare facendo clic sul pannello di creazione modello di dispositivo sulla Home Page predefinita. Alla fine è preferibile usare il generatore dell'applicazione che consente di scegliere l'opzione di dispositivo personalizzato. Il modello di dispositivo definisce il dispositivo, inclusi i dati di telemetria, impostazioni, gli eventi e i comandi remoti (bit.ly/2CjsoYH).

Modello dispositivo

Indipendentemente dal modo in cui si sceglie di creare il modello di dispositivo, è prima di tutto specificare il nome del modello (in questo caso, utilizzo MSDN DeviceTemplate), quindi fare clic sul pulsante Crea e il dispositivo viene eseguito il provisioning. La visualizzazione indicata nel figura 3 viene visualizzata. Utilizzare questa visualizzazione per configurare vari aspetti del dispositivo:

  • Le misurazioni: Consente di specificare il tipo di dati del dispositivo fornirà al cloud. È anche possibile definire gli stati di dispositivo e gli eventi.
  • Impostazioni: Consente di creare le impostazioni specifiche del dispositivo che possono essere utilizzate per impostare i parametri per ogni dispositivo.
  • Proprietà: Consente di configurare le proprietà del dispositivo, ad esempio la posizione fisica.
  • I comandi: È possibile definire comandi che possono essere inviati dal cloud al dispositivo per aggiornarne lo stato.
  • Le regole: È possibile definire regole per il dispositivo. Queste regole possono monitorare i dati e attivare le azioni corrispondenti.
  • Dashboard: Consente di creare dashboard del dispositivo. Userai tale un dashboard per creare il riepilogo per il dispositivo, che può includere i dati di telemetria tracciati, immagini, gli indicatori di prestazioni chiave, una mappa che indica di cronologia di località, stato ed eventi di dispositivo.

Un modello di dispositivo
Figura 3 modello di dispositivo

I dati di telemetria, impostazioni e proprietà

Successivamente, ho definito modello del dispositivo. Ho creato due misure: temperatura e umidità, quindi ho definito un'impostazione, ovvero IsTelemetryActive, che consente agli utenti di abilitare o disabilitare i dati di telemetria in modalità remota (nello stato inattivo nel figura 1). Se l'impostazione IsTelemetryActive è false, il dispositivo remoto non trasmettere tutti i dati. Infine, il dispositivo disporrà di una proprietà, posizione, che contiene l'indirizzo geospaziali del dispositivo.

Per creare le misure di dati di telemetria, è innanzitutto necessario scegliere il pulsante Modifica modello. Come figura 4 illustrato, il pulsante nuova misura verrà visualizzato immediatamente sopra i dati di telemetria. Dopo aver facendo clic su questo pulsante si riceve un'opzione per scegliere tra i dati di telemetria, stato e l'evento. Faccio clic su dati di telemetria, che attiva un'altra visualizzazione, che consente di configurare misura della temperatura nel modo seguente (vedere la colonna centrale della figura 4):

  • Nome visualizzato: Temperatura
  • Nome del campo: Temperatura
  • Unità: degC
  • Valore minimo valore: -20
  • Posizioni massimi: 2
  • Colore: scegliere a seconda di quale si desidera che

Configurazione della telemetria
Figura 4 configurazione i dati di telemetria

La maggior parte delle impostazioni di telemetria sono di chiara interpretazione, ma tenere presente che il nome del campo è il nome usato durante la trasmissione dei dati tra il dispositivo e il cloud. Pertanto è usare il nome di campo per serializzare e deserializzare gli oggetti, che rappresenta i dati di telemetria in modo corretto.

Definizione di una misura dell'umidità è analogo a quello della temperatura, ma usare la configurazione seguente:

  • Nome visualizzato: Umidità
  • Nome del campo: Umidità
  • Unità: %
  • Valore minimo: 0
  • Valore massimo: 100
  • Posizioni decimali: 2

Dopo aver preparato le misurazioni, è possibile aggiungere l'impostazione del dispositivo. A tale scopo, fare clic sulla scheda Impostazioni e verificare che sia aperta in modalità di modifica. I tipi di impostazione della disponibilità verrà quindi visualizzato a destra. Scegliere il tipo di attivazione/disattivazione e configurarlo come segue:

  • Nome visualizzato: Sia i dati di telemetria attivi
  • Nome del campo: IsTelemetryActive
  • Testo da visualizzare ON: True
  • DISATTIVARE il testo di visualizzazione: Falso

Infine, si aggiunge la proprietà del dispositivo: Posizione. A tale scopo, aprire la scheda proprietà. Sulla sinistra verrà visualizzato l'elenco di tipi di proprietà disponibili. Questo elenco si intende una raccolta. Fare clic sulla posizione dell'oggetto. Configurare quindi la proprietà come indicato di seguito:

  • Nome visualizzato: Posizione del dispositivo
  • Nome del campo: Luogo
  • Valore iniziale di: Microsoft, 1 Microsoft Way, Redmond, WA 98052

Si noti che il campo del valore iniziale include un elenco di suggerimento automatico, che viene popolato quando si inizia a digitare.

Dopo aver configurato i dati di telemetria, impostazioni e le proprietà, ora è possibile preparare il dashboard del dispositivo, che verrà combinati di tutte le informazioni contenute in un'interfaccia grafica moderna.

Creazione di un Dashboard

Creare il dashboard è simile alla creazione di impostazioni e proprietà, è prima di abilitare la modalità di modifica modello che verrà aperta una libreria che contiene l'elenco dei componenti dell'interfaccia utente disponibili. I componenti si trovano sul lato sinistro del dashboard di Azure IoT Central. Quando si sceglie un elemento, verrà visualizzato nel dashboard. Il lato sinistro dell'editor modello quindi visualizzerà le impostazioni configurabili per il componente dell'interfaccia utente, come illustrato nella figura 5. Proseguire e fare clic sul grafico a linee. Successivamente, impostare il titolo per i dati di telemetria, abilitare tutti i tre interruttori, impostare l'intervallo di tempo per ultimi 30 minuti e quindi fai clic sull'icona più a destra accanto alla temperatura e umidità in modo che entrambe queste misure verranno tracciate.

Configurazione del grafico
Figura 5, la configurazione del grafico

Quindi ho aggiunto una mappa al dashboard, che mostra la posizione del dispositivo. Per creare una mappa di questo tipo, scegliere il componente della mappa dell'interfaccia utente dalla libreria, quindi configurare le relative proprietà. Impostare il titolo della posizione e, dall'elenco delle proprietà di percorso, scegliere il percorso di dispositivo.

Successivamente, ho creato due riquadri che mostrano gli indicatori di prestazioni chiave (KPI). Gli indicatori KPI sono la media della temperatura e umidità massima (vedere la parte destra del figura 1), calcolato da letture dei sensori ottenute negli ultimi 30 minuti. Per creare tali riquadri, si utilizzano componenti di indicatore KPI dalla libreria, configurarli come indicato di seguito:

Temperatura media degli indicatori KPI:

  • Titolo: Temperatura media
  • Intervallo di tempo: Ultimi 30 minuti
  • Tipo di misura: Telemetria
  • Misura: Temperatura

Umidità massima KPI:

  • Titolo: Umidità massima
  • Intervallo di tempo: Ultimi 30 minuti
  • Tipo di misura: Telemetria
  • Misura: Umidità

Infine, ho creato un riquadro che mostra il valore effettivo dell'impostazione IsTelemetryActive. A tale scopo, ho utilizzato il componente di interfaccia utente delle impostazioni e le proprietà, che è disponibili due opzioni configurabili: Titolo (una casella di testo) e le impostazioni delle proprietà (un controllo panel di due mostrare disponibile e selezionato le colonne). Usare la casella di testo per impostare il titolo alla posizione del dispositivo, quindi usare il secondo controllo per trascinare la posizione del dispositivo da disponibili alle colonne selezionate. Una volta tutti i componenti dell'interfaccia utente è possibile posizionarli all'interno del dashboard come indicato in precedenza figura 1.

Il provisioning di un dispositivo reale

La discussione precedente conferma che con IoT Central è possibile creare rapidamente un dashboard dall'aspetto moderno per la tua soluzione IoT. Tuttavia, fino ad ora abbiamo abbiamo fare affidamento solo sul dispositivo simulato. Vediamo ora come connettere il dispositivo reale per l'app IoT Central. Eseguire questa operazione con il Device Explorer, procedere come descritto nella documentazione di IoT Central (bit.ly/2Ch4gWA). In breve, prima di tutto fare clic sul pulsante Nuovo (nel pannello in alto), scegliere reale nell'elenco a discesa, quindi specificare il nome e un identificatore univoco del dispositivo. In questo caso, impostato queste due opzioni per MSDN-DeviceTemplate – msdn-device-id1 e msdn-device-id-1, rispettivamente (vedere figura 6).

Device Explorer che mostra i dispositivi simulati e reali
Figura 6 Device Explorer che mostra i dispositivi simulati e reali

Se si sceglie ora il dispositivo reale in Explorer, si noterà che il dati di telemetria, impostazioni, proprietà e dashboard sono tutti uguali a quella del dispositivo simulato. Tuttavia, non è ancora qualsiasi misura perché non è connesso il dispositivo. In alto a destra del modello vero e proprio dispositivo, inoltre, si noterà i collegamenti ipertestuali aggiuntivi: Bloccare e connettersi. Blocco consente di bloccare il dispositivo in modo che l'app IoT Central non accetta le richieste dal dispositivo remoto. La connessione consente di visualizzare l'ID ambito e le credenziali necessarie per connettere il dispositivo a cloud, come illustrato nella figura 7.

Connessione del dispositivo
Figura 7 connessione del dispositivo

IoT Central supporta due modalità per autorizzare il dispositivo. È possibile usare una firma di accesso condiviso (SAS) o certificati X.509. Entrambi gli approcci sono descritti in dettaglio all'indirizzo bit.ly/2ClDv3z. Nell'app client che intende sviluppare, utilizzerò l'approccio di firma di accesso condiviso. Pertanto, per procedere ulteriormente è necessario notare l'ID ambito, l'ID dispositivo e la chiave primaria o secondaria visualizzata nella schermata di connessione del dispositivo in figura 7. Userà lo strumento da riga di comando dps_cstr per generare la stringa di connessione. (È possibile scaricare la versione di Windows di questo strumento dal bit.ly/2Cj3Ejv.) Quindi, per ottenere la stringa di connessione effettiva, aprire la riga di comando e si digitare il comando seguente:

dps_cstr <scope_id> <device_id> <SAS Key>

Per i parametri indicati figura 7, lo strumento dps_cstr generato la stringa di connessione seguente:

HostName=saas-iothub-28681fd2-94c7-4938-bf7e-7ae3e94a407c.azure-devices.net;DeviceId=msdn-device-id1;SharedAccessKey=nQqFzf6TvnQA+zFI4MVaSSBeZgsYSY0P7KXrl6z6oDE=

Implementazione di App Client

Per creare l'app client, ho sviluppato un C# app .NET Core basati sul modello di applicazione Console. La maggior parte del codice è possibile utilizzare senza modifiche in un'app UWP Windows 10 IoT Core, nonché. Tuttavia, ho deciso di usare .NET Core per ridurre al minimo i carichi di lavoro necessari per implementare l'app client per IoT Central.

Ho utilizzato Visual Studio 2017 Community Edition, inizia con la finestra di dialogo Nuovo progetto. Scelto il modello di progetto App Console (.NET Core 2.1), quindi impostare il nome dell'app su IoTCentralClient e installato il pacchetto Microsoft.Azure.Devices.Client NuGet rapidamente connettersi all'IoT Hub.

Quindi ero passato all'implementazione effettiva, inizia con la classe DeviceClientHelper illustrata nel figura 8.

Figura 8 classe DeviceClientHelper

public static class DeviceClientHelper
{
  private static readonly string connectionString
    = "<your_connection_string>";
  private static DeviceClient deviceClient;
  public static DeviceClient Init()
  {
    if (deviceClient == null)
    {
      deviceClient = DeviceClient.
        CreateFromConnectionString(connectionString);
    }
    return deviceClient;
  }
}

La classe DeviceClientHelper utilizza il Microsoft.Azure.Devices.Client.DeviceClient per associare la connessione con l'IoT Hub. A tal fine, DeviceClient Usa la stringa di connessione generata dallo strumento dps_cstr. La stringa di connessione viene passata come argomento al metodo CreateFromConnectionString statico della classe DeviceClient.

Telemetria

Dopo aver preparato la connessione, è stata creata la classe di dati, illustrata nella figura 9, ovvero una rappresentazione astratta di dati di telemetria verranno inviati al cloud.

Figura 9, la classe di dati

public class Data
{
  public double Temperature { get; set; }
  public double Humidity { get; set; }
  public Message ToMessage()
  {
    var dataJson = JsonConvert.SerializeObject(this);
    return new Message(Encoding.ASCII.GetBytes(dataJson));
  }
  public override string ToString()
  {
    return $"Temperature: {Temperature,6:F2}, Humidity: {Humidity,6:F2}";
  }
}

Tenere presente che le proprietà pubbliche della classe di dati vengono utilizzate nell'endpoint cloud per deserializzare correttamente gli oggetti inviati dal dispositivo. Di conseguenza, i nomi delle proprietà devono corrispondere ai nomi di campo usato nel modello di dispositivo. In caso contrario, i dati di telemetria non vengono correttamente analizzati dal cloud.

Successivamente, per deserializzare l'oggetto dati di telemetria ho scritto il metodo rispostaMessaggio indicato nella figura 9. Nel primo passaggio, rispostaMessaggio Ottiene la stringa in formato JSON, che rappresenta l'oggetto dati. Questa operazione viene eseguita con JsonConvert.SerializeObject. Nel secondo passaggio, la stringa JSON viene convertita in una matrice di byte con Encoding.ASCII.GetBytes. Il risultato di questa operazione viene usato per creare un'istanza della classe Microsoft.Azure.Devices.Client.Message. Istanze di questa classe possono quindi essere inviate all'IoT Hub usando il metodo SendEventAsync della classe DeviceClient.

Successivamente, ho scritto la classe del generatore per generare e inviare dati di telemetria. Questa classe emula un sensore reale la lettura dalla pseudo-casuale la generazione di valori di temperatura e umidità (vedere Data/Generator.cs nel codice sorgente complementare). A tal fine, generatore Usa la classe System. Random per sintetizzare sensore la lettura dall'intervallo specificato:

private Random randomNumberGenerator = new Random();
private double GetRandomValue(MeasurementRange measurementRange)
{
  var randomValueRescaled = randomNumberGenerator.NextDouble()
    * measurementRange.ValueRange();
  return measurementRange.Min + randomValueRescaled;
}

L'intervallo di unità di misura è rappresentato dalle istanze della classe MeasurementRange:

public class MeasurementRange
{
  public double Min { get; set; }
  public double Max { get; set; }
  public double ValueRange()
  {
    return Max - Min;
  }
}

La classe generatore ha due campi del tipo precedente (MeasurementRange). Corrispondono alle misure temperatura e umidità:

private readonly MeasurementRange temperatureRange
  = new MeasurementRange() { Min = -20, Max = 60 };
private readonly MeasurementRange humidityRange
  = new MeasurementRange() { Min = 0, Max = 100 };

Si noti che questi intervalli vengono identico a quello specificato in precedenza nel modello di dispositivo.

La classe generatore Usa un'istanza di DeviceClient e CancellationToken. Il primo viene utilizzato per inviare i dati di telemetria, mentre il secondo interromperà il ciclo infinito di dati di telemetria. Istanze effettive delle DeviceClient CancellationToken vengono passate tramite il costruttore della classe generatore:

private DeviceClient deviceClient;
private CancellationToken cancellationToken;
public Generator(DeviceClient deviceClient,
  CancellationToken cancellationToken)
{
  Check.IsNull(deviceClient);
  Check.IsNull(cancellationToken);
  this.deviceClient = deviceClient;
  this.cancellationToken = cancellationToken;
}

La classe di controllo è una classe helper statica utilizzata per verificare se gli argomenti sono null o meno (vedere il codice complementare Helpers/Check.cs).

I dati di telemetria generati e inviati a cloud all'interno di while loop implementata all'interno del metodo di istanza TelemetryAction della classe del generatore, illustrata nella figura 10.

Figura 10 metodo TelemetryAction

public bool IsTelemetryActive { get; set; } = true;
private void TelemetryAction()
{
  while (!cancellationToken.IsCancellationRequested)
  {
    var telemetryData = new Data()
    {
      Temperature = GetRandomValue(temperatureRange),
      Humidity = GetRandomValue(humidityRange)
    };
    if (IsTelemetryActive)
    {
      deviceClient.SendEventAsync(telemetryData.ToMessage());
      Console.WriteLine($"Sending telemetry: {telemetryData}");
    }
    else
    {
      Console.WriteLine("Idle");
    }
      Task.Delay(delayTime).Wait();
  }
}

Si noti che i dati di telemetria viene inviato al cloud solo quando la proprietà IsTelemetryActive è true. Questa proprietà può essere modificata nell'endpoint cloud usando la scheda Impostazioni nell'app IoT Central (figura 4).

Il TelemetryAction viene eseguito in background usando il modello asincrono basato su attività:

public Task Start()
{
  telemetryTask = new Task(TelemetryAction);
  telemetryTask.Start();
  return telemetryTask;
}

Combinazione di operazioni

Con il DeviceClientHelper e le classi generatore pronte, li combinati nella classe Program (vedere Program.cs nel codice complementare). Ho iniziato implementando il metodo Program.Main statico, come illustrato nella figura 11.

Figura 11 il metodo Program.Main

private static CancellationTokenSource cancellationTokenSource
   = new CancellationTokenSource();
static void Main(string[] args)
{
  // Configure cancel key press handler (to stop the app)
  Console.CancelKeyPress += new ConsoleCancelEventHandler(
    CancelKeyPressHandler);
  // Connect to the cloud
  var deviceClient = DeviceClientHelper.Init();
  // Telemetry generator produces random temperature
  // and humidity, and then sends them both to the cloud
  var telemetryGenerator = new Generator(
    deviceClient, cancellationTokenSource.Token);
  // Associate handler to update device properties according to cloud requests
  deviceClient.SetDesiredPropertyUpdateCallbackAsync(
    PropertyUpdateCallback, telemetryGenerator).Wait();
  // Start telemetry
  telemetryGenerator.Start().Wait();
}

Prima di tutto, Program.Main collega un gestore eventi all'evento Console.CancelKeyPress per interrompere il ciclo di dati di telemetria (usando il token di annullamento) e chiudere l'applicazione:

private static void CancelKeyPressHandler(object sender,
  ConsoleCancelEventArgs e)
{
  if (e.SpecialKey == ConsoleSpecialKey.ControlC)
  {
    cancellationTokenSource.Cancel();
    Environment.Exit(0);
  }
}

Successivamente, il metodo Main si connette all'IoT Hub usando il metodo Init statico del DeviceClientHelper. Init restituisce un'istanza della classe DeviceClient, che viene quindi passata al costruttore della classe del generatore.

Il metodo SetDesiredPropertyUpdateCallbackAsync dell'istanza della classe DeviceClient viene ora utilizzato per impostare il callback che viene richiamato quando l'operatore di modifica le impostazioni del dispositivo in corrispondenza dell'endpoint cloud. Questo callback, PropertyUpdateCallback (vedere figura 12) viene fornito con un'istanza della classe Microsoft.Azure.Devices.Shared.TwinCollection. Questo oggetto rappresenta la raccolta delle impostazioni del dispositivo. In particolare, l'indicizzatore di classe è utilizzabile per leggere i valori delle impostazioni selezionate. Si identificano le impostazioni particolare utilizzando i relativi nomi di campo, configurato nell'endpoint cloud. Nelle figura 12, illustrato come leggere il valore dell'impostazione IsTelemetryActive e utilizzarla per aggiornare la proprietà corrispondente dell'istanza della classe del generatore.

Figura 12 PropertyUpdateCallback

private static readonly string telemetryActivePropertyName =
  "IsTelemetryActive";
private static readonly string propertyValue = "value";
private static Task PropertyUpdateCallback(
  TwinCollection desiredProperties, object userContext)
{
  if (desiredProperties.Contains(telemetryActivePropertyName))
  {
    var telemetryGenerator = userContext as Generator;
    telemetryGenerator.IsTelemetryActive =
      desiredProperties[telemetryActivePropertyName][propertyValue];
  }
  return Task.CompletedTask;
}

Infine, il metodo Main avvia i dati di telemetria richiamando il metodo di avvio dell'istanza della classe del generatore.

Per testare l'app client è necessario eseguirlo. Se la stringa di connessione è valida, l'app verrà connettersi all'hub IoT e avviare lo streaming dei dati di telemetria. Ogni misurazione sintetizzati verrà stampato nella console e verrà quindi visualizzato tali misure nel dashboard del cloud (fare riferimento a figura 1). È possibile modificare in modalità remota IsTelemetryActive per disabilitare temporaneamente i dati di telemetria. A tale scopo, aprire la scheda delle impostazioni dell'app Azure IoT Central, passare l'elemento toggle e fare clic sul pulsante di aggiornamento. In tal caso, l'app client stampa la stringa inattiva invece i dati di telemetria effettivo.

Conclusioni

In questo articolo ho illustrato come creare rapidamente un'applicazione Web personalizzata, completamente funzionante, dall'aspetto moderno per una soluzione IoT con Azure IoT Central. È stato anche illustrato come creare un modello di dispositivo e usarlo per presentare i dati di telemetria, posizione del dispositivo e gli indicatori KPI. Quindi, ho sviluppato un C# app client e connesso per trasmettere i dati di telemetria al cloud. Infine, ho illustrato come rispondere alle modifiche richieste tramite l'applicazione IoT Central di impostazioni del dispositivo. Tutto ciò è possibile usare per sviluppare rapidamente dashboard Web moderno per le soluzioni IoT senza alcun cloud precedente o della Knowledge base di programmazione Web.


Dawid Boryckiè un ingegnere di software e ricercatore biomedical, relatore di conferenze e autore. Ama imparare nuove tecnologie per la sperimentazione software e la creazione di prototipi. Borycki è autrice di due libri di Microsoft Press: "Programming per realtà mista" (2018) e "Programmazione per Internet delle cose" (2017).

Grazie al seguente esperto tecnico Microsoft per la revisione dell'articolo Bruno Sonnino
Bruno Sonnino è un Microsoft MVP lo sviluppo di Windows. Partecipa è stato sviluppatore, consulente, autore e istruttore per oltre 20 anni ed è appassionato dello sviluppo software.


Discutere di questo articolo nel forum di MSDN Magazine