Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a: Edge 1.5
Importante
IoT Edge 1.5 LTS è la versione supportata. IoT Edge 1.4 LTS è di fine vita a partire dal 12 novembre 2024. Se si usa una versione precedente, vedere Aggiornare IoT Edge.
Questa esercitazione illustra come sviluppare e distribuire il codice in un dispositivo IoT Edge. I moduli di Azure IoT Edge consentono di distribuire codice che esegue la logica di business direttamente nel dispositivo IoT Edge. Nella guida introduttiva Distribuire il codice in un dispositivo Linux è possibile configurare un dispositivo IoT Edge e distribuire un modulo da Azure Marketplace.
Questo articolo illustra i passaggi per due strumenti di sviluppo di IoT Edge:
- Il Azure IoT Edge Dev Tool (CLI), preferito per lo sviluppo.
- Strumenti di Azure IoT Edge per l'estensione Visual Studio Code , che è in modalità di manutenzione.
Usare il pulsante del selettore dello strumento all'inizio di questo articolo per scegliere lo strumento.
In questa esercitazione apprenderai a:
- Configurare il computer di sviluppo
- Usare gli strumenti di IoT Edge per creare un nuovo progetto
- Compilare il progetto come contenitore Docker e archiviarlo in un registro contenitori di Azure
- Distribuire il codice in un dispositivo IoT Edge
Il modulo IoT Edge creato in questa esercitazione filtra i dati relativi alla temperatura generati dal dispositivo. Invia messaggi a monte solo se la temperatura supera una soglia impostata. Questo tipo di analisi sul perimetro consente di ridurre la quantità di dati inviati e archiviati nel cloud.
Prerequisiti
Un computer di sviluppo:
- Usare il proprio computer o una macchina virtuale.
- Assicurarsi che il computer di sviluppo supporti la virtualizzazione annidata per eseguire un motore di contenitori.
- È possibile usare la maggior parte dei sistemi operativi che eseguono un motore di contenitori per sviluppare moduli IoT Edge per dispositivi Linux. Questa esercitazione usa un computer Windows, ma evidenzia le differenze note in macOS o Linux.
- Installare Visual Studio Code
- Installare l'interfaccia della riga di comando di Azure.
Un dispositivo Azure IoT Edge:
- Eseguire IoT Edge su un dispositivo separato. Mantenere separato il computer di sviluppo e il dispositivo IoT Edge simula uno scenario di distribuzione reale e consente di mantenere chiari i concetti. Usare l'articolo di avvio rapido Distribuire il codice in un dispositivo Linux per creare un dispositivo IoT Edge in Azure o il modello di risorsa di Azure per distribuire una macchina virtuale abilitata per IoT Edge.
Risorse cloud:
- Usare un hub IoT di Azure gratuito o standard.
Se non si ha un account Azure, creare un account gratuito prima di iniziare.
Suggerimento
Per indicazioni sul debug interattivo in Visual Studio Code o Visual Studio 2022:
- Eseguire il debug dei moduli di Azure IoT Edge con Visual Studio Code
- Usare Visual Studio 2022 per sviluppare ed eseguire il debug di moduli per Azure IoT Edge
Questa esercitazione illustra i passaggi di sviluppo per Visual Studio Code.
Concetti chiave
Questa esercitazione illustra lo sviluppo di un modulo IoT Edge. Un modulo IoT Edge è un contenitore con codice eseguibile. Distribuire uno o più moduli in un dispositivo IoT Edge. I moduli eseguono attività specifiche, ad esempio l'inserimento di dati da sensori, la pulizia e l'analisi dei dati o l'invio di messaggi a un hub IoT. Per altre informazioni, vedere Informazioni sui moduli Azure IoT Edge.
Quando si sviluppano moduli IoT Edge, comprendere la differenza tra il computer di sviluppo e il dispositivo IoT Edge di destinazione in cui viene distribuito il modulo. Il contenitore compilato per contenere il codice del modulo deve corrispondere al sistema operativo del dispositivo di destinazione. Ad esempio, lo scenario più comune è lo sviluppo di un modulo in un computer Windows per specificare come destinazione un dispositivo Linux che esegue IoT Edge. In tal caso, il sistema operativo del contenitore è Linux. Mentre si procede con questa esercitazione, tenere presente la differenza tra sistema operativo del computer di sviluppo e sistema operativo del contenitore.
Suggerimento
Se si usa IoT Edge per Linux in Windows, il dispositivo di destinazione nello scenario è la macchina virtuale Linux, non l'host Windows.
Questa esercitazione è destinata ai dispositivi che eseguono IoT Edge con contenitori Linux. Usare il sistema operativo preferito purché il computer di sviluppo esegua contenitori Linux. Visual Studio Code è consigliato per lo sviluppo con contenitori Linux, quindi questa esercitazione lo usa. È possibile usare anche Visual Studio, ma esistono alcune differenze in termini di supporto tra i due strumenti.
La tabella seguente elenca gli scenari di sviluppo supportati per i contenitori Linux in Visual Studio Code e Visual Studio.
Visual Studio Code | Visual Studio 2019/2022 | |
---|---|---|
Architettura dei dispositivi Linux | Linux AMD64 Linux ARM32v7 Linux ARM64 |
Linux AMD64 Linux ARM32 Linux ARM64 |
Servizi di Azure | Funzioni di Azure Analisi di flusso di Azure Azure Machine Learning (Apprendimento Automatico di Azure) |
|
Lingue | C C# Giava Node.js Pitone |
C C# |
Ulteriori informazioni | Azure IoT Edge per Visual Studio Code |
Azure IoT Edge Tools per Visual Studio 2019 Azure IoT Edge Tools per Visual Studio 2022 |
Installare il motore per i contenitori
I moduli IoT Edge vengono inseriti in un pacchetto come contenitori, quindi è necessario un sistema di gestione contenitori compatibile con Docker nel computer di sviluppo per compilarli e gestirli. Docker Desktop è una scelta comune per lo sviluppo perché offre un forte supporto per le funzionalità. Docker Desktop in Windows consente di passare da contenitori Linux a contenitori Windows, in modo da poter sviluppare moduli per diversi tipi di dispositivi IoT Edge.
Usare la documentazione di Docker per installare Docker nel computer di sviluppo:
Installare Docker Desktop per Windows
- Quando si installa Docker Desktop per Windows, viene chiesto se si vuole usare i contenitori Linux o Windows. È possibile modificare questa impostazione in qualsiasi momento. Questa esercitazione usa contenitori Linux perché i moduli hanno come destinazione i dispositivi Linux. Per altre informazioni, vedere Switch between Windows and Linux containers (Passare tra contenitori Windows e Linux).
Install Docker Desktop for Mac (Installare Docker Desktop per Mac)
Leggere l'articolo About Docker CE (Informazioni su Docker CE) per informazioni sull'installazione in diverse piattaforme Linux.
- Per il sottosistema Windows per Linux (WSL), installare Docker Desktop per Windows.
Configurare gli strumenti
Installare lo strumento di sviluppo Azure IoT Edge basato su Python per creare la soluzione IoT Edge. È possibile procedere in due modi:
- Usare il contenitore di sviluppo IoT Edge predefinito preferito
- Installare lo strumento usando l'installazione dello sviluppo iotedgedev
Importante
L'estensione Azure IoT Edge Tools per Visual Studio Code è in modalità manutenzione. Lo strumento di sviluppo preferito è la riga di comando (CLI) Azure IoT Edge Dev Tool.
Usare le estensioni IoT per Visual Studio Code per sviluppare moduli IoT Edge. Queste estensioni offrono modelli di progetto, automatizzano la creazione del manifesto della distribuzione e consentono di monitorare e gestire i dispositivi IoT Edge. In questa sezione si installano Visual Studio Code e l'estensione IoT, quindi si configura l'account di Azure per gestire le risorse dell'hub IoT da Visual Studio Code.
Installare l’estensione Azure IoT Edge.
Installare l'estensione hub IoT di Azure.
Dopo aver installato le estensioni, aprire il riquadro comandi selezionando Visualizza>riquadro comandi.
Nel riquadro comandi cercare e selezionare Hub IoT di Azure: Selezionare l'hub IoT. Seguire le istruzioni per selezionare la sottoscrizione di Azure e l'hub IoT.
Aprire la sezione Esplora di Visual Studio Code selezionando l'icona nella barra delle attività o selezionando Visualizza>Esplora.
Nella parte inferiore della sezione di esplorazione espandere il menu compresso Azure IoT Hub Devices (Dispositivi hub IoT di Azure). Vengono visualizzati i dispositivi e i dispositivi IoT Edge associati all'hub IoT selezionato tramite il riquadro comandi.
Installare strumenti specifici del linguaggio
Installare strumenti specifici per il linguaggio in cui si sta sviluppando:
Creare un registro contenitori
In questa esercitazione si usano le estensioni Azure IoT Edge e Hub IoT di Azure per creare un modulo e creare un'immagine del contenitore dai file. Eseguire quindi il push dell'immagine in un registro che archivia e gestisce le immagini. Distribuire infine l'immagine dal registro nel dispositivo IoT Edge.
Importante
L'estensione Azure IoT Edge per Visual Studio Code è in modalità di manutenzione.
È possibile usare qualsiasi registro compatibile con Docker per inserire le immagini dei contenitori. Due servizi di registro Docker molto diffusi sono Registro Azure Container e Hub Docker. Questa esercitazione usa Registro Azure Container.
Se non è ancora disponibile alcun registro contenitori, seguire questa procedura per crearne uno nuovo in Azure:
Nel portale di Azure selezionare Crea una risorsa>Contenitori>Registro Container.
Specificare i valori necessari seguenti per creare il registro contenitori:
Campo Valore Abbonamento Selezionare una sottoscrizione nell'elenco a discesa. Gruppo di risorse Usare lo stesso gruppo di risorse per tutte le risorse di test create durante le esercitazioni e le guide introduttive di IoT Edge. Ad esempio, IoTEdgeResources. Nome registro Specificare un nome univoco. Ufficio Scegliere una località vicina. Codice articolo (SKU) Selezionare Basic. Selezionare Rivedi + crea, quindi Crea.
Selezionare il nuovo registro contenitori nella sezione Risorse della home page del portale di Azure per aprirlo.
Nel riquadro sinistro del registro contenitori selezionare Chiavi di accesso dal menu disponibile in Impostazioni.
Abilitare l'utente amministratore con l'interruttore e visualizzare il nome utente e la password per il registro contenitori.
Copiare i valori di Server di accesso, Nome utente e Password e conservarli in una posizione pratica. Questi valori verranno usati durante l'esercitazione per fornire l'accesso al registro contenitori.
Creare un nuovo progetto di modulo
L'estensione Azure IoT Edge offre modelli di progetto per tutti i linguaggi dei moduli IoT Edge supportati in Visual Studio Code. Questi modelli includono tutti i file e il codice necessari per distribuire un modulo funzionante per testare IoT Edge oppure fornire un punto di partenza per personalizzare il modello con la propria logica di business.
Creare un modello di progetto
Lo strumento di sviluppo IoT Edge semplifica lo sviluppo di Azure IoT Edge con comandi basati su variabili di ambiente. Consente di iniziare a sviluppare con IoT Edge utilizzando il container IoT Edge Dev e lo scaffolding della soluzione IoT Edge, che include un modulo predefinito e tutti i file di configurazione necessari.
Crea una directory per la tua soluzione nel percorso desiderato. Passa alla directory
iotedgesolution
.mkdir c:\dev\iotedgesolution cd c:\dev\iotedgesolution
Usare il comando init della soluzione iotedgedev per creare una soluzione e configurare l'hub IoT di Azure nel linguaggio di sviluppo preferito.
Lo script init della soluzione iotedgedev richiede di completare diversi passaggi, tra cui:
- Autenticazione con Azure
- Scegliere una sottoscrizione Azure
- Scegliere o creare un gruppo di risorse
- Scegliere o creare un hub IoT di Azure
- Scegliere o creare un dispositivo Azure IoT Edge
Usare Visual Studio Code e l'estensione Azure IoT Edge. Per iniziare, creare una soluzione, quindi generare il primo modulo in tale soluzione. Ogni soluzione può includere più moduli.
- Selezionare Visualizza>Riquadro comandi.
- Nel riquadro comandi immettere ed eseguire il comando Azure IoT Edge: New IoT Edge solution (Azure IoT Edge: Nuova soluzione IoT Edge).
- Passare alla cartella in cui si vuole creare la nuova soluzione, quindi selezionare Seleziona cartella.
- Immettere un nome per la soluzione.
- Selezionare un modello di modulo per fare in modo che il linguaggio di sviluppo preferito sia il primo modulo nella soluzione.
- Immettere un nome per il modulo. Scegliere un nome univoco all'interno del registro contenitori.
- Immettere il nome del repository di immagini del modulo. Visual Studio Code popola automaticamente il nome del modulo con il valore localhost:5000/<nome del modulo>. Sostituire tale valore con le proprie informazioni di registro. Usare localhost se si usa un registro Docker locale per i test. Se si usa Registro Azure Container, usare il server di accesso dalle impostazioni del Registro di sistema. Il server di accesso ha un nome simile a <nome registro>.azurecr.io. Sostituire la parte della stringa localhost:5000, in modo che il risultato finale sia simile a <nome registro>.azurecr.io/<nome del modulo>.
Visual Studio Code usa le informazioni specificate per creare una soluzione IoT Edge e quindi la carica in una nuova finestra.
Dopo aver creato la soluzione, questi file principali si trovano nella soluzione:
La cartella vscode include il file di configurazione launch.json.
La cartella modules include sottocartelle per ogni modulo. In ogni sottocartella il file module.json controlla la modalità di compilazione e distribuzione dei moduli.
Il file .env elenca le variabili di ambiente. La variabile di ambiente per il registro contenitori è localhost:5000 per impostazione predefinita.
Due file di distribuzione del modulo, deployment.template.json e deployment.debug.template.json, elencare i moduli da distribuire nel dispositivo. Per impostazione predefinita, l'elenco include i moduli di sistema IoT Edge (edgeAgent e edgeHub) e moduli di esempio come:
- filtermodule è un modulo di esempio che implementa una funzione di filtro semplice.
- Il modulo SimulatedTemperatureSensor simula i dati che è possibile usare per i test. Per altre informazioni su come funzionano i manifesti di distribuzione, vedere Informazioni su come usare i manifesti della distribuzione per distribuire moduli e definire route. Per altre informazioni sul funzionamento del modulo di temperatura simulata, vedere il codice sorgente SimulatedTemperatureSensor.csproj.
Nota
I moduli esatti installati possono dipendere dalla lingua scelta.
Impostare la versione del runtime di IoT Edge
La versione più recente del modulo di sistema IoT Edge stabile è la 1.5. Impostare i moduli di sistema sulla versione 1.5.
In Visual Studio Code aprire il file manifesto della distribuzione deployment.template.json. Il manifesto di distribuzione è un documento JSON che descrive i moduli da configurare nel dispositivo IoT Edge di destinazione.
Modificare la versione di runtime per le immagini del modulo di runtime di sistema edgeAgent e edgeHub. Ad esempio, se si vuole usare il runtime di IoT Edge versione 1.5, modificare le righe seguenti nel file manifesto della distribuzione:
"systemModules": { "edgeAgent": { "image": "mcr.microsoft.com/azureiotedge-agent:1.5", "edgeHub": { "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
Fornire le credenziali del registro all'agente IoT Edge
Il file dell'ambiente archivia le credenziali per il registro contenitori e le condivide con il runtime IoT Edge. Il runtime richiede queste credenziali per eseguire il pull delle immagini del contenitore nel dispositivo IoT Edge.
L'estensione IoT Edge cerca di eseguire il pull delle credenziali del Registro Container da Azure, per inserirle nel file di ambiente.
Nota
Il file dell'ambiente viene creato solo se si specifica un repository di immagini per il modulo. Se sono state accettate le impostazioni predefinite di localhost per testare ed eseguire il debug in locale, non è necessario dichiarare le variabili di ambiente.
Controllare se le credenziali esistono. In caso contrario, aggiungerle:
Se Registro Azure Container è il registro, impostare un nome utente e una password per Registro Azure Container. Ottenere questi valori dal menu Impostazioni del registro contenitori>Chiavi di accesso nel portale di Azure.
Aprire il file con estensione env nella soluzione del modulo.
Aggiungere i valori di username e password copiati dal Registro Azure Container. Ad esempio:
CONTAINER_REGISTRY_SERVER="myacr.azurecr.io" CONTAINER_REGISTRY_USERNAME="myacr" CONTAINER_REGISTRY_PASSWORD="<registry_password>"
Salvare le modifiche al file .env.
Nota
Questa esercitazione usa le credenziali di amministratore per Registro Azure Container che sono utili per scenari di sviluppo e test. Quando si è pronti per gli scenari di produzione, è consigliabile usare un'opzione di autenticazione con privilegi minimi, ad esempio entità servizio o token con ambito repository. Per altre informazioni, vedere Gestire l'accesso al registro contenitori.
Architettura di destinazione
Selezionare l'architettura di destinazione con ogni soluzione, perché influisce sul modo in cui viene compilato ed eseguito il contenitore. L'impostazione predefinita è Linux AMD64. Per questa esercitazione, usare una macchina virtuale Ubuntu come dispositivo IoT Edge e mantenere l'impostazione predefinita amd64.
Se è necessario modificare l'architettura di destinazione per la soluzione, seguire questa procedura.
Aprire il riquadro comandi e cercare Azure IoT Edge: Impostare la piattaforma di destinazione predefinita per la soluzione Edgeoppure selezionare l'icona di scelta rapida nella barra laterale nella parte inferiore della finestra.
Nel riquadro comandi selezionare l'architettura di destinazione nell'elenco di opzioni.
L'architettura di destinazione viene impostata quando si crea l'immagine del contenitore in un passaggio successivo.
Aggiornare il modulo con il codice personalizzato
Ogni modello include codice di esempio che accetta i dati dei sensori simulati dal modulo SimulatedTemperatureSensor e li indirizza all'hub IoT. Il modulo di esempio riceve i messaggi e li passa. La funzionalità della pipeline mostra un concetto importante in IoT Edge: come i moduli comunicano tra loro.
Ogni modulo può avere più code di input e di output dichiarate nel suo codice. L'hub IoT Edge in esecuzione nel dispositivo instrada i messaggi dall'output di un modulo all'input di uno o più moduli. Il codice specifico per la dichiarazione di input e output varia tra le lingue, ma il concetto è lo stesso per tutti i moduli. Per altre informazioni sul routing tra moduli, vedere Dichiarare le route.
L'esempio di codice C# disponibile con il modello di progetto usa la classe ModuleClient da IoT Hub SDK per .NET.
Nello strumento di esplorazione di Visual Studio Code aprire i moduli>filtermodule>ModuleBackgroundService.cs.
Prima dello spazio dei nomi filtermodule, aggiungere tre istruzioni using per i tipi usati in un secondo momento:
using System.Collections.Generic; // For KeyValuePair<> using Microsoft.Azure.Devices.Shared; // For TwinCollection using Newtonsoft.Json; // For JsonConvert
Aggiungere la variabile temperatureThreshold alla classe ModuleBackgroundService. Questa variabile imposta il valore che la temperatura misurata deve superare per l'invio dei dati all'hub IoT.
static int temperatureThreshold { get; set; } = 25;
Aggiungere le classi MessageBody, Machine e Ambient. Queste classi definiscono lo schema previsto per il corpo dei messaggi in arrivo.
class MessageBody { public Machine machine {get;set;} public Ambient ambient {get; set;} public string timeCreated {get; set;} } class Machine { public double temperature {get; set;} public double pressure {get; set;} } class Ambient { public double temperature {get; set;} public int humidity {get; set;} }
Trovare la funzione ExecuteAsync. Questa funzione crea e configura l'oggetto ModuleClient, che consente al modulo di connettersi al runtime locale di Azure IoT Edge per inviare e ricevere messaggi. Dopo la creazione di ModuleClient, il codice legge il valore temperatureThreshold dalle proprietà desiderate del modulo gemello. Il codice registra un callback per la ricezione di messaggi da un hub IoT Edge tramite un endpoint denominato input1.
Sostituire la chiamata al metodo ProcessMessageAsync con un nuovo metodo che aggiorna il nome dell'endpoint e il metodo chiamato all'arrivo dell'input. Aggiungere inoltre un metodo SetDesiredPropertyUpdateCallbackAsync per gli aggiornamenti alle proprietà desiderate. Per apportare questa modifica, sostituire l'ultima riga del metodo ExecuteAsync con il codice seguente:
// Register a callback for messages that are received by the module. // await _moduleClient.SetInputMessageHandlerAsync("input1", PipeMessage, cancellationToken); // Read the TemperatureThreshold value from the module twin's desired properties var moduleTwin = await _moduleClient.GetTwinAsync(); await OnDesiredPropertiesUpdate(moduleTwin.Properties.Desired, _moduleClient); // Attach a callback for updates to the module twin's desired properties. await _moduleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertiesUpdate, null); // Register a callback for messages that are received by the module. Messages received on the inputFromSensor endpoint are sent to the FilterMessages method. await _moduleClient.SetInputMessageHandlerAsync("inputFromSensor", FilterMessages, _moduleClient);
Aggiungere il metodo onDesiredPropertiesUpdate alla classe ModuleBackgroundService. Questo metodo riceve gli aggiornamenti della proprieta desiderata dal modulo gemello e aggiorna la variabile temperatureThreshold. Tutti i moduli hanno un modulo gemello che consente di configurare il codice in esecuzione all'interno di un modulo direttamente dal cloud.
static Task OnDesiredPropertiesUpdate(TwinCollection desiredProperties, object userContext) { try { Console.WriteLine("Desired property change:"); Console.WriteLine(JsonConvert.SerializeObject(desiredProperties)); if (desiredProperties["TemperatureThreshold"]!=null) temperatureThreshold = desiredProperties["TemperatureThreshold"]; } catch (AggregateException ex) { foreach (Exception exception in ex.InnerExceptions) { Console.WriteLine(); Console.WriteLine("Error when receiving desired property: {0}", exception); } } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error when receiving desired property: {0}", ex.Message); } return Task.CompletedTask; }
Aggiungere il metodo FilterMessages. Questo metodo viene chiamato ogni volta che l'hub di IoT Edge invia un messaggio al modulo. Filtra i messaggi con un valore della temperatura inferiore alla soglia relativa alla temperatura configurata tramite il modulo gemello. Aggiunge inoltre la proprietà MessageType al messaggio con il valore impostato su Avviso.
async Task<MessageResponse> FilterMessages(Message message, object userContext) { var counterValue = Interlocked.Increment(ref _counter); try { ModuleClient moduleClient = (ModuleClient)userContext; var messageBytes = message.GetBytes(); var messageString = Encoding.UTF8.GetString(messageBytes); Console.WriteLine($"Received message {counterValue}: [{messageString}]"); // Get the message body. var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString); if (messageBody != null && messageBody.machine.temperature > temperatureThreshold) { Console.WriteLine($"Machine temperature {messageBody.machine.temperature} " + $"exceeds threshold {temperatureThreshold}"); using (var filteredMessage = new Message(messageBytes)) { foreach (KeyValuePair<string, string> prop in message.Properties) { filteredMessage.Properties.Add(prop.Key, prop.Value); } filteredMessage.Properties.Add("MessageType", "Alert"); await moduleClient.SendEventAsync("output1", filteredMessage); } } // Indicate that the message treatment is completed. return MessageResponse.Completed; } catch (AggregateException ex) { foreach (Exception exception in ex.InnerExceptions) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", exception); } // Indicate that the message treatment is not completed. var moduleClient = (ModuleClient)userContext; return MessageResponse.Abandoned; } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", ex.Message); // Indicate that the message treatment is not completed. ModuleClient moduleClient = (ModuleClient)userContext; return MessageResponse.Abandoned; } }
Salvare il file ModuleBackgroundService.cs.
Nello strumento di esplorazione di Visual Studio Code aprire il file deployment.template.json nell'area di lavoro della soluzione IoT Edge.
Poiché è stato modificato il nome dell'endpoint su cui il modulo è in ascolto, è anche necessario aggiornare le route nel manifesto della distribuzione in modo che edgeHub invii messaggi al nuovo endpoint.
Trovare la sezione route nel modulo gemello $edgeHub. Aggiornare la route sensorTofiltermodule per sostituire
input1
coninputFromSensor
:"sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"
Aggiungere il modulo gemello filtermodule al manifesto della distribuzione. Inserire il contenuto JSON seguente alla fine della sezione modulesContent dopo il modulo gemello $edgeHub:
"filtermodule": { "properties.desired":{ "TemperatureThreshold":25 } }
Salvare il file deployment.template.json.
Compilare ed eseguire il push della soluzione
Sono stati aggiornati il codice dei moduli e il modello di distribuzione per comprendere alcuni concetti chiave relativi alla distribuzione. Ora è possibile compilare l'immagine del contenitore del modulo ed eseguirne il push nel Registro Container.
In Visual Studio Code aprire il file manifesto della distribuzione deployment.template.json. Il manifesto della distribuzione descrive i moduli da configurare nel dispositivo IoT Edge di destinazione. Prima della distribuzione, è necessario aggiornare le credenziali di Registro Azure Container e le immagini del modulo con i valori createOptions
appropriati. Per altre informazioni sui valori createOption, vedere Come configurare le opzioni di creazione di contenitori per i moduli IoT Edge.
Se si usa un Registro Azure Container per archiviare l'immagine del modulo, aggiungere le credenziali ai moduli della sezione Content>edgeAgent>impostazioni>registryCredentials in deployment.template.json. Sostituire myacr con il proprio nome del Registro di sistema e specificare la password e l'indirizzo del server di accesso. Ad esempio:
"registryCredentials": {
"myacr": {
"username": "myacr",
"password": "<your_acr_password>",
"address": "myacr.azurecr.io"
}
}
Aggiungere o sostituire il contenuto stringato seguente al valore createOptions per ogni sistema (edgeHub e edgeAgent) e al modulo personalizzato (filtermodule e tempSensor) elencati. Modificare i valori, se necessario.
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
Ad esempio, la configurazione del modulo di filtro (filtermodule) dovrebbe essere simile alla seguente:
"filtermodule": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
}
Immagine Docker del modulo di compilazione
Aprire il terminale integrato di Visual Studio Code selezionando Visualizza>Nuovo terminale.
Usare il comando dotnet publish
per compilare l'immagine del contenitore per l'architettura Linux e amd64. Passare alla directory filtermodule nel progetto ed eseguire il comando dotnet publish.
dotnet publish --os linux --arch x64 /t:PublishContainer
Attualmente, il modello di strumento iotedgedev è destinato a .NET 7.0. Se si vuole impostare come destinazione una versione diversa di .NET, è possibile modificare il file filtermodule.csproj e modificare i valori TargetFramework e PackageReference. Ad esempio, per impostare come destinazione .NET 8.0, il file filtermodule.csproj dovrebbe essere simile al seguente:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Devices.Client" Version="1.42.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
</ItemGroup>
</Project>
Contrassegnare l'immagine Docker con le informazioni, la versione e l'architettura del registro contenitori. Sostituire myacr con il proprio nome del Registro di sistema.
docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.1-amd64
Immagine Docker del modulo push
Fornire a Docker le credenziali del Registro Container, per consentire il push dell'immagine del contenitore da archiviare nel registro.
Accedere a Docker con le credenziali del Registro Azure Container.
docker login -u <ACR username> -p <ACR password> <ACR login server>
Potrebbe venire visualizzato un avviso di sicurezza in cui si consiglia l'uso di
--password-stdin
. Sebbene si tratti di una procedura consigliata per gli scenari di produzione, esula dell'ambito di questa esercitazione. Per altri dettagli, vedere le informazioni di riferimento sull'accesso a Docker.Accedere al Registro Azure Container. È necessario installare l'interfaccia della riga di comando di Azure per usare il comando
az
. Questo comando richiede il nome utente e la password trovati nel registro contenitori in Impostazioni>Chiavi di accesso.az acr login -n <ACR registry name>
Suggerimento
Se si è disconnessi in qualsiasi momento di questa esercitazione, ripetere i passaggi di accesso a Docker e Registro Azure Container per continuare.
Eseguire il push dell'immagine del modulo nel registro locale o in un registro contenitori.
docker push <ImageName>
Ad esempio:
# Push the Docker image to the local registry docker push localhost:5000/filtermodule:0.0.1-amd64 # Or push the Docker image to an Azure Container Registry. Replace myacr with your Azure Container Registry name. az acr login --name myacr docker push myacr.azurecr.io/filtermodule:0.0.1-amd64
Aggiornare il modello di distribuzione
Aggiornare il modello di distribuzione deployment.template.json con il percorso dell'immagine del registro contenitori. Ad esempio, se si usa un registro Azure Container myacr.azurecr.io e l'immagine è filtermodule:0.0.1-amd64, aggiornare la configurazione filtermodule in:
"filtermodule": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
}
}
Nello strumento di esplorazione di Visual Studio Code fare clic con il pulsante destro del mouse sul file deployment.template.json e scegliere Build and Push IoT Edge Solution (Compila ed esegui il push della soluzione IoT Edge).
Il comando di creazione e push avvia tre operazioni. Prima di tutto, crea una nuova cartella nella soluzione denominata config che contiene il manifesto completo della distribuzione, basato sulle informazioni del modello di distribuzione e di altri file della soluzione. In secondo luogo, esegue docker build
per creare l'immagine del contenitore in base al documento dockerfile appropriato per l'architettura di destinazione. Infine, esegue docker push
per eseguire il push del repository di immagini nel registro contenitori.
Questo processo può richiedere alcuni minuti quando viene eseguito per la prima volta, ma alla successiva esecuzione dei comandi avviene più rapidamente.
Facoltativo: aggiornare il modulo e l'immagine
Se si apportano modifiche al codice del modulo, è necessario ricompilare ed eseguire il push dell'immagine del modulo nel registro contenitori. Usare la procedura descritta in questa sezione per aggiornare l'immagine di compilazione e contenitore. È possibile ignorare questa sezione se non sono state apportate modifiche al codice del modulo.
Aprire il file deployment.amd64.json nella nuova cartella config creata. Il nome del file riflette l'architettura di destinazione, quindi è diverso se si sceglie un'architettura diversa.
Si noti che i due parametri contenenti i segnaposto contengono ora i valori appropriati. La sezione registryCredentials contiene nome utente e password del registro di cui è stato eseguito il pull dal file con estensione .env. Filtermodule contiene il repository di immagini completo, con tag di architettura, nome e versione indicati nel file module.json.
Aprire il file module.json nella cartella filtermodule.
Modificare il numero di versione per l'immagine del modulo. Incrementare ad esempio il numero di versione della patch a
"version": "0.0.2"
, come se fosse stata apportata una piccola correzione nel codice del modulo.Suggerimento
Le versioni dei moduli consentono di usare il controllo della versione e di testare le modifiche in un piccolo set di dispositivi prima di distribuire gli aggiornamenti nell'ambiente di produzione. Se non si incrementa la versione del modulo prima della compilazione e del push, si sovrascrive il repository nel Registro Container.
Salvare le modifiche nel file module.json.
Compilare ed eseguire il push dell'immagine aggiornata con un tag di versione 0.0.2. Ad esempio, per compilare ed eseguire il push dell'immagine per il registro locale o un registro Azure Container, usare i comandi seguenti:
# Build the container image for Linux and amd64 architecture.
dotnet publish --os linux --arch x64
# For local registry:
# Tag the image with version 0.0.2, x64 architecture, and the local registry.
docker tag filtermodule localhost:5000/filtermodule:0.0.2-amd64
# For Azure Container Registry:
# Tag the image with version 0.0.2, x64 architecture, and your container registry information. Replace **myacr** with your own registry name.
docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.2-amd64
Fare di nuovo clic con il pulsante destro del mouse sul file deployment.template.json e scegliere di nuovo Build and push IoT Edge solution (Compila ed esegui il push della soluzione IoT Edge).
Aprire di nuovo il file deployment.amd64.json. Si noti che il sistema di compilazione non crea un nuovo file quando si esegue di nuovo il comando di compilazione e push. Invece, lo stesso file viene aggiornato per riflettere le modifiche. L'immagine filtermodule ora punta alla versione 0.0.2 del contenitore.
Per verificare ulteriormente il risultato del comando di compilazione e push, aprire il portale di Azure e passare al Registro Container.
Nel Registro Container selezionare Repository e quindi filtermodule. Verificare che venga eseguito il push di entrambe le versioni dell'immagine nel registro.
Risoluzione dei problemi
Se si verificano errori durante la compilazione e il push dell'immagine del modulo, spesso il problema è legato alla configurazione di Docker nel computer di sviluppo. Usare le indicazioni seguenti per esaminare la configurazione:
- È stato eseguito il comando
docker login
usando le credenziali copiate dal Registro Container? Queste credenziali sono diverse rispetto a quelle usate per accedere ad Azure. - Il repository di contenitori è corretto? Il nome del Registro Container e quello del modulo sono corretti? Aprire il file module.json nella cartella filtermodule da controllare. Il valore del repository deve essere simile a <nome registro>.azurecr.io/filtermodule.
- Se è stato usato un nome diverso da filterModule per il modulo, il nome è coerente in tutta la soluzione?
- Il computer esegue contenitori dello stesso tipo di quelli che si stanno compilando? Questa esercitazione è relativa ai dispositivi IoT Edge Linux, quindi in Visual Studio Code deve essere presente l'indicazione amd64 o arm32v7 sulla barra laterale e Docker Desktop deve eseguire contenitori Linux.
Distribuire i moduli nel dispositivo
Si è verificato che le immagini dei contenitori di cui è stata eseguita la compilazione sono archiviate nel Registro Container, quindi è possibile eseguirne la distribuzione in un dispositivo. Assicurarsi che il dispositivo IoT Edge sia in esecuzione.
Usare il comando set-modules dell'interfaccia della riga di comando di Azure di IoT Edge per distribuire i moduli nell'hub IoT di Azure. Ad esempio, per distribuire i moduli definiti nel file deployment.template.json nell'hub IoT my-iot-hub per il dispositivo IoT Edge my-device, usare il comando seguente. Sostituire i valori della stringa di connessione dell'hub IoT hub-name, device-id e account di accesso con i propri.
az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"
Suggerimento
Trovare la stringa di connessione dell'hub IoT, inclusa la chiave di accesso condiviso, nel portale di Azure. Passare alle >impostazioni di sicurezza>Criteri di accesso condiviso>iothubowner dell'hub IoT.
Nello strumento di esplorazione di Visual Studio Code espandere Dispositivi nella sezione Azure IoT Hub (Hub IoT di Azure) per visualizzare l'elenco dei dispositivi IoT.
Fare clic con il pulsante destro del mouse sul dispositivo IoT Edge in cui si vuole eseguire la distribuzione, quindi scegliere Create Deployment for Single Device (Crea la distribuzione per un unico dispositivo).
In Esplora file passare alla cartella config e quindi selezionare il file deployment.amd64.json.
Non usare il file deployment.template.json, nel quale non sono presenti le credenziali del Registro Container o i valori delle immagini dei moduli. Se si usa un dispositivo Linux ARM32, il nome del manifesto della distribuzione è deployment.arm32v7.json.
Nel dispositivo espandere Moduli per visualizzare un elenco dei moduli distribuiti e in esecuzione. Selezionare il pulsante Aggiorna. Verranno visualizzati i nuovi moduli tempSensor e filtermodule in esecuzione nel dispositivo.
L'avvio dei moduli può richiedere alcuni minuti. Il runtime di IoT Edge riceve il nuovo manifesto di distribuzione, scarica le immagini del modulo dal contenitore e quindi avvia ogni nuovo modulo.
Visualizzare i messaggi dal dispositivo
Il codice del modulo di esempio ottiene i messaggi tramite la coda di input e li invia tramite la relativa coda di output. Il manifesto della distribuzione configura route che inviano messaggi a filtermodule da tempSensor e quindi inoltra i messaggi da filtermodule all'hub IoT. Le estensioni azure IoT Edge e hub IoT di Azure consentono di visualizzare i messaggi quando arrivano all'hub IoT dal dispositivo.
Nell'esploratore di Visual Studio Code, selezionare il dispositivo IoT Edge da monitorare, quindi selezionare Avvia il monitoraggio dell'endpoint degli eventi predefinito.
Guardare la finestra di output in Visual Studio Code per visualizzare i messaggi arrivati all'hub IoT.
Visualizzare le modifiche nel dispositivo
Per vedere cosa accade nel dispositivo, usare i comandi in questa sezione per esaminare il runtime e i moduli di IoT Edge in esecuzione nel dispositivo.
Questi comandi sono per il dispositivo IoT Edge, non per il computer di sviluppo. Se si usa una macchina virtuale per il dispositivo IoT Edge, connettersi ora. In Azure passare alla pagina di panoramica della macchina virtuale e selezionare Connetti per accedere alla connessione shell sicura.
Visualizzare tutti i moduli distribuiti nel dispositivo e controllarne lo stato:
iotedge list
Vengono visualizzati quattro moduli: i due moduli di runtime di IoT Edge, tempSensor e filtermodule. Tutte e quattro devono essere elencate come in funzione.
Esaminare i log per un modulo specifico:
iotedge logs <module name>
I nomi dei moduli sono sensibili alle maiuscole e minuscole.
I log tempSensor e filtermodule mostrano i messaggi che stanno elaborando. Il modulo edgeAgent avvia gli altri moduli, quindi i log contengono informazioni sul manifesto della distribuzione. Se un modulo non è elencato o non è in esecuzione, controllare la presenza di errori nei log edgeAgent. Il modulo edgeHub gestisce la comunicazione tra i moduli e l'hub IoT. Se i moduli sono in esecuzione ma i messaggi non arrivano nell'hub IoT, controllare la presenza di errori nei log edgeHub.
Pulire le risorse
Se si vuole continuare con l'articolo consigliato successivo, mantenere le risorse e le configurazioni create e riutilizzarle. È anche possibile continuare a usare lo stesso dispositivo IoT Edge come dispositivo di test.
In caso contrario, eliminare le configurazioni locali e le risorse di Azure usate in questo articolo per evitare addebiti.
Eliminare le risorse di Azure
L'eliminazione delle risorse e dei gruppi di risorse di Azure è irreversibile. Assicurarsi di non eliminare accidentalmente il gruppo di risorse sbagliato o le risorse errate. Se è stato creato l'hub IoT all'interno di un gruppo di risorse esistente con risorse da mantenere, eliminare solo la risorsa dell'hub IoT stessa, non il gruppo di risorse.
Per eliminare le risorse:
Accedere al portale di Azure e selezionare Gruppi di risorse.
Selezionare il nome del gruppo di risorse contenente le risorse di test di IoT Edge.
Esaminare l'elenco delle risorse contenute nel gruppo di risorse. Per eliminarle tutte, è possibile selezionare Elimina gruppo di risorse. Se se ne vogliono eliminare solo alcune, è possibile selezionare ogni risorsa per eliminarle singolarmente.
Passaggi successivi
In questa esercitazione si configura Visual Studio Code nel computer di sviluppo e si distribuisce il primo modulo IoT Edge con codice che filtra i dati non elaborati generati dal dispositivo IoT Edge.
Continuare con le esercitazioni successive per informazioni su come Azure IoT Edge consente di distribuire i servizi cloud di Azure per elaborare e analizzare i dati all'perimetro.