Självstudie: Utveckla IoT Edge-moduler med Linux-containrar med IoT Edge för Linux i Windows

Gäller för:Bockmarkering för IoT Edge 1.4 IoT Edge 1.4

Viktigt!

IoT Edge 1.5 LTS och IoT Edge 1.4 stöds. IoT Edge 1.4 LTS upphör den 12 november 2024. Om du har en tidigare version läser du Uppdatera IoT Edge.

I den här självstudien går vi igenom hur du utvecklar, felsöker och distribuerar din egen kod till en IoT Edge-enhet med IoT Edge för Linux i Windows och Visual Studio 2022. Du får lära dig det vanligaste utvecklarscenariot för IoT Edge-lösningar genom att distribuera en C#-modul till en Linux-enhet. Du distribuerar och felsöker en anpassad Azure IoT Edge-modul som körs i en Linux-container i Windows (EFLOW). Även om du planerar att använda ett annat språk eller distribuera en Azure-tjänst är den här självstudien fortfarande användbar för att lära dig mer om utvecklingsverktygen och begreppen.

Den här artikeln innehåller steg för två IoT Edge-utvecklingsverktyg:

  • Kommandoradsgränssnitt (CLI) är det bästa verktyget för utveckling.
  • Azure IoT Edge-verktyg för Visual Studio-tillägget . Tillägget ä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 verktygsversionen.

I den här självstudien lär du dig att:

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

Förutsättningar

Den här artikeln förutsätter att du använder en dator som kör Windows som utvecklingsdator. På Windows-datorer kan du utveckla windows- eller Linux-moduler. Den här självstudien vägleder dig genom utvecklingen av Linux-containrar med IoT Edge för Linux i Windows för att skapa och distribuera modulerna.

När Visual Studio 2022 är klar behöver du även följande verktyg och komponenter:

  • Ladda ned och installera Azure IoT Edge-verktyg från Visual Studio Marketplace. Du kan använda Azure IoT Edge Tools-tillägget för att skapa och skapa din IoT Edge-lösning. Det föredragna utvecklingsverktyget är kommandoradsverktyget (CLI) Azure IoT Edge Dev Tool. Tillägget innehåller Azure IoT Edge-projektmallarna som används för att skapa Visual Studio-projektet. För närvarande behöver du tillägget installerat oavsett vilket utvecklingsverktyg du använder.

    Viktigt!

    Azure IoT Edge Tools for VS 2022-tillägget är i underhållsläge. Det föredragna utvecklingsverktyget är kommandoradsverktyget (CLI) Azure IoT Edge Dev Tool.

    Dricks

    Om du använder Visual Studio 2019 laddar du ned och installerar Azure IoT Edge Tools för VS 2019 från Visual Studio Marketplace.

Molnresurser:

Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.

Nyckelbegrepp

Den här självstudien går igenom utvecklingen av en IoT Edge-modul. En IoT Edge-modul, eller ibland bara modul för kort, ä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-hubb. Mer information finns i Förstå Azure IoT Edge-moduler.

När du utvecklar IoT Edge-moduler är det viktigt att förstå skillnaden mellan utvecklingsdatorn och mål-IoT Edge-enheten där modulen så småningom 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 någon utvecklar en modul på en Windows-dator som tänker rikta in sig på en Linux-enhet som kör IoT Edge. I så fall skulle containeroperativsystemet vara 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. I den här självstudien använder du din Windows-värd för utveckling och den virtuella datorn IoT Edge för Linux på Windows (EFLOW) för att skapa och distribuera modulerna.

Den här självstudien riktar sig till enheter som kör IoT Edge med Linux-containrar. Du kan använda önskat operativsystem så länge utvecklingsdatorn kör Linux-containrar. Vi rekommenderar att du använder Visual Studio för att utveckla med Linux-containrar, så det är vad den här självstudien använder. Du kan också använda Visual Studio Code, även om det finns skillnader i stöd mellan de två verktygen. Mer information finns i Utveckla Azure IoT Edge-moduler med Visual Studio Code.

Konfigurera docker-cli- och Docker-motorns fjärranslutning

IoT Edge-moduler paketeras som containrar, så du behöver en containermotor på utvecklingsdatorn för att skapa och hantera dem. Den virtuella EFLOW-datorn innehåller redan en instans av Docker-motorn, så den här självstudien visar hur du fjärransluter från Windows-utvecklardatorn till Docker-instansen för den virtuella EFLOW-datorn. Med detta tar vi bort beroendet av Docker Desktop för Windows.

Det första steget är att konfigurera docker-cli på Windows-utvecklingsdatorn för att kunna ansluta till den fjärranslutna Docker-motorn.

  1. Ladda ned den förkompilerade docker.exe versionen av docker-cli från docker-cli Chocolatey. Du kan också ladda ned det officiella cli-projektet från Docker/cli GitHub och kompilera det enligt lagringsplatsens instruktioner.
  2. Extrahera docker.exe till en katalog på utvecklingsdatorn. Till exempel C:\Docker\bin
  3. Öppna Om datorn –>Systeminformation –> Avancerade systeminställningar
  4. Välj Avancerade miljövariabler> –> Under Användarvariabler kontrollerar du Sökväg
  5. Redigera sökvägsvariabeln och lägg till platsen för docker.exe
  6. Öppna en upphöjd PowerShell-session
  7. Kontrollera att Docker CLI är tillgängligt med kommandot
    docker --version
    

Om allt har konfigurerats bör det tidigare kommandot mata ut docker-versionen, ungefär som Docker version 20.10.12, build e91ed57.

Det andra steget är att konfigurera den virtuella EFLOW-datorns Docker-motor för att acceptera externa anslutningar och lägga till lämpliga brandväggsregler.

Varning

Att exponera Docker-motorn för externa anslutningar kan öka säkerhetsriskerna. Den här konfigurationen bör endast användas i utvecklingssyfte. Se till att återställa konfigurationen till standardinställningarna när utvecklingen är klar.

  1. Öppna en upphöjd PowerShell-session och kör följande kommandon

    # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    
    # Create a copy of the EFLOW VM _docker.service_ in the system folder.
    Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    
    # Replace the service execution line to listen for external connections.
    Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g'  /etc/systemd/system/docker.service"
    
    # Reload the EFLOW VM services configurations.
    Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    
    # Reload the Docker engine service.
    Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    
    # Check that the Docker engine is listening to external connections.
    Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    

    Följande är exempelutdata.

    PS C:\> # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    PS C:\> Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    PS C:\>
    PS C:\> # Create a copy of the EFLOW VM docker.service in the system folder.
    PS C:\> Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Replace the service execution line to listen for external connections.
    PS C:\> Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g' /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Reload the EFLOW VM services configurations.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    PS C:\>
    PS C:\> # Reload the Docker engine service.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    PS C:\>
    PS C:\> # Check that the Docker engine is listening to external connections.
    PS C:\> Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    tcp6       0      0 :::2375                 :::*                    LISTEN      2790/dockerd
    
  2. Det sista steget är att testa Docker-anslutningen till Docker-motorn för den virtuella EFLOW-datorn. Först behöver du IP-adressen för den virtuella EFLOW-datorn.

    Get-EflowVmAddr
    

    Dricks

    Om den virtuella EFLOW-datorn distribuerades utan statisk IP-adress kan IP-adressen ändras mellan omstarter av Windows-värdoperativsystemet eller nätverksändringar. Kontrollera att du använder rätt IP-adress för den virtuella EFLOW-datorn varje gång du vill upprätta en fjärransluten Docker-motoranslutning.

    Följande är exempelutdata.

    PS C:\> Get-EflowVmAddr
    [03/15/2022 15:22:30] Querying IP and MAC addresses from virtual machine (DESKTOP-J1842A1-EFLOW)
     - Virtual machine MAC: 00:15:5d:6f:da:78
     - Virtual machine IP : 172.31.24.105 retrieved directly from virtual machine
    00:15:5d:6f:da:78
    172.31.24.105 
    
  3. Använd den erhållna IP-adressen, anslut till Docker-motorn för den virtuella EFLOW-datorn och kör Hello-World-exempelcontainern. Ersätt <EFLOW-VM-IP> med IP-adressen för den virtuella EFLOW-datorn som hämtades i föregående steg.

    docker -H tcp://<EFLOW-VM-IP>:2375 run --rm hello-world
    

    Du bör se att containern laddas ned och efter kommer att köras och mata ut följande.

    PS C:\> docker -H tcp://172.31.24.105:2375 run --rm hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    2db29710123e: Pull complete
    Digest: sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

Skapa ett Azure IoT Edge-projekt

IoT Edge-projektmallen i Visual Studio skapar en lösning som kan distribueras till IoT Edge-enheter. Först skapar du en Azure IoT Edge-lösning och sedan genererar du den första modulen i den lösningen. Varje IoT Edge-lösning kan innehålla mer än en modul.

Viktigt!

IoT Edge-projektstrukturen som skapats av Visual Studio är inte samma som den i Visual Studio Code.

För närvarande stöder Inte Azure IoT Edge Dev Tool CLI att skapa Visual Studio-projekttypen. Du måste använda Visual Studio IoT Edge-tillägget för att skapa Visual Studio-projektet.

  1. Skapa ett nytt projekt i Visual Studio.

  2. På sidan Skapa ett nytt projekt söker du efter Azure IoT Edge. Välj det projekt som matchar plattformen (Linux IoT Edge-modulen) och arkitekturen för din IoT Edge-enhet och välj Nästa.

  3. På sidan Konfigurera det nya projektet anger du ett namn för projektet och anger platsen och väljer sedan Skapa.

  4. I fönstret Lägg till modul väljer du den typ av modul som du vill utveckla. Du kan också välja Befintlig modul för att lägga till en befintlig IoT Edge-modul i distributionen. Ange modulnamnet och modulens avbildningslagringsplats.

  5. I Url för lagringsplats anger du namnet på modulens avbildningslagringsplats. Visual Studio fyller automatiskt i modulnamnet med localhost:5000/<ditt 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 inloggningsservern 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.>

  6. Välj Lägg till för att lägga till modulen i projektet.

    Skärmbild av hur du lägger till ett program och en modul i Visual Studio-lösningen

    Kommentar

    Om du har ett befintligt IoT Edge-projekt kan du ändra lagringsplatsens URL genom att öppna filen module.json . Lagringsplatsens URL finns i lagringsplatsens egenskap för JSON-filen.

Nu har du ett IoT Edge-projekt och en IoT Edge-modul i din Visual Studio-lösning.

Projektstruktur

I din lösning finns det två mappar på projektnivå, inklusive en huvudprojektmapp och en enda modulmapp. Du kan till exempel ha en huvudprojektmapp med namnet AzureIotEdgeApp1 och en modulmapp med namnet IotEdgeModule1. Huvudprojektmappen innehåller distributionsmanifestet.

Modulmappen innehåller en fil för modulkoden med namnet antingen Program.cs eller main.c beroende på vilket språk du har valt. Den här mappen innehåller också en fil med namnet module.json som beskriver metadata för din modul. Olika Docker-filer innehåller den information som behövs för att skapa din modul som en Windows- eller Linux-container.

Distributionsmanifest för projektet

Distributionsmanifestet som du redigerar heter deployment.debug.template.json. Den här filen är en mall för ett IoT Edge-distributionsmanifest som definierar alla moduler som körs på en enhet tillsammans med hur de kommunicerar med varandra. Mer information om distributionsmanifest finns i Lär dig hur du distribuerar moduler och upprättar vägar.

Om du öppnar den här distributionsmallen ser du att de två runtime-modulerna, edgeAgent och edgeHub ingår, tillsammans med den anpassade modul som du skapade i det här Visual Studio-projektet. En fjärde modul med namnet SimulatedTemperatureSensor ingår också. Den här standardmodulen genererar simulerade data som du kan använda för att testa dina moduler eller ta bort om det inte behövs. Om du vill se hur den simulerade temperatursensorn fungerar kan du visa källkoden SimulatedTemperatureSensor.csproj.

Ange IoT Edge-körningsversion

För närvarande är den senaste stabila körningsversionen 1.4. Du bör uppdatera IoT Edge-körningsversionen till den senaste stabila versionen eller den version som du vill rikta in dig på för dina enheter.

  1. Högerklicka på namnet på huvudprojektet i Solution Explorer och välj Ange IoT Edge-körningsversion.

    Skärmbild av hur du hittar och väljer menyalternativet med namnet

  2. Använd den nedrullningsbara menyn för att välja den körningsversion som dina IoT Edge-enheter kör och välj sedan OK för att spara ändringarna. Om ingen ändring har gjorts väljer du Avbryt för att avsluta.

    Tillägget innehåller för närvarande inte något val för de senaste körningsversionerna. Om du vill ange körningsversionen högre än 1.2 öppnar du deployment.debug.template.json distributionsmanifestfil. Ändra körningsversionen för systemkörningsmodulens avbildningar edgeAgent och edgeHub. Om du till exempel vill använda IoT Edge-körningsversionen 1.4 ändrar du följande rader i distributionsmanifestfilen:

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.4"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
       //...
    
  3. Om du har ändrat versionen återskapar du distributionsmanifestet genom att högerklicka på namnet på projektet och välja Generera distribution för IoT Edge. Detta genererar ett distributionsmanifest baserat på distributionsmallen och visas i konfigurationsmappen för ditt Visual Studio-projekt.

  1. Öppna deployment.debug.template.json distributionsmanifestfil. Distributionsmanifestet är ett JSON-dokument som beskriver de moduler som ska konfigureras på den riktade IoT Edge-enheten.

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

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

Konfigurera Visual Studio 2022 remote Docker-motorinstans

Använd Azure IoT Edge-verktygstillägget och konfigurera det för att använda den fjärranslutna Docker-motorn som körs på den virtuella EFLOW-datorn.

  1. Välj Verktyg –> Azure IoT Edge-verktyg –> Inställningar för IoT Edge-verktyg...

  2. Ersätt värdet DOCKER_HOST localhost med IP-adressen för den virtuella EFLOW-datorn. Om du inte kommer ihåg IP-adressen använder du EFLOW PowerShell-cmdleten Get-EflowVmAddr för att hämta den. Om den virtuella EFLOW-datorns IP-adress för exmaple är 172.20.1.100 ska det nya värdet vara tcp://172.20.1.100:2375.

    Skärmbild av inställningar för IoT Edge-verktyg

  3. Välj OK.

Utveckla din modul

När du lägger till en ny modul levereras den med standardkod som är redo att skapas och distribueras till en enhet så att du kan börja testa utan att röra någon kod. Modulkoden finns i modulmappen i en fil med namnet Program.cs (för C#) eller main.c (för C).

Standardlösningen skapas så att simulerade data från modulen SimulatedTemperatureSensor dirigeras till din modul, som tar indata och sedan skickar dem till IoT Hub.

När du är redo att anpassa modulmallen med din egen kod använder du SDK:erna för Azure IoT Hub för att skapa andra moduler som uppfyller nyckelbehoven för IoT-lösningar som säkerhet, enhetshantering och tillförlitlighet.

Skapa och push-överföra en enskild modul

Vanligtvis vill du testa och felsöka varje modul innan du kör den i en hel lösning med flera moduler. Eftersom lösningen kommer att skapas eller felsökas med hjälp av Docker-motorn som körs i den virtuella EFLOW-datorn, skapar och publicerar det första steget modulen för att aktivera fjärrfelsökning.

  1. I Solution Explorer väljer du och markerar modulprojektmappen (till exempel myIotEdgeModule). Ange den anpassade modulen som startprojekt. Välj Project Set as StartUp Project (Projektuppsättning>som startprojekt) på menyn.

  2. För att felsöka C#Linux-modulen måste vi uppdatera dockerfile.amd64.debug-filen för att aktivera SSH-tjänsten. Uppdatera dockerfile.amd64.debug-filen så att den använder följande mall: Dockerfile för Azure IoT Edge AMD64 C#-modulen med stöd för fjärrfelsökning.

    Kommentar

    När du väljer Felsök använder Dockerfile.(amd64|windows-amd64).debug Visual Studio för att skapa Docker-avbildningar. Detta inkluderar .NET Core-kommandoradsfelsökaren VSDBG i containeravbildningen när du skapar den. För produktionsklara IoT Edge-moduler rekommenderar vi att du använder versionskonfigurationen, som använder Dockerfile.(amd64|windows-amd64) utan VSDBG.

    Varning

    Kontrollera att den sista raden i mallen ENTRYPOINT ["dotnet", "IotEdgeModule1.dll"] namnet på DLL:t matchar namnet på ditt IoT Edge-modulprojekt.

    Skärmbild av hur du ställer in Dockerfile-mallen

  3. För att upprätta en SSH-anslutning med Linux-modulen måste vi skapa en RSA-nyckel. Öppna en upphöjd PowerShell-session och kör följande kommandon för att skapa en ny RSA-nyckel. Se till att du sparar RSA-nyckeln under samma IoT Edge-modulmapp och att namnet på nyckeln är id_rsa.

    ssh-keygen -t RSA -b 4096 -m PEM
    

    Skärmbild av hur du skapar en SSH-nyckel

  4. Om du använder ett privat register som Azure Container Registry (ACR) använder du följande Docker-kommando för att logga in på det. Du kan hämta användarnamnet och lösenordet från sidan Åtkomstnycklar i registret i Azure-portalen. Om du använder ett lokalt register kan du köra ett lokalt register.

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <ACR username> -p <ACR password> <ACR login server>
    
  1. I Solution Explorer högerklickar du på projektmappen och väljer Skapa och push-överföra IoT Edge-moduler för att skapa och push-överföra Docker-avbildningen för varje modul.

  2. Om du använder ett privat register som Azure Container Registry måste du lägga till inloggningsinformation för registret i körningsinställningarna som finns i filen deployment.template.json. Ersätt platshållarna med ditt faktiska användarnamn, lösenord och registernamn för ACR-administratören.

          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "registry1": {
                "username": "<username>",
                "password": "<password>",
                "address": "<registry name>.azurecr.io"
              }
            }
          }
    

    Kommentar

    Den här artikeln använder autentiseringsuppgifter för administratörsinloggning för Azure Container Registry, vilket är praktiskt för utvecklings- och testscenarier. När du är redo för produktionsscenarier rekommenderar vi ett alternativ för autentisering med minst privilegier som tjänstens huvudnamn. Mer information finns i Hantera åtkomst till containerregistret.

  3. Det är nödvändigt att exponera port 22 för att få åtkomst till modulens SSH-tjänst. I den här självstudien används 10022 som värdport, men du kan ange en annan port som ska användas som en SSH-port för att ansluta till Linux C#-modulen. Du måste lägga till SSH-portinformationen i "createOptions" för den här Linux-modulinställningen som finns i filen deployment.debug.template.json.

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. Högerklicka på projektmappen i Solution Explorer och välj Generera distribution för IoT Edge för att skapa den nya JSON-distributionen för IoT Edge.

  5. Öppna Cloud Explorer genom att klicka på Visa>Cloud Explorer. Kontrollera att du har loggat in på Visual Studio 2019.

  6. I Cloud Explorer expanderar du din prenumeration, hittar din Azure IoT Hub och den Azure IoT Edge-enhet som du vill distribuera.

  7. Högerklicka på IoT Edge-enheten och välj Skapa distribution. Gå till manifestet för felsökningsdistribution som konfigurerats för din plattform i mappen config i Visual Studio-lösningen, till exempel deployment.amd64.json.

Docker-avbildning för byggmodul

När du har utvecklat modulen kan du skapa modulavbildningen som ska lagras i ett containerregister för distribution till din IoT Edge-enhet.

Använd modulens Dockerfile för att skapa docker-modulens avbildning.

docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 

Anta till exempel att kommandogränssnittet finns i projektkatalogen och att modulnamnet är IotEdgeModule1. Om du vill skapa avbildningen för det lokala registret eller ett Azure-containerregister använder du följande kommandon:

# Build the image for the local registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t localhost:5000/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

# Or build the image for an Azure Container Registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

Push-modul docker-avbildning

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/iotedgemodule1:0.0.1-amd64

# Or push the Docker image to an Azure Container Registry
az acr login --name myacr
docker push myacr.azurecr.io/iotedgemodule1:0.0.1-amd64

Distribuera modulen till IoT Edge-enheten.

Öppna deployment.debug.template.json distributionsmanifestfil i huvudprojektet i Visual Studio. Distributionsmanifestet är ett JSON-dokument som beskriver de moduler som ska konfigureras på den riktade IoT Edge-enheten. Innan distributionen måste du uppdatera dina autentiseringsuppgifter för Azure Container Registry, dina modulavbildningar och rätt createOptions värden. Mer information om createOption-värden finns i Konfigurera alternativ för containerskapande för IoT Edge-moduler.

  1. Om du använder ett Azure Container Registry för att lagra modulavbildningen måste du lägga till dina autentiseringsuppgifter för att deployment.debug.template.json i edgeAgent-inställningarna . Exempel:

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_acr_password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
    //...
    
  2. Ersätt värdet för avbildningsegenskapen med det modulbildnamn som du skickade till registret. Om du till exempel push-överförde en bild taggad myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 för den anpassade modulen IotEdgeModule1 ersätter du värdet för bildegenskapen med taggvärdet.

  3. Lägg till eller ersätt värdet createOptions med strängbegränsat innehåll för varje system och anpassad modul i distributionsmallen.

    Till exempel skulle IotEdgeModule1s avbildning och createOptions-inställningar likna följande:

    "IotEdgeModule1": {
    "version": "1.0.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/iotedgemodule1:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    

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.debug.amd64.json till IoT Hub my-iot-hub för IoT Edge-enheten my-device använder du följande kommando:

az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.debug.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

Dricks

Du hittar din IoT Hub-anslutningssträng i Azure-portalen under Säkerhetsinställningar>för Azure IoT Hub >Delade åtkomstprinciper.

  1. I Cloud Explorer högerklickar du på gränsenheten och uppdaterar för att se den nya modulen som körs tillsammans med $edgeAgent och $edgeHub moduler.

Felsöka lösningen

  1. Använd och upphöjd PowerShell-session kör följande kommandon

    1. Hämta moduleId baserat på namnet som används för Linux C#-modulen. Ersätt <platshållaren iot-edge-module-name> med modulens namn.

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. Kontrollera att $moduleId är korrekt – Om variabeln är tom kontrollerar du att du använder rätt modulnamn

    3. Starta SSH-tjänsten i Linux-containern

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. Öppna modulens SSH-port på den virtuella EFLOW-datorn (i den här självstudien används port 10022)

      Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT"
      

    Varning

    Av säkerhetsskäl tas IP-tabellregeln bort varje gång den virtuella EFLOW-datorn startas om och återgår till de ursprungliga inställningarna. Dessutom måste modulenSSH-tjänsten startas igen manuellt.

  2. När du har startat SSH-tjänsten väljer du Felsöka ->Anslut till process, anger Anslut ionstyp till SSH och Anslut ionsmål till IP-adressen för din virtuella EFLOW-dator. Om du inte känner till IP-adressen för den virtuella EFLOW-datorn kan du använda PowerShell-cmdleten Get-EflowVmAddr . Skriv först IP-adressen och tryck sedan på Retur. I popup-fönstret anger du följande konfigurationer:

    Fält Värde
    Värdnamn Använda IP-adressen för den virtuella EFLOW-datorn
    Port 10022 (eller den du använde i distributionskonfigurationen)
    Användarnamn Root
    Autentiseringstyp Privat nyckel
    Privat nyckelfil Fullständig sökväg till id_rsa som skapades i ett tidigare steg
    Lösenfras Lösenfras som används för nyckeln som skapades i ett tidigare steg

    Skärmbild av hur du ansluter till ett fjärrsystem

  3. När du har anslutit till modulen med hjälp av SSH kan du välja processen och välja Bifoga. För C#-modulen måste du välja Process dotnet och Attach to To Managed (CoreCLR). Det kan ta 10 till 20 sekunder första gången.

    Skärmbild av hur du kopplar en edge-modulprocess.

  4. Ange en brytpunkt för att inspektera modulen.

    • Om du utvecklar i C# anger du en brytpunkt i PipeMessage() funktionen i ModuleBackgroundService.cs.
    • Om du använder C anger du en brytpunkt i InputQueue1Callback() funktionen i main.c.
  5. Utdata från SimulatedTemperatureSensor ska omdirigeras till indata1 i den anpassade Linux C#-modulen. Brytpunkten ska utlösas. Du kan titta på variabler i Visual Studio Locals-fönstret .

    Skärmbild av hur du felsöker en enskild modul

  6. Tryck på Ctrl + F5 eller välj stoppknappen för att sluta felsöka.

Rensa resurser

Om du tänker fortsätta till nästa rekommenderade artikel kan du behålla de resurser och konfigurationer du har skapat och använda dem igen. Du kan även fortsätta att använda samma IoT Edge-enhet som en testenhet.

Annars kan du ta bort de lokala konfigurationer och Azure-resurser som du använde i den här artikeln för att undvika avgifter.

Ta bort Azure-resurser

Det går inte att ångra borttagningen av Azure-resurser och resursgrupper. Var noga så att du inte tar bort fel resursgrupp eller resurser av misstag. Om du har skapat IoT-hubben i en befintlig resursgrupp som har resurser som du vill behålla tar du bara bort själva IoT Hub-resursen, inte resursgruppen.

Ta bort resurser:

  1. Logga in på Azure-portalen och välj Resursgrupper.

  2. Välj namnet på resursgruppen som innehåller dina IoT Edge-testresurser.

  3. Granska listan över resurser som finns i resursgruppen. Om du vill ta bort alla kan du välja Ta bort resursgrupp. Om du bara vill ta bort några av dem kan du klicka i varje resurs och ta bort dem individuellt.

Nästa steg

I den här självstudien konfigurerar du Visual Studio på utvecklingsdatorn och distribuerade och debuggade din första IoT Edge-modul från den. Nu när du känner till de grundläggande begreppen kan du prova att lägga till funktioner i en modul så att den kan analysera data som passerar genom den.