Dela via


Självstudie: Utveckla IoT Edge moduler med hjälp av Visual Studio Code

Applies to:IoT Edge 1.5 bock IoT Edge 1.5

Viktigt!

IoT Edge 1.5 LTS är den version som stöds. IoT Edge 1.4 LTS upphörde den 12 november 2024. Om du använder en tidigare version läser du Update IoT Edge.

Den här handledningen visar hur du utvecklar och distribuerar din kod till en IoT Edge-enhet. Azure IoT Edge moduler kan du distribuera kod som kör din affärslogik direkt på din IoT Edge enhet. I snabbstarten Distribution till en Linux-enhet konfigurerar du en IoT Edge enhet och distribuerar en modul från Azure Marketplace.

I den här artikeln beskrivs stegen för två IoT Edge utvecklingsverktyg:

  • Azure IoT Edge Dev Tool kommandoradsgränssnitt (CLI), vilket är att föredra för utveckling.
  • Azure IoT Edge-verktyg för Visual Studio Code-tillägget, som är i underhållsläge.

Använd knappen för verktygsväljaren i början av den här artikeln för att välja ditt verktyg.

I den här handledningen lär du dig hur man:

  • Konfigurera utvecklingsdatorn
  • Använd IoT Edge verktyg för att skapa ett nytt projekt
  • Skapa projektet som en Docker-container och lagra det i ett Azure containerregister
  • Distribuera koden till en IoT Edge enhet

Den IoT Edge modul som du skapar i den här självstudien filtrerar temperaturdata som enheten genererar. Den skickar meddelanden uppströms endast om temperaturen är över ett angivet tröskelvärde. Den här typen av analys på gränsen hjälper till att minska mängden data som skickas till och lagras i molnet.

Förutsättningar

En utvecklingsdator:

  • Använd din egen dator eller en virtuell dator.
  • Kontrollera att utvecklingsdatorn stöder kapslad virtualisering för att köra en containermotor.
  • Du kan använda de flesta operativsystem som kör en containermotor för att utveckla IoT Edge moduler för Linux-enheter. I den här självstudien används en Windows dator, men den pekar också på kända skillnader i macOS eller Linux.
  • Installera Visual Studio Code
  • Installera Azure CLI.

En Azure IoT Edge-enhet:

Molnresurser:

Om du inte har ett Azure konto skapar du ett fritt konto innan du börjar.

Tips

För vägledning om interaktiv felsökning i Visual Studio Code eller Visual Studio 2022:

Den här handledningen innehåller utvecklingsprocessen för Visual Studio Code.

Nyckelbegrepp

I den här självstudien går vi igenom hur du utvecklar en IoT Edge-modul. En IoT Edge-modul är en container med körbar kod. Du kan distribuera en eller flera moduler till en IoT Edge enhet. Moduler utför specifika uppgifter som att mata in data från sensorer, rensa och analysera data eller skicka meddelanden till en IoT Hub. Mer information finns i Understand Azure IoT Edge-moduler.

När du utvecklar IoT Edge moduler bör du förstå skillnaden mellan utvecklingsdatorn och målet IoT Edge enhet där modulen distribueras. Containern som du skapar för att lagra modulkoden måste matcha operativsystemet (OS) för målenheten. Det vanligaste scenariot är till exempel att utveckla en modul på en Windows dator för att rikta in sig på en Linux-enhet som kör IoT Edge. I så fall är containeroperativsystemet Linux. När du går igenom den här självstudien bör du tänka på skillnaden mellan operativsystemet för utvecklingsdatorn och containeroperativsystemet.

Tips

Om du använder IoT Edge för Linux på Windows, är målenheten i ditt scenario den virtuella Linux-datorn, inte Windows-värden.

Den här handledningen riktar sig till enheter som kör IoT Edge med Linux-containrar. Använd önskat operativsystem så länge utvecklingsdatorn kör Linux-containrar. Visual Studio Code rekommenderas för att utveckla med Linux-containrar, därför används det i denna handledning. Du kan också använda Visual Studio, även om det finns skillnader i stöd mellan de två verktygen.

I följande tabell visas utvecklingsscenarier som stöds för Linux-containrar i Visual Studio Code och Visual Studio.

Visual Studio Code Visual Studio 2019/2022
Linux-enhetsarkitektur Linux AMD64
Linux ARM32v7
Linux ARM64
Linux AMD64
Linux ARM32
Linux ARM64
Azure-tjänster Azure Functions
Azure Stream Analytics
Azure Machine Learning
Språk C
C#
Java
Node.js
Python
C
C#
Mer information Azure IoT Edge för Visual Studio Code Azure IoT Edge Tools for Visual Studio 2019
Azure IoT Edge Tools for Visual Studio 2022

Installera containermotorn

IoT Edge moduler paketeras som containrar, så du behöver ett Docker-kompatibelt containerhanteringssystem på utvecklingsdatorn för att skapa och hantera dem. Docker Desktop är ett populärt val för utveckling eftersom det har starkt funktionsstöd. Med Docker Desktop på Windows kan du växla mellan Linux-containrar och Windows containrar, så att du kan utveckla moduler för olika typer av IoT Edge enheter.

Använd Docker-dokumentationen för att installera Docker på utvecklingsdatorn:

Konfigurera verktyg

Installera Python-baserade Azure IoT Edge Dev Tool för att skapa din IoT Edge lösning. Du har två alternativ:

Viktigt!

Tillägget Azure IoT Edge för Visual Studio Code är i underhållsläge. Det föredragna utvecklingsverktyget är kommandoradsverktyget (CLI) Azure IoT Edge Dev Tool.

Använd IoT-tilläggen för Visual Studio Code för att utveckla IoT Edge moduler. Dessa tillägg erbjuder projektmallar, automatiserar skapandet av distributionsmanifestet och låter dig övervaka och hantera IoT Edge enheter. I det här avsnittet installerar du Visual Studio Code och IoT-tillägget och konfigurerar sedan ditt Azure-konto för att hantera IoT Hub resurser inifrån Visual Studio Code.

  1. Installera tillägget Azure IoT Edge.
  2. Installera tillägget Azure IoT Hub.
  3. När du har installerat tilläggen öppnar du kommandopaletten genom att välja Visa > kommandopalett.
  4. I kommandopaletten söker du efter och väljer Azure IoT Hub: Välj IoT Hub. Följ anvisningarna för att välja din Azure-prenumeration och IoT Hub.
  5. Öppna explorer-avsnittet i Visual Studio Code genom att välja ikonen i aktivitetsfältet eller genom att välja View > Explorer.
  6. Längst ned i explorer-avsnittet expanderar du den komprimerade menyn Azure IoT Hub/Devices. Du ser de enheter och IoT Edge enheter som är associerade med IoT Hub som du valde via kommandopaletten.

Installera språkspecifika verktyg

Installera verktyg som är specifika för det språk som du utvecklar i:

Skapa ett containerregister

I den här självstudien använder du tilläggen Azure IoT Edge och Azure IoT Hub för att skapa en modul och skapa en containeravbildning från filerna. Sedan skickar du den här avbildningen till ett register som lagrar och hanterar dina avbildningar. Slutligen distribuerar du avbildningen från registret så att den körs på din IoT Edge-enhet.

Viktigt!

Tillägget Azure IoT Edge Visual Studio Code är i maintenance-läge.

Du kan använda valfritt Docker-kompatibelt register för att lagra dina containeravbildningar. Två populära Docker-registertjänster är Azure Container Registry och Docker Hub. I den här självstudien används Azure Container Registry.

Om du inte redan har ett containerregister följer du dessa steg för att skapa ett nytt i Azure:

  1. I portalen Azure väljer du Skapa en resurs>Containers>Container Registry.

  2. Ange följande obligatoriska värden för att skapa containerregistret:

    Fält Värde
    Prenumeration Välj en prenumeration i listrutan.
    Resursgrupp Använd samma resursgrupp för alla testresurser som du skapar under IoT Edge snabbstarter och självstudier, till exempel IoTEdgeResources.
    Registernamn Ange ett unikt namn.
    Plats Välj en plats i närheten av dig.
    artikelnummer (SKU) Välj Grundläggande.
  3. Välj Granska + skapa och sedan Skapa.

  4. Välj ditt nya containerregister från Resources-sektionen på startsidan för Azure-portalen.

  5. I den vänstra rutan i containerregistret väljer du Åtkomstnycklar på menyn under Inställningar.

    Skärmbild av menyplatsen Åtkomstnycklar.

  6. Aktivera administratörsanvändare med växlingsknappen och visa användarnamnetoch lösenordet för containerregistret.

  7. Kopiera värdena för inloggningsserver, användarnamn och lösenord och spara dem någonstans bekvämt. Du använder dessa värden i den här genomgången för att ge åtkomst till containerregistret.

Skapa ett nytt modulprojekt

Tillägget Azure IoT Edge erbjuder projektmallar för alla IoT Edge modulspråk som stöds i Visual Studio Code. Dessa mallar innehåller alla filer och kod som du behöver för att distribuera en arbetsmodul för att testa IoT Edge, eller ge dig en startpunkt för att anpassa mallen med din egen affärslogik.

Skapa en projektmall

IoT Edge Dev Tool förenklar Azure IoT Edge utveckling med kommandon som drivs av miljövariabler. Det hjälper dig att komma igång med IoT Edge utveckling med hjälp av IoT Edge Dev Container och IoT Edge lösningsställningar som innehåller en standardmodul och alla nödvändiga konfigurationsfiler.

  1. Skapa en katalog för din lösning på önskad sökväg. Ändra till din iotedgesolution katalog.

    mkdir c:\dev\iotedgesolution
    cd c:\dev\iotedgesolution
    
  2. Använd kommandot iotedgedev solution init för att skapa en lösning och konfigurera din Azure IoT Hub på det utvecklingsspråk som du väljer:

    iotedgedev solution init --template csharp
    

Kommandot iotedgedev solution init uppmanar dig att utföra flera steg, bland annat:

  • Autentisera till Azure
  • Välj en Azure prenumeration
  • Välj eller skapa en resursgrupp
  • Välj eller skapa en Azure IoT Hub
  • Välj eller skapa en Azure IoT Edge enhet

Använd Visual Studio Code och tillägget Azure IoT Edge. Börja med att skapa en lösning och generera sedan den första modulen i den lösningen. Varje lösning kan innehålla flera moduler.

  1. Välj Visa > kommandopalett.
  2. I kommandopaletten anger och kör du kommandot Azure IoT Edge: New IoT Edge Solution.
  3. Bläddra till mappen där du vill skapa den nya lösningen och välj sedan Välj mapp.
  4. Ange ett namn på lösningen.
  5. Välj en modulmall för det utvecklingsspråk som du föredrar som den första modulen i lösningen.
  6. Ange ett namn för modulen. Välj ett namn som är unikt i containerregistret.
  7. Ange namnet på modulens avbildningslagringsplats. Visual Studio Code fyller i modulnamnet automatiskt med localhost:5000/<din modulnamn>. Ersätt den med din egen registerinformation. Använd localhost om du använder ett lokalt Docker-register för testning. Om du använder Azure Container Registry använder du Login server från registrets inställningar. Inloggningsservern ser ut som <registernamn.azurecr.io>. Ersätt endast localhost:5000-delen av strängen så att slutresultatet ser ut som <registernamn.azurecr.io/><därt modulnamn>.

Visual Studio Code tar den information du angav, skapar en IoT Edge lösning och läser sedan in den i ett nytt fönster.

När du har skapat lösningen finns dessa huvudfiler i lösningen:

  • Mappen .vscode innehåller konfigurationsfilen launch.json.

  • Modulmappen har undermappar för varje modul. I varje undermapp styr module.json-filen hur moduler skapas och distribueras.

  • I .env-filen visas dina miljövariabler. Miljövariabeln för containerregistret är localhost:5000 som standard.

  • Två moduldistributionsfiler, deployment.template.json och deployment.debug.template.json, listar modulerna som ska distribueras till enheten. Som standard innehåller listan IoT Edge systemmoduler (edgeAgent och edgeHub) och exempelmoduler som:

    Anmärkning

    De exakta moduler som installeras kan bero på vilket språk du väljer.

Ange IoT Edge körningsversion

Den senaste stabila IoT Edge systemmodulversionen är 1.5. Ställ in systemmodulerna på version 1.5.

  1. Öppna manifestfilen deployment.template.json i Visual Studio Code. distributionsmanifestet är ett JSON-dokument som beskriver modulerna som ska konfigureras på målenheten IoT Edge.

  2. Ändra körningsversionen för systemkörningsmodulavbildningarna edgeAgent och edgeHub. Om du till exempel vill använda IoT Edge körningsversion 1.5 ändrar du följande rader i distributionsmanifestfilen:

    "systemModules": {
        "edgeAgent": {
    
            "image": "mcr.microsoft.com/azureiotedge-agent:1.5",
    
        "edgeHub": {
    
            "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
    

Ange dina registerautentiseringsuppgifter för IoT Edge-agenten

Miljöfilen lagrar autentiseringsuppgifterna för containerregistret och delar dem med IoT Edge-körtid. Runtime-systemet behöver dessa autentiseringsuppgifter för att hämta containeravbildningarna till IoT Edge-enheten.

Tillägget IoT Edge försöker hämta dina autentiseringsuppgifter för containerregistret från Azure och fylla i dem i miljöfilen.

Anmärkning

Miljöfilen skapas bara om du tillhandahåller en avbildningslagringsplats för modulen. Om du accepterade localhost-standardinställningarna för att testa och felsöka lokalt behöver du inte deklarera miljövariabler.

Kontrollera om dina autentiseringsuppgifter finns. Om inte lägger du till dem nu:

  1. Om Azure Container Registry är ditt register anger du ett Azure Container Registry användarnamn och lösenord. Hämta dessa värden från containerregistrets Settings>Access-nycklar-menyn i Azure portalen.

  2. Öppna .env-filen i modullösningen.

  3. Lägg till värdena username och password som du kopierade från ditt Azure containerregister. Till exempel:

    CONTAINER_REGISTRY_SERVER="myacr.azurecr.io"
    CONTAINER_REGISTRY_USERNAME="myacr"
    CONTAINER_REGISTRY_PASSWORD="<registry_password>"
    
  4. Spara ändringarna i .env-filen .

Anmärkning

I den här självstudien används administratörsautentiseringsuppgifter för Azure Container Registry som är praktiska för utvecklings- och testscenarier. När du är redo för produktionsscenarier rekommenderar vi ett alternativ för minst privilegierad autentisering som tjänstens huvudnamn eller token med lagringsplatsomfattning. Mer information finns i Hantera åtkomst till containerregistret.

Målarkitektur

Välj den arkitektur som du riktar in dig på med varje lösning, eftersom det påverkar hur containern skapas och körs. Standardvärdet är Linux AMD64. I den här självstudien använder du en virtuell Ubuntu-dator som IoT Edge enhet och behåller standardvärdet amd64.

Följ dessa steg om du behöver ändra målarkitekturen för din lösning.

  1. Öppna kommandopaletten och sök efter Azure IoT Edge: Ange Standardmålplattform för Edge-lösning eller välj genvägsikonen i sidofältet längst ned i fönstret.
  2. I kommandopaletten väljer du målarkitekturen i listan med alternativ.

Målarkitekturen anges när du skapar containeravbildningen i ett senare steg.

Uppdatera modulen med anpassad kod

Varje mall innehåller exempelkod som tar simulerade sensordata från modulen SimulatedTemperatureSensor och dirigerar dem till IoT Hub. Exempelmodulen tar emot meddelanden och skickar dem vidare. Pipelinefunktionen visar ett viktigt begrepp i IoT Edge: hur moduler kommunicerar med varandra.

Varje modul kan ha flera indata- och utdataköer deklarerade i sin kod. Den IoT Edge hubb som körs på enheten dirigerar meddelanden från utdata från en modul till indata från en eller flera moduler. Den specifika koden för att deklarera indata och utdata varierar mellan språk, men konceptet är detsamma för alla moduler. Mer information om routning mellan moduler finns i Deklarera vägar.

C#-exempelkoden som medföljer projektmallen använder klassen ModuleClient från IoT Hub SDK för .NET.

  1. I Visual Studio Codes utforskare öppnar du modules > filtermodule > ModuleBackgroundService.cs.

  2. Innan namnområdet lägger du till tre filtermodule satser för typer som används senare:

    using System.Collections.Generic;     // For KeyValuePair<>
    using Microsoft.Azure.Devices.Shared; // For TwinCollection
    using Newtonsoft.Json;                // For JsonConvert
    
  3. Lägg till variabeln temperatureThreshold i ModuleBackgroundService klassen. Den här variabeln anger det värde som den uppmätta temperaturen måste överskrida för att data ska skickas till IoT Hub.

    static int temperatureThreshold { get; set; } = 25;
    
  4. Lägg till klasserna MessageBody, Machineoch Ambient . Dessa klasser definierar det förväntade schemat för brödtexten i inkommande meddelanden.

    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;}
    }
    
  5. Hitta ExecuteAsync-funktionen. Den här funktionen skapar och konfigurerar ett ModuleClient-objekt som gör att modulen kan ansluta till den lokala Azure IoT Edge-körningen för att skicka och ta emot meddelanden. Efter att ModuleClient har skapats, läser temperatureThreshold koden värdet från den önskade egenskapen hos module twin. Koden registrerar ett återanrop för att ta emot meddelanden från en IoT Edge hubb via en slutpunkt med namnet input1.

    Ersätt anropet ProcessMessageAsync till metoden med en ny som uppdaterar namnet på slutpunkten och metoden som anropas när indata kommer. Lägg också till en SetDesiredPropertyUpdateCallbackAsync metod för uppdateringar av önskade egenskaper. Om du vill göra den här ändringen ersätter du den sista raden i ExecuteAsync metoden med följande kod:

    // 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);
    
  6. OnDesiredPropertiesUpdate Lägg till metoden i ModuleBackgroundService klassen. Den här metoden tar emot uppdateringar av önskade egenskaper från modultvillingen och uppdaterar variabeln så att den temperatureThreshold matchar. Alla moduler har en egen modultvilling, vilket innebär att du kan konfigurera den kod som körs i en modul direkt från molnet.

    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;
    }
    
  7. FilterMessages Lägg till metoden. Den här metoden anropas när modulen tar emot ett meddelande från IoT Edge hubben. Den filtrerar ut meddelanden som rapporterar temperaturer under temperaturtröskelvärdet som angetts via modultvillingen. Den lägger också till egenskapen MessageType i meddelandet med värdet inställt på Alert.

    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;
        }
    }
    
  8. Spara filen ModuleBackgroundService.cs .

  9. I Visual Studio Code-explorern öppnar du filen deployment.template.json i din IoT Edge-lösnings arbetsyta.

  10. Eftersom vi har ändrat namnet på slutpunkten som modulen lyssnar på måste vi också uppdatera vägarna i distributionsmanifestet så att edgeHub skickar meddelanden till den nya slutpunkten.

    Leta reda på avsnittet routes i modultvillingen $edgeHub . sensorTofiltermodule Uppdatera vägen för att ersätta input1 med inputFromSensor:

    "sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"
    
  11. Lägg till modultvillingen filtermodul i distributionsmanifestet. Infoga följande JSON-innehåll längst ned i modulesContent avsnittet efter $edgeHub modultvilling:

       "filtermodule": {
           "properties.desired":{
               "TemperatureThreshold":25
           }
       }
    
  12. Spara filen deployment.template.json.

Skapa och ladda upp din lösning

Du har uppdaterat modulkoden och distributionsmallen för att förstå några viktiga distributionsbegrepp. Nu är du redo att skapa din modulcontaineravbildning och skicka den till containerregistret.

Öppna manifestfilen deployment.template.json i Visual Studio Code. Manifestet deployment beskriver de moduler som ska konfigureras på målenheten IoT Edge. Innan distributionen måste du uppdatera dina Azure Container Registry-autentiseringsuppgifter och dina modulbilder med rätt createOptions värden. Mer information om createOptions värden finns i Så här konfigurerar du alternativ för att skapa containrar för IoT Edge moduler.

Om du använder en Azure Container Registry för att lagra modulbilden lägger du till dina autentiseringsuppgifter i avsnittet modulesContent > edgeAgent > settings > registryCredentials i deployment.template.json. Ersätt myacr med ditt eget registernamn och ange lösenordet och inloggningsserveradressen. Till exempel:

"registryCredentials": {
    "myacr": {
        "username": "myacr",
        "password": "<your_acr_password>",
        "address": "myacr.azurecr.io"
    }
}

Lägg till eller ersätt följande stränginnehåll till createOptions-värdet för varje system (edgeHub och edgeAgent) och anpassad modul (filtermodul och tempSensor) som anges i listan. Ändra värdena om det behövs:

"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"

Konfigurationen filtermodule bör till exempel likna:

"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-avbildning för byggmodul

Öppna den Visual Studio Code integrerade terminalen genom att välja Terminal > Ny terminal.

dotnet publish Använd kommandot för att skapa containeravbildningen för Linux- och amd64-arkitekturen. Ändra katalogen till filtermodule-katalogen i projektet och kör dotnet publish kommandot .

dotnet publish --os linux --arch x64 /t:PublishContainer

Just nu riktar iotedgedev-verktygsmallen in sig på .NET 7.0, som nådde slutet av supporten i maj 2024. Uppdatera projektet till .NET 8.0 (LTS, som stöds till och med november 2026) genom att redigera filen filtermodule.csproj och ändra värdena TargetFramework och PackageReference. Filen filtermodule.csproj bör se ut så här:

<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>

Tagga docker-avbildningen med information, version och arkitektur för containerregistret. Ersätt myacr med ditt eget registernamn:

docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.1-amd64

Push-modul Docker image

Ange dina autentiseringsuppgifter för containerregistret till Docker så att den kan skicka containeravbildningen till lagring i registret.

  1. Logga in på Docker med autentiseringsuppgifterna Azure Container Registry (ACR):

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    Du kan få en säkerhetsvarning som rekommenderar användning av --password-stdin. Även om det är en rekommenderad metod för produktionsscenarier är det utanför omfånget för den här självstudien. För autentisering med produktionscontainerregister använder du ett tjänsthuvudnamn eller lagringsplatsomfattningstoken i stället för administratörsautentiseringsuppgifter. Mer information finns i Hantera åtkomst till containerregistret och docker-inloggningsreferensen .

  2. Logga in på Azure Container Registry. Du måste installera Azure CLI för att kunna använda kommandot az. Det här kommandot frågar efter ditt användarnamn och lösenord som finns i containerregistret i Inställningar > Åtkomstnycklar:

    az acr login -n <ACR registry name>
    

    Tips

    Om du är utloggad någon gång i den här självstudien upprepar du docker- och Azure Container Registry inloggningsstegen för att fortsätta.

  3. Skicka modulavbildningen till det lokala registret eller ett containerregister:

    docker push <ImageName>
    

    Till exempel:

    # 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
    

Uppdatera distributionsmallen

Uppdatera distributionsmallen deployment.template.json med containerregistrets avbildningsplats. Om du till exempel använder en Azure Container Registry myacr.azurecr.io och avbildningen är filtermodule:0.0.1-amd64 uppdaterar du konfigurationen filtermodule till:

"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\"}]}}}"
    }
}

I Visual Studio Code explorer högerklickar du på filen deployment.template.json och väljer Build och Push IoT Edge Solution.

Kommandot build och push startar tre åtgärder. Först skapar den en ny mapp i lösningen med namnet config som innehåller det fullständiga distributionsmanifestet, inbyggt med information i distributionsmallen och andra lösningsfiler. För det andra kör docker build för att skapa containeravbildningen baserat på korrekt dockerfile för din målarkitektur. Sedan körs docker push för att överföra avbildningen till ditt containerregister.

Den här processen kan ta flera minuter första gången, men det går snabbare nästa gång du kör kommandona.

Valfritt: Uppdatera modulen och avbildningen

Om du gör ändringar i modulkoden måste du återskapa och skicka modulavbildningen till containerregistret. Följ stegen i det här avsnittet för att uppdatera bygg- och containeravbildningen. Du kan hoppa över det här avsnittet om du inte har ändrat modulkoden.

Öppna filen deployment.amd64.json i den nyligen skapade konfigurationsmappen. Filnamnet återspeglar målarkitekturen, så det är annorlunda om du väljer en annan arkitektur.

Observera att de två parametrarna som hade platshållare nu innehåller rätt värden. I registryCredentials avsnittet hämtas ditt registeranvändarnamn och lösenord från .env-filen . filtermodule har det fullständiga avbildningslagringsplatsen med namn-, versions- och arkitekturetiketter från module.json-filen.

  1. Öppna filen module.json i mappen filtermodule .

  2. Ändra versionsnumret för modulbilden. Öka till exempel versionsnumret för korrigeringen till "version": "0.0.2" som om du gjorde en liten korrigering i modulkoden.

    Tips

    Modulversioner aktiverar versionskontroll och gör att du kan testa ändringar på en liten uppsättning enheter innan du distribuerar uppdateringar till produktion. Om du inte ökar modulversionen innan du skapar och push-överför den skriver du över lagringsplatsen i containerregistret.

  3. Spara ändringarna i filen module.json .

Skapa och pusha den uppdaterade avbildningen med versionstaggen 0.0.2. Om du till exempel vill skapa och push-överföra avbildningen för det lokala registret eller ett Azure containerregister använder du följande kommandon:

# 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

Högerklicka på filen deployment.template.json igen och välj Build och Push IoT Edge Solution igen.

Öppna filen deployment.amd64.json igen. Observera att byggsystemet inte skapar en ny fil när du kör kommandot build och push igen. I stället uppdateras samma fil för att återspegla ändringarna. Filtermodulavbildningen pekar nu på 0.0.2-versionen av containern.

Om du vill kontrollera vad kommandot build och push gjorde går du till Azure-portalen och går till containerregistret. I ditt containerregister väljer du Lagringsplatser och sedan filtermodul. Kontrollera att båda versionerna av avbildningen skickas till registret.

Skärmbild av var du kan visa båda avbildningsversionerna i containerregistret.

Felsöka

Om du får fel när du skapar och push-överför modulens avbildning har det ofta att göra med Docker-konfigurationen på utvecklingsdatorn. Använd följande kontroller för att granska konfigurationen:

  • Körde du docker login kommandot med de autentiseringsuppgifter som du kopierade från containerregistret? Dessa autentiseringsuppgifter skiljer sig från de som du använder för att logga in på Azure.
  • Är ditt containerarkiv korrekt? Har den ditt rätta containerregisternamn och ditt rätta modulnamn? Öppna filen module.json i mappen filtermodule för att kontrollera. Lagringsplatsens värde bör likna <registernamnet.azurecr.io/filtermodule>.
  • Om du använde ett annat namn än filtermodulen för modulen, är namnet konsekvent i hela lösningen?
  • Kör datorn samma typ av containrar som du skapar? Den här guiden gäller för Linux IoT Edge-enheter, så Visual Studio Code ska visa amd64 eller arm32v7 i sidofältet och Docker Desktop ska köra Linux-containrar.

Distribuera moduler till enheten

Du har kontrollerat att det finns byggda containerbilder som är lagrade i ditt containerregister, så det är dags att distribuera dem till en enhet. Kontrollera att din IoT Edge enheten är igång.

Använd kommandot IoT Edge Azure CLI set-modules för att distribuera modulerna till Azure IoT Hub. Om du till exempel vill distribuera modulerna som definierats i filen deployment.template.json till filen IoT Hub my-iot-hub för IoT Edge enheten my-device använder du följande kommando. Ersätt värdena hub-name, device-id och login IoT Hub connection string med dina egna.

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>"

Tips

Hitta din IoT Hub connection string, inklusive nyckeln för delad åtkomst, i Azure portalen. Gå till din IoT Hub och välj Säkerhetsinställningar > Principer för delad åtkomst > iothubowner.

  1. I Visual Studio Code explorer går du till avsnittet Azure IoT Hub och expanderar Enheter för att se din lista över IoT-enheter.

  2. Högerklicka på den IoT Edge enhet som du vill distribuera till och välj sedan Skapa distribution för enskild enhet.

  3. I utforskaren navigerar du till mappen config och väljer sedan filen deployment.amd64.json .

    Använd inte filen deployment.template.json, som inte har autentiseringsuppgifterna för containerregistret eller modulavbildningsvärdena i den. Om du riktar in dig på en Linux ARM32-enhet är distributionsmanifestets namn deployment.arm32v7.json.

  4. Under enheten expanderar du Moduler för att se en lista över distribuerade och körande moduler. Välj uppdateringsknappen. Du bör se de nya tempSensor- och filtermodul-modulerna som körs på din enhet.

    Det kan ta några minuter innan modulerna startas. IoT Edge-körningen tar emot sitt nya distributionsmanifest, hämtar modulavbildningarna från containerkörningen och startar sedan varje ny modul.

Visa meddelanden från enheten

Exempelmodulkoden hämtar meddelanden via indatakön och skickar dem via utdatakön. Distributionsmanifestet konfigurerar vägar som skickar meddelanden till filtermodule från tempSensor och vidarebefordrar sedan meddelanden från filtermodule till IoT Hub. Med tilläggen Azure IoT Edge och Azure IoT Hub kan du se meddelanden när de kommer fram till IoT Hub från enheten.

  1. I Visual Studio Code explorer väljer du den IoT Edge enhet som du vill övervaka och väljer sedan Start Monitoring Built-in Event Endpoint.

  2. Titta på utdatafönstret i Visual Studio Code för att se meddelanden som kommer till din IoT Hub.

    Skärmbild av utdatafönstret Visual Studio Code som visar inkommande meddelanden från enhet till molnet.

Visa ändringar på enheten

Om du vill se vad som händer på enheten använder du kommandona i det här avsnittet för att inspektera IoT Edge körning och moduler som körs på enheten.

Dessa kommandon gäller för din IoT Edge enhet, inte för utvecklingsdatorn. Om du använder en virtuell dator för din IoT Edge enhet ansluter du till den nu. I Azure går du till översiktssidan för den virtuella datorn och väljer Anslut för att få åtkomst till den säkra shell-anslutningen.

  • Visa alla moduler som distribuerats till enheten och kontrollera deras status:

    iotedge list
    

    Du ser fyra moduler: de två IoT Edge runtime-modulerna, tempSensor och filtermodule. Alla fyra ska vara listade som igång.

  • Granska loggarna för en specifik modul:

    iotedge logs <module name>
    

    Modulnamn är skiftlägeskänsliga.

    TempSensor- och filtermodulloggarna visar de meddelanden som de bearbetar. EdgeAgent-modulen startar de andra modulerna, så loggarna innehåller information om distributionsmanifestet. Om en modul inte visas eller inte körs kontrollerar du om det finns fel i edgeAgent-loggarna. Modulen edgeHub hanterar kommunikationen mellan modulerna och IoT Hub. Om modulerna körs men meddelandena inte kommer till din IoT Hub kontrollerar du loggarna för edgeHub efter fel.

Rensa resurser

Om du vill fortsätta till nästa rekommenderade artikel behåller du de resurser och konfigurationer som du skapade och återanvänder dem. Du kan också fortsätta att använda samma IoT Edge enhet som en testenhet. Annars tar du bort den lokala konfigurationen och de Azure resurser som du använde i den här artikeln för att undvika avgifter.

Ta bort Azure resurser

Du kan inte ångra borttagning av Azure resurser och resursgrupper. Var noga så att du inte tar bort fel resursgrupp eller resurser av misstag. Om du har skapat IoT Hub i en befintlig resursgrupp som innehåller resurser som du vill behålla tar du bara bort själva IoT Hub resursen, inte resursgruppen.

Ta bort resurser:

  1. Logga in på portalen Azure och välj sedan Resource-grupper.
  2. Välj namnet på resursgruppen som innehåller dina IoT Edge testresurser.
  3. Granska listan över resurser som resursgruppen innehåller. Om du vill ta bort alla kan du välja Ta bort resursgrupp. Om du bara vill ta bort några av dem väljer du varje resurs för att ta bort dem individuellt.

Nästa steg

I den här självstudien konfigurerar du Visual Studio Code på utvecklingsdatorn och distribuerar din första IoT Edge-modul med kod som filtrerar rådata som genereras av din IoT Edge enhet.

Fortsätt till nästa handledningar för att lära dig hur Azure IoT Edge låter dig distribuera Azure molntjänster för att bearbeta och analysera data vid nätverksgränsen.