Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:
IoT Edge 1.5
Belangrijk
IoT Edge 1.5 LTS is de ondersteunde release. IoT Edge 1.4 LTS bereikt het einde van de levensduur op 12 november 2024. Als u een eerdere versie gebruikt, raadpleegt u Update IoT Edge.
Deze zelfstudie laat zien hoe u uw code ontwikkelt en implementeert op een IoT Edge apparaat. Azure IoT Edge modules kunt u code implementeren waarmee uw bedrijfslogica rechtstreeks op uw IoT Edge apparaat wordt uitgevoerd. In de quickstart Deploy-code naar een Linux-apparaat stelt u een IoT Edge-apparaat in en implementeert u een module vanuit de Azure Marketplace.
In dit artikel worden de stappen voor twee IoT Edge ontwikkelhulpprogramma's beschreven:
- Azure IoT Edge Dev Tool opdrachtregel (CLI), als voorkeurskeuze voor ontwikkeling.
- Azure IoT Edge-hulpprogramma's voor de extensie Visual Studio Code, die zich in de modus maintenance bevindt.
Gebruik de knop toolkiezer aan het begin van dit artikel om uw hulpprogramma te kiezen.
In deze zelfstudie leert u het volgende:
- Uw ontwikkelcomputer instellen
- De IoT Edge-hulpprogramma's gebruiken om een nieuw project te maken
- Bouw uw project als een Docker-container en sla het op in een Azure containerregister
- Uw code implementeren op een IoT Edge-apparaat
De IoT Edge module die u in deze zelfstudie maakt, filtert de temperatuurgegevens die uw apparaat genereert. Er worden alleen berichten upstream verzonden als de temperatuur hoger is dan een ingestelde drempelwaarde. Dit soort analyses aan de rand helpt de hoeveelheid gegevens die naar de cloud worden verzonden en opgeslagen, te verminderen.
Vereisten
Een ontwikkelcomputer:
- Gebruik uw eigen computer of een virtuele machine.
- Zorg ervoor dat uw ontwikkelcomputer ondersteuning biedt voor geneste virtualisatie om een containerengine uit te voeren.
- U kunt de meeste besturingssystemen met een containerengine gebruiken om IoT Edge modules voor Linux-apparaten te ontwikkelen. Deze zelfstudie maakt gebruik van een Windows computer, maar wijst ook op bekende verschillen in macOS of Linux.
- Installeer Visual Studio Code
- Installeer de Azure CLI.
Een Azure IoT Edge-apparaat:
- Voer IoT Edge uit op een afzonderlijk apparaat. Door de ontwikkelcomputer en het IoT Edge apparaat gescheiden te houden, wordt een echt implementatiescenario gesimuleerd en blijven de concepten duidelijk. Gebruik het quickstart-artikel Deploy-code voor een Linux-apparaat om een IoT Edge apparaat te maken in Azure of de sjabloon Azure Resource Manager om een IoT Edge vm te implementeren.
Cloudbronnen
- Gebruik een gratis of standaardniveau Azure IoT Hub.
Als u geen Azure account hebt, maakt u een free-account voordat u begint.
Aanbeveling
Voor hulp bij interactieve foutopsporing in Visual Studio Code of Visual Studio 2022:
- Debug Azure IoT Edge modules using Visual Studio Code
- Gebruik Visual Studio 2022 voor het ontwikkelen en opsporen van fouten in modules voor Azure IoT Edge
In deze zelfstudie worden de ontwikkelingsstappen voor Visual Studio Code beschreven.
Belangrijke concepten
In deze zelfstudie wordt uitgelegd hoe u een IoT Edge-module ontwikkelt. Een IoT Edge module is een container met uitvoerbare code. U kunt een of meer modules implementeren op een IoT Edge apparaat. Modules voeren specifieke taken uit, zoals het opnemen van gegevens van sensoren, het opschonen en analyseren van gegevens, of het verzenden van berichten naar een IoT Hub. Zie Onderstand Azure IoT Edge modules voor meer informatie.
Wanneer u IoT Edge modules ontwikkelt, moet u het verschil tussen de ontwikkelcomputer en het doelapparaat IoT Edge apparaat begrijpen waar de module wordt geïmplementeerd. De container die u bouwt om uw modulecode op te slaan, moet overeenkomen met het besturingssysteem (OS) van het doelapparaat. Het meest voorkomende scenario is het ontwikkelen van een module op een Windows-computer gericht op een Linux-apparaat dat IoT Edge draait. In dat geval is het containerbesturingssysteem Linux. Als u deze zelfstudie doorloopt, moet u rekening houden met het verschil tussen het besturingssysteem van de ontwikkelcomputer en het besturingssysteem van de container.
Aanbeveling
Als u IoT Edge voor Linux gebruikt op Windows, is het doelapparaat in uw scenario de virtuele Linux-machine, niet de Windows host.
Deze handleiding viseert apparaten waarop IoT Edge draait met Linux-containers. Gebruik uw voorkeursbesturingssysteem zolang op uw ontwikkelcomputer Linux-containers worden uitgevoerd. Visual Studio Code wordt aanbevolen voor het ontwikkelen met Linux-containers, dus in deze zelfstudie wordt deze gebruikt. U kunt ook Visual Studio gebruiken, hoewel er verschillen zijn in ondersteuning tussen de twee hulpprogramma's.
De volgende tabel bevat ondersteunde ontwikkelingsscenario's voor Linux-containers in Visual Studio Code en Visual Studio.
| Visual Studio Code | Visual Studio 2019/2022 | |
|---|---|---|
| Architectuur van Linux-apparaat | Linux AMD64 Linux ARM32v7 Linux ARM64 |
Linux AMD64 Linux ARM32 Linux ARM64 |
| Azure services | Azure Functions Azure Stream Analytics Azure Machine Learning |
|
| Talen | C C# Java Node.js Python |
C C# |
| Meer informatie | Azure IoT Edge voor Visual Studio Code |
Azure IoT Edge Tools voor Visual Studio 2019 Azure IoT Edge Tools voor Visual Studio 2022 |
Container-engine installeren
IoT Edge modules zijn verpakt als containers, dus u hebt een Docker-compatibel containerbeheersysteem nodig op uw ontwikkelcomputer om ze te bouwen en te beheren. Docker Desktop is een populaire keuze voor ontwikkeling omdat het sterke functieondersteuning heeft. Met Docker Desktop op Windows kunt u schakelen tussen Linux-containers en Windows-containers, zodat u modules kunt ontwikkelen voor verschillende typen IoT Edge-apparaten.
Gebruik de Docker-documentatie om Docker te installeren op uw ontwikkelcomputer:
Install Docker Desktop for Windows. Wanneer u Docker Desktop installeert voor Windows, wordt u gevraagd of u Linux- of Windows-containers wilt gebruiken. U kunt deze instelling op elk gewenst moment wijzigen. In deze zelfstudie worden Linux-containers gebruikt omdat de modules gericht zijn op Linux-apparaten. Zie Switch tussen Windows en Linux-containers voor meer informatie.
Lees About Docker CE voor informatie over de installatie op verschillende Linux-platforms. Installeer Docker Desktop voor Windows voor de Windows Subsystem for Linux (WSL).
Tools instellen
Installeer het Python Azure IoT Edge Dev Tool om uw IoT Edge-oplossing te maken. U hebt twee opties:
- Gebruik de vooraf gebouwde IoT Edge Dev Container.
- Installeer het hulpprogramma met behulp van de iotedgedev-ontwikkelinstallatie.
Belangrijk
De Azure IoT Edge-hulpprogramma's voor de extensie Visual Studio Code bevindt zich in de modus maintenance. Het voorkeur ontwikkeltool is de opdrachtregelinterface (CLI) Azure IoT Edge Dev Tool.
Gebruik de IoT-extensies voor Visual Studio Code om IoT Edge modules te ontwikkelen. Deze extensies bieden projectsjablonen, automatiseren het maken van het implementatiemanifest en u kunt IoT Edge apparaten bewaken en beheren. In deze sectie installeert u Visual Studio Code en de IoT-extensie en stelt u vervolgens uw Azure-account in om IoT Hub resources te beheren vanuit Visual Studio Code.
- Installeer Azure IoT Edge extensie.
- Installeer Azure IoT Hub extensie.
- Nadat u de extensies hebt geïnstalleerd, opent u het opdrachtenpalet door het opdrachtenpalet weergeven >te selecteren.
- Zoek en selecteer in het opdrachtenpalet Azure IoT Hub: Selecteer IoT Hub. Volg de aanwijzingen om uw Azure-abonnement en IoT Hub te selecteren.
- Open de sectie Explorer van Visual Studio Code door het pictogram in de activiteitenbalk te selecteren of door Weergave > Explorer te selecteren.
- Vouw onder in de sectie Explorer het samengevouwen menu Azure IoT Hub/Apparaten uit. U ziet de apparaten en IoT Edge apparaten die zijn gekoppeld aan de IoT Hub die u hebt geselecteerd via het opdrachtenpalet.
Taalspecifieke hulpprogramma's installeren
Installeer hulpprogramma's die specifiek zijn voor de taal waarin u ontwikkelt:
Een containerregister maken
In deze zelfstudie gebruikt u de extensies Azure IoT Edge en Azure IoT Hub om een module te bouwen en een containerinstallatiekopieën van de bestanden te maken. Vervolgens plaatst u deze images naar een register waarin uw images worden opgeslagen en beheerd. Ten slotte plaatst u uw image uit het register om te draaien op uw IoT Edge-apparaat.
Belangrijk
De Azure IoT Edge Visual Studio Code-extensie bevindt zich in de modus maintenance.
U kunt elk Docker-compatibele register gebruiken om uw containerafbeeldingen op te slaan. Twee populaire Docker-registerservices zijn Azure Container Registry en Docker Hub. In deze zelfstudie wordt gebruikgemaakt van Azure Container Registry.
Als u nog geen containerregister hebt, volgt u deze stappen om een nieuwe te maken in Azure:
Selecteer in de Azure-portalEen resource aanmaken>Containers>Container Registry.
Geef de volgende vereiste waarden op om uw containerregister te maken:
Veld Waarde Abonnement Selecteer een abonnement in de vervolgkeuzelijst. Resourcegroep Gebruik dezelfde resourcegroep voor alle testresources die u tijdens de IoT Edge quickstarts en zelfstudies maakt, bijvoorbeeld IoTEdgeResources. Registernaam Geef hier een unieke naam op. Locatie Kies een locatie dicht bij u in de buurt. Artikelnummer (SKU) Selecteer Basic. Selecteer Beoordelen en maken en vervolgens Maken.
Selecteer het nieuwe containerregister in de sectie Resources van de startpagina van uw Azure portal om het te openen.
Selecteer in het linkerdeelvenster van het containerregister toegangssleutels in het menu onder Instellingen.
Schakel beheerdersgebruiker in met de wisselknop en bekijk de gebruikersnaam en het wachtwoord voor uw containerregister.
Kopieer de waarden voor de aanmeldingsserver, gebruikersnaam en wachtwoord en sla ze ergens op. U gebruikt deze waarden verderop in de zelfstudie om toegang te verlenen tot het containerregister.
Een nieuw moduleproject maken
De Azure IoT Edge-extensie biedt projectsjablonen voor alle ondersteunde IoT Edge moduletalen in Visual Studio Code. Deze sjablonen bevatten alle bestanden en code die u nodig hebt om een werkende module te implementeren om IoT Edge te testen of u een beginpunt te geven om de sjabloon aan te passen met uw eigen bedrijfslogica.
Een projectsjabloon maken
Het IoT Edge Dev Tool vereenvoudigt Azure IoT Edge ontwikkeling, met opdrachten die worden aangestuurd door omgevingsvariabelen. Het helpt u om aan de slag te gaan met IoT Edge ontwikkeling met behulp van de IoT Edge Dev Container en IoT Edge oplossingsstructuur met een standaardmodule en alle vereiste configuratiebestanden.
Maak een map voor uw oplossing op een door u gekozen pad. Verander naar uw
iotedgesolutiondirectory.mkdir c:\dev\iotedgesolution cd c:\dev\iotedgesolutionGebruik de opdracht
iotedgedev solution initom een oplossing te maken en uw Azure IoT Hub in te stellen in de ontwikkeltaal van uw keuze:
Met de iotedgedev solution init opdracht wordt u gevraagd om verschillende stappen uit te voeren, waaronder:
- Verifiëren bij Azure
- Een Azure-abonnement kiezen
- Een resourcegroep kiezen of maken
- Een Azure IoT Hub kiezen of maken
- Een Azure IoT Edge-apparaat kiezen of maken
Gebruik Visual Studio Code en de extensie Azure IoT Edge. Begin met het maken van een oplossing en genereer vervolgens de eerste module in die oplossing. Elke oplossing kan meerdere modules bevatten.
- Selecteer Opdrachtpalet weergeven>.
- Voer in het opdrachtenpalet de opdracht Azure IoT Edge: New IoT Edge Solution in en voer deze uit.
- Blader naar de map waarin u de nieuwe oplossing wilt maken en selecteer vervolgens Map selecteren.
- Voer een naam in voor uw oplossing.
- Selecteer een modulesjabloon voor de ontwikkeltaal van uw voorkeur als de eerste module in de oplossing.
- Voer een naam in voor uw module. Kies een naam die uniek is in uw containerregister.
- Voer de naam in van de afbeeldingsopslagplaats van de module. Visual Studio Code vult de modulenaam automatisch in met localhost:5000/<your module name>. Vervang deze door uw eigen registergegevens. Gebruik localhost als u een lokaal Docker-register gebruikt om te testen. Als u Azure Container Registry gebruikt, gebruikt u Login-server uit de instellingen van het register. De aanmeldingsserver ziet eruit als <registernaam.azurecr.io>. Vervang alleen het deel localhost:5000 van de tekenreeks, zodat het uiteindelijke resultaat eruitziet als <registernaam.azurecr.io/><naam van de module>.
Visual Studio Code neemt de informatie die u hebt opgegeven, maakt een IoT Edge oplossing en laadt deze vervolgens in een nieuw venster.
Nadat u de oplossing hebt gemaakt, bevinden deze hoofdbestanden zich in de oplossing:
De .vscode-map bevat het configuratiebestand launch.json.
De modules-map bevat submappen voor elke module. In elke submap bepaalt het module.json bestand hoe modules worden gebouwd en geïmplementeerd.
Het .env-bestand bevat uw omgevingsvariabelen. De omgevingsvariabele voor het containerregister is standaard localhost:5000 .
In twee module-implementatiebestanden, deployment.template.json en deployment.debug.template.json, worden de modules vermeld die op uw apparaat moeten worden geïmplementeerd. De lijst bevat standaard de IoT Edge systeemmodules (edgeAgent en edgeHub) en voorbeeldmodules zoals:
- filtermodule is een voorbeeldmodule waarmee een eenvoudige filterfunctie wordt geïmplementeerd.
- De module SimulatedTemperatureSensor simuleert gegevens die u kunt gebruiken voor testen. Zie voor meer informatie over hoe implementatiemanifesten werken, hoe u implementatiemanifesten gebruikt om modules te implementeren en routes tot stand te brengen. Zie de broncode SimulatedTemperatureSensor.csproj voor meer informatie over de werking van de gesimuleerde temperatuurmodule.
Notitie
De exacte geïnstalleerde modules kunnen afhankelijk zijn van uw keuzetaal.
Runtime-versie van IoT Edge instellen
De nieuwste stabiele IoT Edge systeemmoduleversie is 1.5. Stel uw systeemmodules in op versie 1.5.
Open in Visual Studio Code het manifestbestand deployment.template.json- implementatiemanifest. Het manifest deployment is een JSON-document waarin de modules worden beschreven die moeten worden geconfigureerd op het doelapparaat IoT Edge.
Wijzig de runtimeversie voor de systeemruntimemodule-afbeeldingen
edgeAgentenedgeHub. Als u bijvoorbeeld de IoT Edge runtimeversie 1.5 wilt gebruiken, wijzigt u de volgende regels in het manifestbestand voor de implementatie:"systemModules": { "edgeAgent": { "image": "mcr.microsoft.com/azureiotedge-agent:1.5", "edgeHub": { "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
Geef uw registerreferenties op voor de IoT Edge-agent
Het omgevingsbestand slaat de referenties voor uw containerregister op en deelt deze met de IoT Edge runtime. De runtime heeft deze inloggegevens nodig om uw containerbeelden naar het IoT Edge-apparaat binnen te halen.
De IoT Edge-extensie probeert uw containerregisterreferenties op te halen uit Azure en deze in het omgevingsbestand in te vullen.
Notitie
Het omgevingsbestand wordt alleen gemaakt als u een opslagplaats voor installatiekopieën voor de module opgeeft. Als u de localhost-standaardwaarden hebt geaccepteerd om lokaal te testen en fouten op te sporen, hoeft u geen omgevingsvariabelen te declareren.
Controleer of uw inloggegevens bestaan. Als dat niet het geval is, voegt u ze nu toe:
Als Azure Container Registry uw register is, stelt u een Azure Container Registry gebruikersnaam en wachtwoord in. Haal deze waarden op uit het menu Instellingen>Toegangssleutels in de Azure portal.
Open het .env-bestand in uw moduleoplossing.
Voeg de waarden username en password toe die u hebt gekopieerd uit het Azure containerregister. Voorbeeld:
CONTAINER_REGISTRY_SERVER="myacr.azurecr.io" CONTAINER_REGISTRY_USERNAME="myacr" CONTAINER_REGISTRY_PASSWORD="<registry_password>"Sla uw wijzigingen op in het .env-bestand .
Notitie
In deze zelfstudie worden beheerdersreferenties gebruikt voor Azure Container Registry die handig zijn voor ontwikkelings- en testscenario's. Wanneer u klaar bent voor productiescenario's, raden we u aan een optie voor authenticatie met minimale bevoegdheden, zoals service-principals of op opslagplaats gebaseerde tokens. Zie Toegang tot uw containerregister beheren voor meer informatie.
Doelarchitectuur
Selecteer de architectuur die u wilt gebruiken voor elke oplossing, omdat dit van invloed is op de wijze waarop de container wordt gebouwd en uitgevoerd. De standaardinstelling is Linux AMD64. Gebruik voor deze zelfstudie een virtuele Ubuntu-machine als het IoT Edge-apparaat en behoud de standaard-amd64.
Als u de doelarchitectuur voor uw oplossing wilt wijzigen, volgt u deze stappen.
- Open het opdrachtenpalet en zoek naar Azure IoT Edge: Standaarddoelplatform instellen voor Edge Solution of selecteer het snelkoppelingspictogram in de zijbalk onderaan het venster.
- Selecteer in het opdrachtpalet de doelarchitectuur in de lijst met opties.
De doelarchitectuur wordt ingesteld wanneer u de containerimage in een latere stap maakt.
Module bijwerken met aangepaste code
Elke sjabloon bevat voorbeeldcode waarmee gesimuleerde sensorgegevens uit de module SimulatedTemperatureSensor worden gebruikt en naar de IoT Hub worden gerouteerd. De voorbeeldmodule ontvangt berichten en geeft deze door. De pijplijnfunctionaliteit toont een belangrijk concept in IoT Edge: hoe modules met elkaar communiceren.
Elke module kan meerdere invoer - en uitvoerwachtrijen hebben gedeclareerd in de code. De IoT Edge hub die op het apparaat wordt uitgevoerd, stuurt berichten van de uitvoer van één module naar de invoer van een of meer modules. De specifieke code voor het declareren van invoer en uitvoer verschilt per taal, maar het concept is hetzelfde voor alle modules. Zie Routes declareren voor meer informatie over routering tussen modules.
De C#-voorbeeldcode die bij de projectsjabloon wordt geleverd, gebruikt de klasse ModuleClient van de IoT Hub SDK voor .NET.
Open in de Verkenner van Visual Studio Code modules > filtermodule > ModuleBackgroundService.cs.
Voeg vóór de
filtermodulenaamruimte drieusinginstructies toe voor typen die later worden gebruikt:using System.Collections.Generic; // For KeyValuePair<> using Microsoft.Azure.Devices.Shared; // For TwinCollection using Newtonsoft.Json; // For JsonConvertVoeg de
temperatureThresholdvariabele toe aan deModuleBackgroundServiceklasse. Met deze variabele wordt de waarde ingesteld die de gemeten temperatuur moet overschrijden voordat de gegevens naar de IoT Hub worden verzonden.static int temperatureThreshold { get; set; } = 25;Voeg de
MessageBody,MachineenAmbientklassen toe. Deze klassen bepalen het verwachte schema voor de hoofdtekst van inkomende berichten.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;} }Zoek de functie
ExecuteAsync. Met deze functie maakt en configureert u eenModuleClient-object waarmee de module verbinding kan maken met de lokale Azure IoT Edge runtime om berichten te verzenden en te ontvangen. Nadat u deModuleClienthebt gemaakt, leest de code detemperatureThresholdwaarde uit de gewenste eigenschappen van de moduletweeling. De code registreert een callback voor het ontvangen van berichten van een IoT Edge hub via een eindpunt met de naaminput1.Vervang de aanroep naar de
ProcessMessageAsyncmethode door een nieuwe die de naam van het eindpunt bijwerken en de methode die wordt aangeroepen wanneer invoer binnenkomt. Voeg ook eenSetDesiredPropertyUpdateCallbackAsyncmethode toe voor updates aan de gewenste eigenschappen. Als u deze wijziging wilt aanbrengen, vervangt u de laatste regel van deExecuteAsyncmethode door de volgende code:// 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);Voeg de
OnDesiredPropertiesUpdatemethode toe aan deModuleBackgroundServiceklasse. Deze methode ontvangt updates voor de gewenste eigenschappen van de module-twin en werkt detemperatureThresholdvariabele bij zodat deze overeenkomt. Alle modules hebben hun eigen moduledubbel, waardoor u rechtstreeks in de cloud de code kunt configureren die in een module wordt uitgevoerd.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; }Voeg de
FilterMessagesmethode toe. Deze methode wordt aangeroepen wanneer de module een bericht ontvangt van de IoT Edge hub. Berichten met temperaturen onder de temperatuurgrens die via de module-twin is ingesteld, worden daardoor gefilterd. Het voegt ook deMessageTypeeigenschap toe aan het bericht, waarbij de waarde is ingesteld opAlert: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; } }Sla het ModuleBackgroundService.cs-bestand op.
Open in Visual Studio Code Explorer het bestand deployment.template.json in de werkruimte van de IoT Edge-oplossing.
Omdat we de naam van het eindpunt hebben gewijzigd waarop de module luistert, moeten we ook de routes in het implementatiemanifest bijwerken, zodat edgeHub berichten naar het nieuwe eindpunt verzendt.
Zoek de
routessectie in de $edgeHub moduletweeling. Werk desensorTofiltermoduleroute bij ominput1te vervangen doorinputFromSensor:"sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"Voeg de moduletweeling filtermodule toe aan het implementatiemanifest. Voeg de volgende JSON-inhoud onderaan de
modulesContent-sectie in, na de $edgeHub tweelingmodule:"filtermodule": { "properties.desired":{ "TemperatureThreshold":25 } }Sla het bestand deployment.template.json op.
De oplossing bouwen en pushen
U hebt de modulecode en de implementatiesjabloon bijgewerkt om inzicht te hebben in enkele belangrijke implementatieconcepten. U bent nu klaar om de containerafbeelding van de module te bouwen en naar het containerregister te uploaden.
Open in Visual Studio Code het manifestbestand deployment.template.json- implementatiemanifest. In het manifest deployment worden de modules beschreven die moeten worden geconfigureerd op het doelapparaat IoT Edge. Voordat u de implementatie uitvoert, moet u uw Azure Container Registry referenties en de module-installatiekopieën bijwerken met de juiste createOptions-waarden. Zie createOptions voor meer informatie over -waarden.
Als u een Azure Container Registry gebruikt om de moduleafbeelding op te slaan, voegt u uw referenties toe aan de sectie modulesContent > edgeAgent > settings > registryCredentials in deployment.template.json. Vervang myacr door uw eigen registernaam en geef uw wachtwoord en aanmeldingsserveradres op. Voorbeeld:
"registryCredentials": {
"myacr": {
"username": "myacr",
"password": "<your_acr_password>",
"address": "myacr.azurecr.io"
}
}
Voeg de volgende tekenreeksinhoud toe aan de createOptions waarde voor elk systeem (edgeHub en *edgeAgent) en aangepaste module (filtermodule en tempSensor) die worden vermeld. Wijzig indien nodig de waarden:
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
De filtermodule configuratie moet bijvoorbeeld vergelijkbaar zijn met:
"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\"}]}}}"
}
Docker-module-image bouwen
Open de geïntegreerde Visual Studio Code terminal door Terminal > New Terminal te selecteren.
Gebruik de dotnet publish opdracht om de containerinstallatiekopieën voor Linux- en amd64-architectuur te bouwen. Verander naar de map filtermodule in uw project en voer het dotnet publish commando uit.
dotnet publish --os linux --arch x64 /t:PublishContainer
Op dit moment is het hulpprogrammasjabloon iotedgedev gericht op .NET 7.0, dat eind van de ondersteuning in mei 2024 heeft bereikt. Werk het project bij naar het doel .NET 8.0 (LTS, ondersteund tot en met november 2026) door het bestand filtermodule.csproj te bewerken en de TargetFramework en PackageReference-waarden te wijzigen. Het bestand filtermodule.csproj moet er als volgt uitzien:
<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>
Tag de docker-image met uw containerregistratie-info, versie en architectuur. Vervang door myacr uw eigen registernaam:
docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.1-amd64
Docker-image van push-module
Geef uw containerregisterreferenties op voor Docker, zodat deze uw containerinstallatiekopieën naar de opslag in het register kan pushen.
Meld u aan bij Docker met de ACR-referenties (Azure Container Registry):
docker login -u <ACR username> -p <ACR password> <ACR login server>Mogelijk ontvangt u een beveiligingswaarschuwing waarin het gebruik van
--password-stdinwordt aanbevolen. Hoewel dit een aanbevolen best practice is voor productiescenario's, valt dit buiten het bereik van deze zelfstudie. Gebruik voor verificatie van containerregisters in productie een service-principal of tokens met opslagplaatsbereik in plaats van beheerdersreferenties. Zie De toegang tot uw containerregister en de docker-aanmeldingsreferentie beheren voor meer informatie.Meld u aan bij de Azure Container Registry. U moet installeren Azure CLI om de opdracht
azte gebruiken. Met deze opdracht wordt om uw gebruikersnaam en wachtwoord gevraagd, te vinden in uw containerregister onder Instellingen > Toegangssleutels.az acr login -n <ACR registry name>Aanbeveling
Als u op enig moment in deze zelfstudie bent afgemeld, herhaalt u de Docker- en Azure Container Registry aanmeldingsstappen om door te gaan.
Push de module-installatiekopieën naar het lokale register of een containerregister:
docker push <ImageName>Voorbeeld:
# 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
De implementatiesjabloon bijwerken
Werk de implementatiesjabloon deployment.template.json bij met de locatie van de containerregisterafbeelding. Als u bijvoorbeeld een Azure Container Registry myacr.azurecr.io gebruikt en uw image is filtermodule:0.0.1-amd64, werkt u de filtermodule-configuratie bij naar:
"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\"}]}}}"
}
}
Klik in de Visual Studio Code explorer met de rechtermuisknop op het bestand deployment.template.json en selecteer Build and Push IoT Edge Solution.
Met de opdracht voor bouwen en pushen worden drie bewerkingen gestart. Eerst wordt er een nieuwe map met de naam config in de oplossing gemaakt die het volledige implementatiemanifest bevat, op basis van de informatie in de implementatiesjabloon en andere oplossingsbestanden. Daarna wordt docker build uitgevoerd om de containerimage te bouwen op basis van het juiste dockerfile voor uw doelarchitectuur. Vervolgens wordt docker push uitgevoerd om de imagetopslagplaats naar het containerregister te pushen.
Dit proces kan enkele minuten duren, maar het is sneller wanneer u de opdrachten de volgende keer uitvoert.
Optioneel: De module en afbeelding bijwerken
Als u wijzigingen aanbrengt in uw modulecode, moet u de module-afbeeldingen opnieuw bouwen en naar het containerregister uploaden. Gebruik de stappen in deze paragraaf om de build- en containerimage bij te werken. U kunt deze sectie overslaan als u geen wijzigingen hebt aangebracht in de modulecode.
Open het bestand deployment.amd64.json in de zojuist gemaakte configuratiemap. De bestandsnaam weerspiegelt de doelarchitectuur, dus dit is anders als u een andere architectuur kiest.
U ziet dat de twee parameters met tijdelijke aanduidingen nu de juiste waarden bevatten. In registryCredentials de sectie zijn de gebruikersnaam en het wachtwoord van het register opgehaald uit het .env-bestand . De volledige filtermodule-repository bevat de naam, versie en architectuurtag uit het bestand module.json.
Open het bestand module.json in de map filtermodule.
Wijzig het versienummer voor de module-image. U kunt bijvoorbeeld het versienummer van de patch verhogen naar
"version": "0.0.2"alsof u een kleine correctie in de modulecode heeft aangebracht.Aanbeveling
Met moduleversies kunt u versiebeheer inschakelen en kunt u wijzigingen op een kleine set apparaten testen voordat u updates implementeert in productie. Als u de moduleversie niet verhoogt voordat u bouwt en pusht, overschrijft u de opslagplaats in uw containerregister.
Sla uw wijzigingen op in het module.json-bestand .
Bouw en push de bijgewerkte image met een versie-tag 0.0.2. Als u bijvoorbeeld de installatiekopieën voor het lokale register of een Azure containerregister wilt bouwen en pushen, gebruikt u de volgende opdrachten:
# 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
Klik opnieuw met de rechtermuisknop op het bestand deployment.template.json en selecteer Build en Push IoT Edge Solution opnieuw.
Open het bestand deployment.amd64.json opnieuw. U ziet dat het buildsysteem geen nieuw bestand maakt wanneer u de build- en pushopdracht opnieuw uitvoert. In plaats daarvan wordt hetzelfde bestand bijgewerkt om de wijzigingen te weerspiegelen. De filtermodule-afbeelding wijst nu naar de container in versie 0.0.2.
Ga naar de Azure portal en navigeer naar het containerregister om verder te controleren wat de build- en pushopdracht heeft gedaan. Selecteer opslagplaatsen in het containerregister en filtermodule. Controleer of beide versies van het image naar de registrie worden geüpload.
Problemen oplossen
Als er fouten optreden bij het bouwen en pushen van de installatiekopie van de module, heeft dit vaak te maken met Docker-configuratie op uw ontwikkelcomputer. Gebruik de volgende controles om uw configuratie te controleren:
- Hebt u de opdracht
docker loginuitgevoerd met behulp van de referenties die u uit het containerregister hebt gekopieerd? Deze referenties verschillen van de referenties die u gebruikt om u aan te melden bij Azure. - Hebt u de juiste containeropslagplaats? Heeft deze de juiste containerregisternaam en de juiste modulenaam? Open het module.json-bestand in de map filtermodule om dit te controleren. De waarde van de opslagplaats moet vergelijkbaar zijn met <registernaam.azurecr.io/filtermodule>.
- Als u een andere naam dan filtermodule voor uw module hebt gebruikt, is die naam consistent in de hele oplossing?
- Draait uw machine hetzelfde type containers dat u bouwt? Deze zelfstudie is bedoeld voor Linux IoT Edge-apparaten, dus Visual Studio Code moet amd64 of arm32v7 aangeven in de zijbalk en Docker Desktop moet Linux-containers draaien.
Modules op het apparaat implementeren
U hebt gecontroleerd of er ingebouwde containerinstallatiekopieën zijn opgeslagen in uw containerregister, dus het is tijd om ze op een apparaat te implementeren. Zorg ervoor dat uw IoT Edge apparaat actief is.
Gebruik de opdracht IoT Edge Azure CLI set-modules om de modules in de Azure IoT Hub te implementeren. Als u bijvoorbeeld de modules wilt implementeren die zijn gedefinieerd in het bestand deployment.template.json naar het bestand IoT Hub my-iot-hub voor het IoT Edge apparaat my-device gebruikt u de volgende opdracht. Vervang de hub-name, device-id en login IoT Hub connection string door uw eigen waarden.
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>"
Aanbeveling
Zoek uw IoT Hub connection string, inclusief de gedeelde toegangssleutel, in de Azure-portal. Ga naar uw IoT Hub en selecteer Beveiligingsinstellingen > Beleid voor gedeelde toegang > iothubowner.
Vouw in de Visual Studio Code verkenner onder de sectie Azure IoT HubDevices uit om uw lijst met IoT-apparaten weer te geven.
Klik met de rechtermuisknop op het IoT Edge-apparaat waarop u wilt implementeren en selecteer vervolgens Implementatie maken voor één apparaat.
Ga in de bestandsverkenner naar de map config en selecteer vervolgens het bestand deployment.amd64.json.
Gebruik het bestand deployment.template.json niet, dat geen containerregisterreferenties of module-afbeeldingswaarden bevat. Als u zich richt op een Linux ARM32-apparaat, wordt de naam van het implementatiemanifest deployment.arm32v7.json.
Vouw onder uw apparaat Modules uit voor een lijst met de geïmplementeerde en actieve modules. Selecteer de knop Vernieuwen. U ziet nu de nieuwe tempSensor en filtermodule die op uw apparaat draaien.
Het kan enkele minuten duren voordat de modules zijn gestart. De IoT Edge runtime ontvangt het nieuwe implementatiemanifest, haalt de moduleinstallatiekopieën van de containerruntime op en start vervolgens elke nieuwe module.
Berichten van het apparaat weergeven
De voorbeeldmodulecode haalt berichten op via de invoerwachtrij en verzendt deze via de uitvoerwachtrij. Het implementatiemanifest stelt routes in waarmee berichten worden verzonden naar filtermodule vanaf tempSensor en berichten vervolgens doorsturen vanuit filtermodule naar IoT Hub. Met de Azure IoT Edge- en Azure IoT Hub-extensies kunt u berichten zien wanneer ze op IoT Hub van uw apparaat aankomen.
Selecteer in de Visual Studio Code explorer het IoT Edge apparaat dat u wilt bewaken en selecteer vervolgens Start Monitoring Built-in Event Endpoint.
Bekijk het uitvoervenster in Visual Studio Code om te zien dat berichten binnenkomen bij uw IoT Hub.
Wijzigingen op apparaat weergeven
Als u wilt zien wat er op uw apparaat gebeurt, gebruikt u de opdrachten in deze sectie om de IoT Edge runtime en modules te controleren die op uw apparaat worden uitgevoerd.
Deze opdrachten zijn voor uw IoT Edge apparaat, niet uw ontwikkelcomputer. Als u een virtuele machine voor uw IoT Edge apparaat gebruikt, maakt u er nu verbinding mee. Ga in Azure naar de overzichtspagina van de virtuele machine en selecteer Connect om toegang te krijgen tot de beveiligde shell-verbinding.
Bekijk alle modules die op het apparaat zijn geïmplementeerd en controleer de status ervan:
iotedge listU ziet vier modules: de twee IoT Edge runtimemodules tempSensor en filtermodule. Alle vier moeten worden weergegeven als actief.
Controleer de logboeken voor een specifieke module:
iotedge logs <module name>Modulenamen zijn hoofdlettergevoelig.
In de logboeken tempSensor en filtermodule worden de berichten weergegeven die ze verwerken. De edgeAgent-module start de andere modules, zodat de logboeken informatie hebben over het implementatiemanifest. Als een module niet wordt weergegeven of niet wordt uitgevoerd, controleert u de edgeAgent-logboeken op fouten. De module edgeHub beheert de communicatie tussen de modules en IoT Hub. Als de modules worden uitgevoerd, maar er geen berichten binnenkomen bij uw IoT Hub, controleert u de logboeken edgeHub op fouten.
Middelen opschonen
Als u wilt doorgaan naar het volgende aanbevolen artikel, moet u de resources en configuraties die u hebt gemaakt behouden en opnieuw gebruiken. U kunt ook hetzelfde IoT Edge apparaat blijven gebruiken als een testapparaat. Als u kosten wilt voorkomen, verwijdert u de lokale configuratie en de Azure resources die u in dit artikel hebt gebruikt.
Azure resources verwijderen
U kunt het verwijderen van Azure resources en resourcegroepen niet ongedaan maken. Zorg ervoor dat u niet per ongeluk de verkeerde resourcengroep of bronnen delete. Als u de IoT Hub hebt gemaakt in een bestaande resourcegroep met resources die u wilt behouden, verwijdert u alleen de IoT Hub resource zelf, niet de resourcegroep.
Om de resources te verwijderen:
- Meld u aan bij de Azure-portal en selecteer vervolgens Resource-groepen.
- Selecteer de naam van de resourcegroep die uw IoT Edge testresources bevat.
- Bekijk de lijst met resources die uw resourcegroep bevat. Als u alle mappen wilt verwijderen, kunt u Resourcegroep verwijderen selecteren. Als u slechts enkele resources wilt verwijderen, selecteert u elke resource om ze afzonderlijk te verwijderen.
Volgende stappen
In deze zelfstudie stelt u Visual Studio Code in op uw ontwikkelcomputer en implementeert u uw eerste IoT Edge-module met code waarmee onbewerkte gegevens worden gefilterd die door uw IoT Edge apparaat worden gegenereerd.
Ga verder met de volgende tutorials om te leren hoe Azure IoT Edge u in staat stelt Azure cloudservices te implementeren om gegevens aan de edge te verwerken en te analyseren.