Usare le proprietà desiderate per configurare i dispositiviUse desired properties to configure devices

IntroduzioneIntroduction

In Introduzione ai dispositivi gemelli dell'hub IoT è stato illustrato come impostare i metadati dei dispositivi dal back-end della soluzione usando tag, come segnalare le condizioni dei dispositivi da un'app per dispositivo con le proprietà segnalate e come eseguire query su tali informazioni con un linguaggio simile a SQL.In Get started with IoT Hub device twins, you learned how to set device metadata from your solution back end using tags, report device conditions from a device app using reported properties, and query this information using a SQL-like language.

In questa esercitazione verrà illustrato come usare le proprietà desiderate del dispositivo gemello con le proprietà segnalate per configurare in remoto le app per dispositivi.In this tutorial, you learn how to use the device twin's desired properties along with reported properties, to remotely configure device apps. In particolare, questa esercitazione descrive come le proprietà segnalate e desiderate di un dispositivo gemello supportano la configurazione in più passaggi di un'applicazione per dispositivi e come ottenere nel back-end della soluzione la visibilità dello stato di tale operazione in tutti i dispositivi.More specifically, this tutorial shows how a device twin's reported and desired properties enable a multi-step configuration of a device application, and provide the visibility to the solution back end of the status of this operation across all devices. Per altre informazioni sul ruolo delle configurazioni del dispositivo, vedere Panoramica della gestione dei dispositivi con l'hub IoT.You can find more information regarding the role of device configurations in Overview of device management with IoT Hub.

In genere, l'uso di dispositivi gemelli abilita il back-end della soluzione per specificare la configurazione voluta per i dispositivi gestiti, invece di inviare comandi specifici.At a high level, using device twins enables the solution back end to specify the desired configuration for the managed devices, instead of sending specific commands. Il dispositivo ha quindi la responsabilità di configurare il modo migliore per aggiornare la propria configurazione (importante negli scenari IoT in cui le condizioni specifiche del dispositivo influiscono sulla possibilità di eseguire immediatamente determinati comandi) segnalando continuamente al back-end della soluzione lo stato corrente e le potenziali condizioni di errore del processo di aggiornamento.This puts the device in charge of setting up the best way to update its configuration (important in IoT scenarios where specific device conditions affect the ability to immediately carry out specific commands), while continually reporting to the solution back end the current state and potential error conditions of the update process. Questo modello è determinante per gestire grandi set di dispositivi, perché offre al back-end della soluzione la visibilità completa dello stato del processo di configurazione in tutti i dispositivi.This pattern is instrumental to the management of large sets of devices, as it enables the solution back end to have full visibility of the state of the configuration process across all devices.

Nota

Negli scenari in cui i dispositivi sono controllati in modo più interattivo (come nel caso dell'attivazione di una ventola da un'app controllata dall'utente), può essere opportuno usare metodi diretti.In scenarios where devices are controlled in a more interactive fashion (turn on a fan from a user-controlled app), consider using direct methods.

In questa esercitazione, il back-end della soluzione modifica la configurazione della telemetria di un dispositivo di destinazione e di conseguenza l'app per dispositivi segue un processo in più passaggi per applicare un aggiornamento della configurazione (che richiede ad esempio un riavvio del modulo software che nell'esercitazione viene simulato con un semplice ritardo).In this tutorial, the solution back end changes the telemetry configuration of a target device and, as a result of that, the device app follows a multi-step process to apply a configuration update (for example, requiring a software module restart, which this tutorial simulates with a simple delay).

Il back-end della soluzione archivia la configurazione nelle proprietà desiderate del dispositivo gemello nel modo seguente:The solution back end stores the configuration in the device twin's desired properties in the following way:

    {
        ...
        "properties": {
            ...
            "desired": {
                "telemetryConfig": {
                    "configId": "{id of the configuration}",
                    "sendFrequency": "{config}"
                }
            }
            ...
        }
        ...
    }

Nota

Dato che le configurazioni possono essere oggetti complessi, per semplificarne il confronto vengono assegnati ID univoci (hash o GUID).Since configurations can be complex objects, they are assigned unique IDs (hashes or GUIDs) to simplify their comparisons.

L'app per dispositivi segnala la propria configurazione corrente eseguendo il mirroring della proprietà desiderata telemetryConfig nelle proprietà segnalate:The device app reports its current configuration mirroring the desired property telemetryConfig in the reported properties:

    {
        "properties": {
            ...
            "reported": {
                "telemetryConfig": {
                    "changeId": "{id of the current configuration}",
                    "sendFrequency": "{current configuration}",
                    "status": "Success",
                }
            }
            ...
        }
    }

Si noti che la proprietà segnalata telemetryConfig ha una proprietà status aggiuntiva usata per segnalare lo stato del processo di aggiornamento della configurazione.Note how the reported telemetryConfig has an additional property status, used to report the state of the configuration update process.

Quando viene ricevuta una nuova configurazione desiderata, l'app per dispositivi segnala una configurazione in sospeso modificando le informazioni:When a new desired configuration is received, the device app reports a pending configuration by changing the information:

    {
        "properties": {
            ...
            "reported": {
                "telemetryConfig": {
                    "changeId": "{id of the current configuration}",
                    "sendFrequency": "{current configuration}",
                    "status": "Pending",
                    "pendingConfig": {
                        "changeId": "{id of the pending configuration}",
                        "sendFrequency": "{pending configuration}"
                    }
                }
            }
            ...
        }
    }

In un secondo momento l'app per dispositivi segnala l'esito positivo o negativo dell'operazione aggiornando la proprietà sopra indicata.Then, at some later time, the device app reports the success or failure of this operation by updating the above property. Si noti che il back-end della soluzione può eseguire in qualsiasi momento query sullo stato del processo di configurazione in tutti i dispositivi.Note how the solution back end is able, at any time, to query the status of the configuration process across all the devices.

Questa esercitazione illustra come:This tutorial shows you how to:

  • Creare un'app per dispositivo simulato che riceve aggiornamenti di configurazione dal back-end della soluzione e segnala più aggiornamenti come proprietà segnalate nel processo di aggiornamento della configurazione.Create a simulated device app that receives configuration updates from the solution back end, and reports multiple updates as reported properties on the configuration update process.
  • Creare un'app back-end che aggiorna la configurazione desiderata di un dispositivo e quindi esegue query sul processo di aggiornamento della configurazione.Create a back-end app that updates the desired configuration of a device, and then queries the configuration update process.

Al termine di questa esercitazione si avranno due app console .NET:At the end of this tutorial, you will have two .NET console apps:

  • SimulateDeviceConfiguration, un'app per dispositivo simulata che attende un aggiornamento della configurazione desiderata e segnala lo stato di un processo di aggiornamento della configurazione simulata.SimulateDeviceConfiguration, a simulated device app that waits for a desired configuration update and reports the status of a simulated configuration update process.
  • SetDesiredConfigurationAndQuery.js, un'app back-end che imposta la configurazione desiderata in un dispositivo ed esegue query sul processo di aggiornamento della configurazione.SetDesiredConfigurationAndQuery, a back-end app, which sets the desired configuration on a device and queries the configuration update process.

Nota

L'articolo Azure IoT SDK contiene informazioni sui componenti Azure IoT SDK che consentono di compilare le app back-end e per dispositivi.The article Azure IoT SDKs provides information about the Azure IoT SDKs that you can use to build both device and back-end apps.

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 crearne uno gratuito in pochi minuti.If you don't have an account, you can create a free account in just a couple of minutes.

Se è stata seguita l'esercitazione Introduzione ai dispositivi gemelli sono già disponibili un hub IoT e un'identità del dispositivo denominata myDeviceId.If you followed the Get started with device twins tutorial, you already have an IoT hub and a device identity called myDeviceId. È quindi possibile ignorare la sezione Creare l'app per dispositivo simulata.In that case, you can skip to the Create the simulated device app section.

Creare un hub IoTCreate an IoT hub

Creare un hub IoT per connettere l'app per dispositivo simulato.Create an IoT hub for your simulated device app to connect to. La procedura seguente illustra come completare questa attività usando il portale di Azure.The following steps show you how to complete this task by using the Azure portal.

  1. Accedere al portale di Azure.Sign in to the Azure portal.
  2. Selezionare Nuovo > Internet delle cose > Hub IoT.Select New > Internet of Things > IoT Hub.

    Indice del portale di Azure

  3. Nel riquadro Hub IoT immettere le informazioni seguenti per l'hub IoT:In the IoT hub pane, enter the following information for your IoT hub:

    • Nome: creare un nome per l'hub IoT.Name: Create a name for your IoT hub. Se il nome immesso è valido, viene visualizzato un segno di spunta verde.If the name you enter is valid, a green check mark appears.

    Importante

    L'hub IoT sarà individuabile pubblicamente come endpoint DNS, quindi evitare di indicare informazioni riservate nell'assegnazione del nome.The IoT hub will be publicly discoverable as a DNS endpoint, so make sure to avoid any sensitive information while naming it.

    • Piano tariffario e livello di scalabilità: per questa esercitazione selezionare il livello F1 gratuito.Pricing and scale tier: For this tutorial, select the F1 - Free tier. Per altre informazioni, vedere la pagina relativa a piano tariffario e livello di scalabilità.For more information, see the Pricing and scale tier.

    • Gruppo di risorse: creare un gruppo di risorse per ospitare l'hub IoT o usarne uno esistente.Resource group: Create a resource group to host the IoT hub or use an existing one. Per altre informazioni, vedere l'articolo su come usare i gruppi di risorse per gestire le risorse di Azure.For more information, see Use resource groups to manage your Azure resources

    • Località: selezionare la località più vicina.Location: Select the closest location to you.

    • Aggiungi al dashboard: selezionare questa opzione per semplificare l'accesso all'hub IoT dal dashboard.Pin to dashboard: Check this option for easy access to your IoT hub from the dashboard.

      Finestra Hub IoT

  4. Fare clic su Crea.Click Create. La creazione dell'hub IoT può richiedere alcuni minuti.Your IoT hub might take a few minutes to create. È possibile monitorare lo stato di avanzamento nel riquadro Notifiche.You can monitor the progress in the Notifications pane.

Ora che è stato creato un hub IoT, individuare le informazioni importanti che consentono di connettere dispositivi e applicazioni all'hub IoT.Now that you have created an IoT hub, locate the important information that you use to connect devices and applications to your IoT hub.

  1. Dopo avere creato l'hub IoT, fare clic sul nuovo riquadro dell'hub IoT nel portale di Azure per aprire la finestra delle proprietà.When the IoT hub has been created successfully, click the new tile for your IoT hub in the Azure portal to open the properties window for the new IoT hub. Annotare il Nome host, quindi fare clic su Criteri di accesso condiviso.Make a note of the Hostname, and then click Shared access policies.

    Finestra del nuovo hub IoT

  2. In Criteri di accesso condivisi fare clic sul criterio iothubowner, quindi copiare e annotare la stringa di connessione dell'hub IoT nella finestra iothubowner.In Shared access policies, click the iothubowner policy, and then copy and make note of the IoT Hub connection string in the iothubowner window. Per altre informazioni, vedere Controllo di accesso nella "Guida per gli sviluppatori dell'hub IoT".For more information, see Access control in the "IoT Hub developer guide."

    Criteri di accesso condivisi

Creare un'identità del dispositivoCreate a device identity

In questa sezione si usa il portale di Azure per creare un'identità del dispositivo nel registro delle identità dell'hub IoT.In this section, you use the Azure portal to create a device identity in the identity registry in your IoT hub. Un dispositivo non può connettersi all'hub IoT a meno che non abbia una voce nel registro di identità.A device cannot connect to IoT hub unless it has an entry in the identity registry. Per altre informazioni, vedere la sezione "Registro di identità" della Guida per gli sviluppatori dell'hub IoT.For more information, see the "Identity registry" section of the IoT Hub developer guide. Nel portale, Device Explorer consente di generare una chiave e un ID dispositivo univoci con cui il dispositivo può identificarsi quando si connette all'hub IoT.The Device Explorer in the portal helps you generate a unique device ID and key that your device can use to identify itself when it connects to IoT Hub. Gli ID dispositivo fanno distinzione tra maiuscole e minuscole.Device IDs are case sensitive.

  1. Assicurarsi di aver eseguito l'accesso al portale di Azure.Make sure you are signed in to the Azure portal.

  2. Nell'indice fare clic su Tutte le risorse e trovare la risorsa hub IoT.In the Jumpbar, click All resources and find your IoT hub resource.

    Passare all'hub IoT

  3. Dopo aver aperto la risorsa hub IoT, fare clic sullo strumento Device Explorer e quindi su Aggiungi nella parte superiore.When your IoT hub resource is opened, click the Device Explorer tool, and then click Add at the top. Specificare un nome per il nuovo dispositivo, ad esempio myDeviceId e fare clic su Salva.Provide the name for your new device, such as myDeviceId, and click Save.

    Creare l'identità del dispositivo nel portale

    In questo modo viene creata una nuova identità del dispositivo per l'hub IoT.This creates a new device identity for your IoT hub.

    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.The device ID may be visible in the logs collected for customer support and troubleshooting, so make sure to avoid any sensitive information while naming it.

  4. Nell'elenco dei dispositivi in Device Explorer fare clic sul dispositivo appena creato e prendere nota della Stringa di connessione - chiave primaria.In the Device Explorer's device list, click the newly created device and make note of the Connection string---primary key.

    Stringa di connessione del dispositivo

Nota

Il registro di identità dell'hub IoT archivia solo le identità del dispositivo per abilitare l'accesso sicuro all'hub.The IoT Hub identity registry only stores device identities to enable secure access to the IoT 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.It stores device IDs and keys to use as security credentials, and an enabled/disabled flag that you can use to disable access for an individual device. Se l'applicazione deve archiviare altri metadati specifici del dispositivo, dovrà usare un archivio specifico dell'applicazione.If your application needs to store other device-specific metadata, it should use an application-specific store. Per altre informazioni, vedere la Guida per gli sviluppatori dell'hub IoT.For more information, see IoT Hub developer guide.

Creare l'app per dispositivo simulataCreate the simulated device app

In questa sezione si crea un'app console .NET che si connette all'hub come myDeviceId, attende un aggiornamento della configurazione desiderata e quindi segnala gli aggiornamenti nel processo di aggiornamento della configurazione simulata.In this section, you create a .NET console app that connects to your hub as myDeviceId, waits for a desired configuration update and then reports updates on the simulated configuration update process.

  1. In Visual Studio creare un nuovo progetto desktop classico di Windows Visual C# usando il modello di progetto Applicazione console.In Visual Studio, create a new Visual C# Windows Classic Desktop project by using the Console Application project template. Chiamare il progetto SimulateDeviceConfiguration.Name the project SimulateDeviceConfiguration.

    Nuova app per il dispositivo di Windows classico in Visual C#

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto SimulateDeviceConfiguration e quindi scegliere Gestisci pacchetti NuGet....In Solution Explorer, right-click the SimulateDeviceConfiguration project, and then click Manage NuGet Packages....

  3. Nella finestra Gestione pacchetti NuGet selezionare Sfoglia e cercare microsoft.azure.devices.client.In the NuGet Package Manager window, select Browse and search for microsoft.azure.devices.client. Selezionare Installa per installare il pacchetto microsoft.azure.devices.client e accettare le condizioni d'uso.Select Install to install the Microsoft.Azure.Devices.Client package, and accept the terms of use. Questa procedura scarica, installa e aggiunge un riferimento al pacchetto NuGet Azure IoT SDK per dispositivi e alle relative dipendenze.This procedure downloads, installs, and adds a reference to the Azure IoT device SDK NuGet package and its dependencies.

    App client della finestra Gestione pacchetti NuGet

  4. Aggiungere le istruzione using seguenti all'inizio del file Program.cs :Add the following using statements at the top of the Program.cs file:

     using Microsoft.Azure.Devices.Client;
     using Microsoft.Azure.Devices.Shared;
     using Newtonsoft.Json;
    
  5. Aggiungere i campi seguenti alla classe Program .Add the following fields to the Program class. Sostituire il valore del segnaposto con la stringa di connessione del dispositivo annotato nella sezione precedente.Replace the placeholder value with the device connection string that you noted in the previous section.

     static string DeviceConnectionString = "HostName=<yourIotHubName>.azure-devices.net;DeviceId=<yourIotDeviceName>;SharedAccessKey=<yourIotDeviceAccessKey>";
     static DeviceClient Client = null;
     static TwinCollection reportedProperties = new TwinCollection();
    
  6. Aggiungere il metodo seguente alla classe Program :Add the following method to the Program class:

     public static void InitClient()
     {
         try
         {
             Console.WriteLine("Connecting to hub");
             Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, TransportType.Mqtt);
         }
         catch (Exception ex)
         {
             Console.WriteLine();
             Console.WriteLine("Error in sample: {0}", ex.Message);
         }
     }
    

    L'oggetto Client espone tutti i metodi necessari per interagire con i dispositivi gemelli dal dispositivo.The Client object exposes all the methods you require to interact with device twins from the device. Il codice riportato sopra inizializza l'oggetto Client e quindi recupera il dispositivo gemello per myDeviceId.The code shown above, initializes the Client object, and then retrieves the device twin for myDeviceId.

  7. Aggiungere il metodo seguente alla classe Program.Add the following method to the Program class. Questo metodo imposta i valori iniziali di telemetria nel dispositivo locale e quindi aggiorna il dispositivo gemello.This method sets the initial values of telemetry on the local device and then updates the device twin.

     public static async void InitTelemetry()
     {
         try
         {
             Console.WriteLine("Report initial telemetry config:");
             TwinCollection telemetryConfig = new TwinCollection();
    
             telemetryConfig["configId"] = "0";
             telemetryConfig["sendFrequency"] = "24h";
             reportedProperties["telemetryConfig"] = telemetryConfig;
             Console.WriteLine(JsonConvert.SerializeObject(reportedProperties));
    
             await Client.UpdateReportedPropertiesAsync(reportedProperties);
         }
         catch (AggregateException ex)
         {
             foreach (Exception exception in ex.InnerExceptions)
             {
                 Console.WriteLine();
                 Console.WriteLine("Error in sample: {0}", exception);
             }
         }
         catch (Exception ex)
         {
             Console.WriteLine();
             Console.WriteLine("Error in sample: {0}", ex.Message);
         }
     }
    
  8. Aggiungere il metodo seguente alla classe Program.Add the following method to the Program class. Si tratta di un callback che rileva una modifica nelle proprietà desiderate del dispositivo gemello.This is a callback which will detect a change in desired properties in the device twin.

     private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, object userContext)
     {
         try
         {
             Console.WriteLine("Desired property change:");
             Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    
             var currentTelemetryConfig = reportedProperties["telemetryConfig"];
             var desiredTelemetryConfig = desiredProperties["telemetryConfig"];
    
             if ((desiredTelemetryConfig != null) && (desiredTelemetryConfig["configId"] != currentTelemetryConfig["configId"]))
             {
                 Console.WriteLine("\nInitiating config change");
                 currentTelemetryConfig["status"] = "Pending";
                 currentTelemetryConfig["pendingConfig"] = desiredTelemetryConfig;
    
                 await Client.UpdateReportedPropertiesAsync(reportedProperties);
    
                 CompleteConfigChange();
             }
         }
         catch (AggregateException ex)
         {
             foreach (Exception exception in ex.InnerExceptions)
             {
                 Console.WriteLine();
                 Console.WriteLine("Error in sample: {0}", exception);
             }
         }
         catch (Exception ex)
         {
             Console.WriteLine();
             Console.WriteLine("Error in sample: {0}", ex.Message);
         }
     }
    

    Questo metodo aggiorna le proprietà segnalate nell'oggetto dispositivo gemello locale con la richiesta di aggiornamento della configurazione e imposta lo stato su Pending (Sospeso), quindi aggiorna il dispositivo gemello nel servizio.This method updates the reported properties on the local device twin object with the configuration update request and sets the status to Pending, then updates the device twin on the service. Dopo aver aggiornato correttamente il dispositivo gemello, quest'ultimo completerà la configurazione chiamando il metodo CompleteConfigChange descritto nel punto successivo.After successfully updating the device twin, it completes the config change by calling the method CompleteConfigChange described in the next point.

  9. Aggiungere il metodo seguente alla classe Program.Add the following method to the Program class. Questo metodo simula una reimpostazione del dispositivo, aggiorna le proprietà segnalate locali impostando lo stato su Success e rimuove l'elemento pendingConfig,This method simulates a device reset, then updates the local reported properties setting the status to Success and removes the pendingConfig element. quindi aggiorna il dispositivo gemello nel servizio.It then updates the device twin on the service.

     public static async void CompleteConfigChange()
     {
         try
         {
             var currentTelemetryConfig = reportedProperties["telemetryConfig"];
    
             Console.WriteLine("\nSimulating device reset");
             await Task.Delay(30000); 
    
             Console.WriteLine("\nCompleting config change");
             currentTelemetryConfig["configId"] = currentTelemetryConfig["pendingConfig"]["configId"];
             currentTelemetryConfig["sendFrequency"] = currentTelemetryConfig["pendingConfig"]["sendFrequency"];
             currentTelemetryConfig["status"] = "Success";
             currentTelemetryConfig["pendingConfig"] = null;
    
             await Client.UpdateReportedPropertiesAsync(reportedProperties);
             Console.WriteLine("Config change complete \nPress any key to exit.");
         }
         catch (AggregateException ex)
         {
             foreach (Exception exception in ex.InnerExceptions)
             {
                 Console.WriteLine();
                 Console.WriteLine("Error in sample: {0}", exception);
             }
         }
         catch (Exception ex)
         {
             Console.WriteLine();
             Console.WriteLine("Error in sample: {0}", ex.Message);
         }
     }
    
  10. Aggiungere infine le righe seguenti al metodo Main:Finally add the following lines to the Main method:

     try
     {
         InitClient();
         InitTelemetry();
    
         Console.WriteLine("Wait for desired telemetry...");
         Client.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null).Wait();
         Console.ReadKey();
     }
     catch (AggregateException ex)
     {
         foreach (Exception exception in ex.InnerExceptions)
         {
             Console.WriteLine();
             Console.WriteLine("Error in sample: {0}", exception);
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine();
         Console.WriteLine("Error in sample: {0}", ex.Message);
     }
    

    Nota

    Questa esercitazione non simula alcun comportamento per gli aggiornamenti della configurazione simultanei.This tutorial does not simulate any behavior for concurrent configuration updates. Alcuni processi di aggiornamento della configurazione potrebbero consentire modifiche della configurazione di destinazione mentre l'aggiornamento è in esecuzione, altre potrebbero doverle accodare e altri ancora rifiutarle con una condizione di errore.Some configuration update processes might be able to accommodate changes of target configuration while the update is running, some might have to queue them, and some could reject them with an error condition. È importante tenere in considerazione il comportamento desiderato per il processo di configurazione specifico e aggiungere la logica appropriata prima di iniziare la modifica della configurazione.Make sure to consider the desired behavior for your specific configuration process, and add the appropriate logic before initiating the configuration change.

  11. Compilare la soluzione e quindi eseguire l'app del dispositivo da Visual Studio facendo clic su F5.Build the solution and then run the device app from Visual Studio by clicking F5. Nella console di output vengono visualizzati i messaggi che indicano che il dispositivo simulato sta recuperando il dispositivo gemello e configurando la telemetria ed è in attesa della modifica della proprietà desiderata.On the output console, you should see the messages indicating that your simulated device is retrieving the device twin, setting up the telemetry, and waiting for desired property change. Mantenere l'app in esecuzione.Keep the app running.

Creare l'app di servizioCreate the service app

In questa sezione si creerà un'app console .NET che aggiorna le proprietà desiderate nel dispositivo gemello associato a myDeviceId con un nuovo oggetto di configurazione di telemetria.In this section, you will create a .NET console app that updates the desired properties on the device twin associated with myDeviceId with a new telemetry configuration object. Viene quindi effettuata una query dei dispositivi gemelli archiviati nell'hub IoT e viene visualizzata la differenza tra la configurazione desiderata e quella segnalata del dispositivo.It then queries the device twins stored in the IoT hub and shows the difference between the desired and reported configurations of the device.

  1. In Visual Studio aggiungere un progetto desktop di Windows classico in Visual C# usando il modello di progetto Applicazione console .In Visual Studio, add a Visual C# Windows Classic Desktop project to the current solution by using the Console Application project template. Assegnare al progetto il nome SetDesiredConfigurationAndQuery.Name the project SetDesiredConfigurationAndQuery.

    Nuovo progetto desktop di Windows classico in Visual C#

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto SetDesiredConfigurationAndQuery e quindi fare clic su Gestisci pacchetti NuGet.In Solution Explorer, right-click the SetDesiredConfigurationAndQuery project, and then click Manage NuGet Packages....
  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.In the NuGet Package Manager window, select Browse, search for microsoft.azure.devices, select Install to install the Microsoft.Azure.Devices package, and accept the terms of use. Questa procedura scarica, installa e aggiunge un riferimento al pacchetto NuGet Azure IoT - SDK per dispositivi e alle relative dipendenze.This procedure downloads, installs, and adds a reference to the Azure IoT service SDK NuGet package and its dependencies.

    Finestra Gestione pacchetti NuGet

  4. Aggiungere le istruzione using seguenti all'inizio del file Program.cs :Add the following using statements at the top of the Program.cs file:

     using Microsoft.Azure.Devices;
     using System.Threading;
     using Newtonsoft.Json;
    
  5. Aggiungere i campi seguenti alla classe Program .Add the following fields to the Program class. Sostituire il valore del segnaposto con la stringa di connessione dell'hub IoT creato nella sezione precedente.Replace the placeholder value with the IoT Hub connection string for the hub that you created in the previous section.

     static RegistryManager registryManager;
     static string connectionString = "{iot hub connection string}";
    
  6. Aggiungere il metodo seguente alla classe Program :Add the following method to the Program class:

     static private async Task SetDesiredConfigurationAndQuery()
     {
         var twin = await registryManager.GetTwinAsync("myDeviceId");
         var patch = new {
                 properties = new {
                     desired = new {
                         telemetryConfig = new {
                             configId = Guid.NewGuid().ToString(),
                             sendFrequency = "5m"
                         }
                     }
                 }
             };
    
         await registryManager.UpdateTwinAsync(twin.DeviceId, JsonConvert.SerializeObject(patch), twin.ETag);
         Console.WriteLine("Updated desired configuration");
    
         while (true)
         {
             var query = registryManager.CreateQuery("SELECT * FROM devices WHERE deviceId = 'myDeviceId'");
             var results = await query.GetNextAsTwinAsync();
             foreach (var result in results)
             {
                 Console.WriteLine("Config report for: {0}", result.DeviceId);
                 Console.WriteLine("Desired telemetryConfig: {0}", JsonConvert.SerializeObject(result.Properties.Desired["telemetryConfig"], Formatting.Indented));
                 Console.WriteLine("Reported telemetryConfig: {0}", JsonConvert.SerializeObject(result.Properties.Reported["telemetryConfig"], Formatting.Indented));
                 Console.WriteLine();
             }
             Thread.Sleep(10000);
         }
     }
    

    L'oggetto Registry espone tutti i metodi necessari per interagire con i dispositivi gemelli dal servizio.The Registry object exposes all the methods required to interact with device twins from the service. Questo codice inizializza l'oggetto Registry, recupera il dispositivo gemello per myDeviceId e ne aggiorna le proprietà desiderate con un nuovo oggetto di configurazione dei dati di telemetria.This code initializes the Registry object, retrieves the device twin for myDeviceId, and then updates its desired properties with a new telemetry configuration object. Ogni 10 secondi esegue una query dei dispositivi gemelli archiviati nell'hub IoT e stampa le configurazioni dei dati di telemetria desiderate e segnalate.After that, it queries the device twins stored in the IoT hub every 10 seconds, and prints the desired and reported telemetry configurations. Vedere il linguaggio di query dell'hub IoT per informazioni su come generare report avanzati in tutti i dispositivi.Refer to the IoT Hub query language to learn how to generate rich reports across all your devices.

    Importante

    Questa applicazione effettua una query dell'hub IoT ogni 10 secondi a scopo illustrativo.This application queries IoT Hub every 10 seconds for illustrative purposes. Usare le query per generare i report destinati all'utente in più dispositivi e non per rilevare le modifiche.Use queries to generate user-facing reports across many devices, and not to detect changes. Se la soluzione richiede notifiche in tempo reale degli eventi del dispositivo, usare le notifiche relative al dispositivo gemello.If your solution requires real-time notifications of device events, use twin notifications.

  7. Aggiungere infine le righe seguenti al metodo Main :Finally, add the following lines to the Main method:

     registryManager = RegistryManager.CreateFromConnectionString(connectionString);
     SetDesiredConfigurationAndQuery();
     Console.WriteLine("Press any key to quit.");
     Console.ReadLine();
    
  8. In Esplora soluzioni aprire Imposta progetti di avvio e assicurarsi che Azione per il progetto SetDesiredConfigurationAndQuery sia impostata su Avvio.In the Solution Explorer, open the Set StartUp projects... and make sure the Action for SetDesiredConfigurationAndQuery project is Start. Compilare la soluzione.Build the solution.
  9. Con l'app di dispositivo SimulateDeviceConfiguration in esecuzione, eseguire l'app di servizio da Visual Studio tramite F5.With SimulateDeviceConfiguration device app running, run the service app from Visual Studio using F5. Si potrà osservare la configurazione segnalata passare da Pending a Success con la nuova frequenza di invio attiva di cinque minuti e non più di 24 ore.You should see the reported configuration change from Pending to Success with the new active send frequency of five minutes instead of 24 hours.

    Dispositivo configurato correttamente

    Importante

    Tra l'operazione relativa al report del dispositivo e il risultato della query si verifica un ritardo fino a un minuto,There is a delay of up to a minute between the device report operation and the query result. che consente all'infrastruttura della query di funzionare su una scala molto ampia.This is to enable the query infrastructure to work at very high scale. Per recuperare visualizzazioni coerenti di un solo dispositivo gemello, usare il metodo getDeviceTwin nella classe Registry.To retrieve consistent views of a single device twin use the getDeviceTwin method in the Registry class.

Passaggi successiviNext steps

In questa esercitazione è stata impostata una configurazione desiderata come proprietà desiderate da un back-end della soluzione ed è stata scritta un'app per dispositivo per rilevare tale modifica e simulare un processo di aggiornamento in più fasi che segnala lo stato tramite le proprietà segnalate.In this tutorial, you set a desired configuration as desired properties from the solution back end, and wrote a device app to detect that change and simulate a multi-step update process reporting its status through the reported properties.

Per altre informazioni, vedere le risorse seguenti:Use the following resources to learn how to: