Introduzione ai dispositivi gemelli (.NET/.NET)Get started with device twins (.NET/.NET)

I dispositivi gemelli sono documenti JSON nei quali vengono archiviate informazioni sullo stato dei dispositivi (metadati, configurazioni e condizioni).Device twins are JSON documents that store device state information (metadata, configurations, and conditions). L'hub IoT rende permanente un dispositivo gemello per ogni dispositivo che si connette.IoT Hub persists a device twin for each device that connects to it.

Usare i dispositivi gemelli per:Use device twins to:

  • Archiviare i metadati dei dispositivi dal back-end della soluzione.Store device metadata from your solution back end.
  • Segnalare informazioni sullo stato corrente, come funzionalità disponibili e condizioni (ad esempio, il metodo di connettività usato) dall'app per dispositivi.Report current state information such as available capabilities and conditions (for example, the connectivity method used) from your device app.
  • Sincronizzare lo stato dei flussi di lavoro a esecuzione prolungata (come gli aggiornamenti del firmware e della configurazione) tra un'app per dispositivi e un'app di back-end.Synchronize the state of long-running workflows (such as firmware and configuration updates) between a device app and a back-end app.
  • Eseguire query sui metadati, la configurazione o lo stato dei dispositivi.Query your device metadata, configuration, or state.

Nota

I dispositivi gemelli sono progettati per la sincronizzazione e per l'esecuzione di query sulle configurazioni e le condizioni dei dispositivi.Device twins are designed for synchronization and for querying device configurations and conditions. Altre informazioni su quando usare i dispositivi gemelli sono reperibili in Informazioni sui dispositivi gemelli.More informations on when to use device twins can be found in Understand device twins.

I dispositivi gemelli vengono archiviati in un hub IoT e contengono gli elementi seguenti.Device twins are stored in an IoT hub and contain:

  • Tag: metadati dei dispositivi accessibili solo dal back-end della soluzionetags, device metadata accessible only by the solution back end;
  • Proprietà desiderate: oggetti JSON modificabili dal back-end della soluzione e osservabili dall'app per dispositividesired properties, JSON objects modifiable by the solution back end and observable by the device app; and
  • Proprietà segnalate: oggetti JSON modificabili dall'app per dispositivi e leggibili dal back-end della soluzionereported properties, JSON objects modifiable by the device app and readable by the solution back end. I tag e le proprietà non possono contenere matrici, ma gli oggetti possono essere annidati.Tags and properties cannot contain arrays, but objects can be nested.

Il back-end della soluzione può anche eseguire query sui dispositivi gemelli in base a tutti i dati sopra indicati.Additionally, the solution back end can query device twins based on all the above data. Vedere Informazioni sui dispositivi gemelli per altre informazioni sui dispositivi gemelli e Linguaggio di query per hub IoT per informazioni sull'esecuzione di query.Refer to Understand device twins for more information about device twins, and to the IoT Hub query language reference for querying.

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

  • Creare un'app back-end che aggiunge tag a un dispositivo gemello e un'app per dispositivo simulato che segnala il proprio canale di connettività come proprietà segnalata nel dispositivo gemello.Create a back-end app that adds tags to a device twin, and a simulated device app that reports its connectivity channel as a reported property on the device twin.
  • Eseguire query sui dispositivi dall'app back-end con filtri sui tag e sulle proprietà creati in precedenza.Query devices from your back-end app using filters on the tags and properties previously created.

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

  • CreateDeviceIdentity, un'app .NET che crea un'identità del dispositivo e la chiave di sicurezza associata per connettere l'app per dispositivo simulato.CreateDeviceIdentity, a .NET app which creates a device identity and associated security key to connect your simulated device app.
  • AddTagsAndQuery, un'app back-end .NET, che aggiunge tag ed effettua una query dei dispositivi gemelli.AddTagsAndQuery, a .NET back-end app which adds tags and queries device twins.
  • ReportConnectivity.js, un dispositivo .NET che simula un dispositivo che si connette all'hub IoT con l'identità del dispositivo creata prima e segnala la condizione della connettività.ReportConnectivity, a .NET device app which simulates a device that connects to your IoT hub with the device identity created earlier, and reports its connectivity condition.

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

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.

Se invece si desidera creare l'identità del dispositivo a livello di codice, leggere la sezione corrispondente nell'articolo Connettere il dispositivo simulato all'hub IoT tramite .NET.If you want to create the device identity programmatically instead, read the corresponding section in the Connect your simulated device to your IoT hub using .NET article.

Creare l'app di servizioCreate the service app

In questa sezione si crea un'app console .NET (usando C#) e si aggiungono i metadati della posizione al dispositivo gemello associato a myDeviceId.In this section, you create a .NET console app (using C#) that adds location metadata to the device twin associated with myDeviceId. Viene quindi eseguita una query nei dispositivi gemelli archiviati nell'hub IoT selezionando i dispositivi situati negli Stati Uniti e quindi quelli che segnalano una rete cellulare.It then queries the device twins stored in the IoT hub selecting the devices located in the US, and then the ones that reported a cellular connection.

  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 AddTagsAndQuery.Name the project AddTagsAndQuery.

    Nuovo progetto desktop di Windows classico in Visual C#

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto AddTagsAndQuery e quindi fare clic su Gestisci pacchetti NuGet.In Solution Explorer, right-click the AddTagsAndQuery project, and then click Manage NuGet Packages....
  3. Nella finestra Gestisci pacchetti NuGet selezionare Sfoglia e cercare microsoft.azure.devices.In the NuGet Package Manager window, select Browse and search for microsoft.azure.devices. Selezionare Installa per installare il pacchetto Microsoft.Azure.Devices e accettare le condizioni per l'utilizzo.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;
    
  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:

     public static async Task AddTagsAndQuery()
     {
         var twin = await registryManager.GetTwinAsync("myDeviceId");
         var patch =
             @"{
                 tags: {
                     location: {
                         region: 'US',
                         plant: 'Redmond43'
                     }
                 }
             }";
         await registryManager.UpdateTwinAsync(twin.DeviceId, patch, twin.ETag);
    
         var query = registryManager.CreateQuery("SELECT * FROM devices WHERE tags.location.plant = 'Redmond43'", 100);
         var twinsInRedmond43 = await query.GetNextAsTwinAsync();
         Console.WriteLine("Devices in Redmond43: {0}", string.Join(", ", twinsInRedmond43.Select(t => t.DeviceId)));
    
         query = registryManager.CreateQuery("SELECT * FROM devices WHERE tags.location.plant = 'Redmond43' AND properties.reported.connectivity.type = 'cellular'", 100);
         var twinsInRedmond43UsingCellular = await query.GetNextAsTwinAsync();
         Console.WriteLine("Devices in Redmond43 using cellular network: {0}", string.Join(", ", twinsInRedmond43UsingCellular.Select(t => t.DeviceId)));
     }
    

    L'oggetto RegistryManager espone tutti i metodi necessari per interagire con i dispositivi gemelli dal servizio.The RegistryManager class exposes all the methods required to interact with device twins from the service. Il codice precedente inizializza prima di tutto l'oggetto registryManager, quindi recupera il dispositivo gemello per myDeviceId e infine ne aggiorna i tag con le informazioni sulla posizione desiderate.The previous code first initializes the registryManager object, then retrieves the device twin for myDeviceId, and finally updates its tags with the desired location information.

    Dopo l'aggiornamento, il codice precedente esegue due query: la prima seleziona solo i dispositivi gemelli tra quelli situati nello stabilimento Redmond43 e la seconda affina la query per selezionare solo i dispositivi che sono connessi anche tramite la rete cellulare.After updating, it executes two queries: the first selects only the device twins of devices located in the Redmond43 plant, and the second refines the query to select only the devices that are also connected through cellular network.

    Si noti che il codice precedente, quando crea l'oggetto query, specifica un numero massimo di documenti restituiti.Note that the previous code, when it creates the query object, specifies a maximum number of returned documents. L'oggetto query contiene una proprietà booleana HasMoreResults che è possibile usare per richiamare i metodi GetNextAsTwinAsync più volte per recuperare tutti i risultati.The query object contains a HasMoreResults boolean property that you can use to invoke the GetNextAsTwinAsync methods multiple times to retrieve all results. Per i risultati che non sono dispositivi gemelli, ad esempio i risultati delle query di aggregazione, è disponibile un metodo chiamato GetNextAsJson.A method called GetNextAsJson is available for results that are not device twins, for example, results of aggregation queries.

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

     registryManager = RegistryManager.CreateFromConnectionString(connectionString);
     AddTagsAndQuery().Wait();
     Console.WriteLine("Press Enter to exit.");
     Console.ReadLine();
    
  8. In Esplora soluzioni aprire Imposta progetti di avvio e assicurarsi che Azione per il progetto AddTagsAndQuery sia impostata su Avvio.In the Solution Explorer, open the Set StartUp projects... and make sure the Action for AddTagsAndQuery project is Start. Compilare la soluzione.Build the solution.

  9. Eseguire l'applicazione facendo clic con il pulsante destro del mouse sul progetto AddTagsAndQuery e selezionando Debug, seguito da Avvia nuova istanza.Run this application by right-clicking on the AddTagsAndQuery project and selecting Debug, followed by Start new instance. Nei risultati si noterà un dispositivo per la query che cerca tutti i dispositivi situati in Redmond43 e nessuno per la query che limita i risultati ai dispositivi che usano una rete cellulare.You should see one device in the results for the query asking for all devices located in Redmond43 and none for the query that restricts the results to devices that use a cellular network.

    Risultati della query nella finestra

Nella sezione successiva si crea un'app per dispositivo che segnala le informazioni sulla connettività e modifica il risultato della query nella sezione precedente.In the next section, you create a device app that reports the connectivity information and changes the result of the query in the previous section.

Creare l'app per dispositivoCreate the device app

In questa sezione si crea un'app console .NET che si connette all'hub come myDeviceId e quindi aggiorna le proprietà segnalate per poter contenere le informazioni relative alla connessione usando una rete cellulare.In this section, you create a .NET console app that connects to your hub as myDeviceId, and then updates its reported properties to contain the information that it is connected using a cellular network.

  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. Denominare il progetto ReportConnectivity.Name the project ReportConnectivity.

    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 ReportConnectivity, quindi fare clic su Gestisci pacchetti NuGet....In Solution Explorer, right-click the ReportConnectivity 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;
    
  6. Aggiungere il metodo seguente alla classe Program :Add the following method to the Program class:

    public static async void InitClient()
     {
         try
         {
             Console.WriteLine("Connecting to hub");
             Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, TransportType.Mqtt);
             Console.WriteLine("Retrieving twin");
             await Client.GetTwinAsync();
         }
         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:

     public static async void ReportConnectivity()
     {
         try
         {
             Console.WriteLine("Sending connectivity data as reported property");
    
             TwinCollection reportedProperties, connectivity;
             reportedProperties = new TwinCollection();
             connectivity = new TwinCollection();
             connectivity["type"] = "cellular";
             reportedProperties["connectivity"] = connectivity;
             await Client.UpdateReportedPropertiesAsync(reportedProperties);
         }
         catch (Exception ex)
         {
             Console.WriteLine();
             Console.WriteLine("Error in sample: {0}", ex.Message);
         }
     }
    

    Il codice sopra riportato aggiorna le proprietà segnalate di myDeviceId con le informazioni di connettività.The code above updates myDeviceId's reported property with the connectivity information.

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

    try
    {
         InitClient();
         ReportConnectivity();
    }
    catch (Exception ex)
    {
         Console.WriteLine();
         Console.WriteLine("Error in sample: {0}", ex.Message);
    }
    Console.WriteLine("Press Enter to exit.");
    Console.ReadLine();
    
  9. In Esplora soluzioni aprire Imposta progetti di avvio... e assicurarsi che Azione per il progetto ReportConnectivity sia impostato su Avvio.In the Solution Explorer, open the Set StartUp projects... and make sure the Action for ReportConnectivity project is Start. Compilare la soluzione.Build the solution.

  10. Eseguire l'applicazione facendo clic con il pulsante destro del mouse sul progetto ReportConnectivity e selezionando Debug, seguito da Avvia nuova istanza.Run this application by right-clicking on the ReportConnectivity project and selecting Debug, followed by Start new instance. Si dovrebbero vedere le informazioni gemelle e quindi l'invio della connettività come proprietà segnalata.You should see it getting the twin information, and then sending connectivity as a reported property.

    Eseguire l'app per dispositivi per segnalare la connettività

  11. Ora che il dispositivo ha segnalato le informazioni sulla connettività, verrà visualizzato in entrambe le query.Now that the device reported its connectivity information, it should appear in both queries. Eseguire l'app .NET AddTagsAndQuery per eseguire nuovamente la query.Run the .NET AddTagsAndQuery app to run the queries again. Questa volta myDeviceId verrà visualizzato nei risultati di entrambe le query.This time myDeviceId should appear in both query results.

    Connettività del dispositivo segnalata correttamente

Passaggi successiviNext steps

In questa esercitazione è stato configurato un nuovo hub IoT nel Portale di Azure ed è stata quindi creata un'identità del dispositivo nel registro di identità dell'hub IoT.In this tutorial, you configured a new IoT hub in the Azure portal, and then created a device identity in the IoT hub's identity registry. Sono stati aggiunti i metadati del dispositivo come tag da un'app back-end ed è stata scritta un'app per dispositivo simulato per segnalare le informazioni sulla connettività del dispositivo nel dispositivo gemello.You added device metadata as tags from a back-end app, and wrote a simulated device app to report device connectivity information in the device twin. Si è anche appreso come effettuare una query di queste informazioni usando il linguaggio di query simile a SQL dell'hub IoT.You also learned how to query this information using the SQL-like IoT Hub query language.

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