Zelfstudie: IoT Edge-modules ontwikkelen met Linux-containers met Behulp van IoT Edge voor Linux in Windows

Van toepassing op:IoT Edge 1.4 checkmark IoT Edge 1.4

Belangrijk

IoT Edge 1.4 is de ondersteunde release. Raadpleeg IoT Edge bijwerken als u een eerdere versie hebt.

In deze zelfstudie wordt uitgelegd hoe u uw eigen code ontwikkelt, foutopsporing en implementeert op een IoT Edge-apparaat met behulp van IoT Edge voor Linux in Windows en Visual Studio 2022. U leert het meest voorkomende ontwikkelaarsscenario voor IoT Edge-oplossingen door een C#-module te implementeren op een Linux-apparaat. U implementeert en debugt een aangepaste Azure IoT Edge-module die wordt uitgevoerd in een Linux-container in Windows (EFLOW). Ook als u van plan bent een andere taal te gebruiken of een Azure-service te implementeren, is deze zelfstudie nog steeds nuttig om meer te leren over de ontwikkelhulpprogramma's en -concepten.

Dit artikel bevat stappen voor twee IoT Edge-ontwikkelhulpprogramma's:

  • Opdrachtregelinterface (CLI) is het favoriete hulpprogramma voor ontwikkeling.
  • Azure IoT Edge-hulpprogramma's voor Visual Studio-extensie . De extensie bevindt zich in de onderhoudsmodus.

Gebruik de knop toolselector aan het begin van dit artikel om de versie van het hulpprogramma te selecteren.

In deze zelfstudie leert u het volgende:

  • Uw ontwikkelcomputer instellen.
  • De IoT Edge Tools voor Visual Studio Code gebruiken om een nieuw project te maken.
  • Uw project bouwen als een container en het opslaan in een Azure-containerregister.
  • Uw code implementeren op een IoT Edge-apparaat.

Vereisten

In dit artikel wordt ervan uitgegaan dat u een computer met Windows gebruikt als uw ontwikkelcomputer. Op Windows-computers kunt u Windows- of Linux-modules ontwikkelen. In deze zelfstudie wordt u begeleid bij de ontwikkeling van Linux-containers, met behulp van IoT Edge voor Linux in Windows voor het bouwen en implementeren van de modules.

Nadat visual Studio 2022 gereed is, hebt u ook de volgende hulpprogramma's en onderdelen nodig:

  • Download en installeer Azure IoT Edge Tools vanuit Visual Studio Marketplace. U kunt de Azure IoT Edge Tools-extensie gebruiken om uw IoT Edge-oplossing te maken en te bouwen. Het favoriete ontwikkelhulpprogramma is de opdrachtregel (CLI) Azure IoT Edge Dev Tool. De extensie bevat de Azure IoT Edge-projectsjablonen die worden gebruikt om het Visual Studio-project te maken. Op dit moment moet de extensie zijn geïnstalleerd, ongeacht het ontwikkelprogramma dat u gebruikt.

    Belangrijk

    De Azure IoT Edge Tools for VS 2022-extensie bevindt zich in de onderhoudsmodus. Het favoriete ontwikkelhulpprogramma is de opdrachtregel (CLI) Azure IoT Edge Dev Tool.

    Tip

    Als u Visual Studio 2019 gebruikt, downloadt en installeert u Azure IoT Edge Tools voor VS 2019 vanuit de Visual Studio Marketplace.

Cloudresources:

  • Een gratis of standaard IoT-hub-laag in Azure.

Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.

Belangrijke concepten

In deze zelfstudie doorloopt u de ontwikkeling van een IoT Edge-module. Een IoT Edge-module, of soms kortweg module genoemd, 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 Informatie over Azure IoT Edge-modules voor meer informatie.

Bij het ontwikkelen van IoT Edge-modules is het belangrijk dat u begrijpt wat het verschil is tussen de ontwikkelcomputer en het IoT Edge doelapparaat waarop de module uiteindelijk zal worden geïmplementeerd. De container die u voor de modulecode bouwt, moet overeenkomen met het besturingssysteem van het doelapparaat. Zo is het meest voorkomende scenario dat iemand een module ontwikkelt op een Windows-computer met het doel deze op een Linux-apparaat met IoT Edge te implementeren. In dat geval zou het besturingssysteem van de container Linux zijn. Als u deze zelfstudie doorloopt, moet u rekening houden met het verschil tussen het besturingssysteem van de ontwikkelcomputer en het besturingssysteem van de container. Voor deze zelfstudie gebruikt u uw Windows-host voor ontwikkeling en de IoT Edge voor Linux op Windows -VM (EFLOW) voor het bouwen en implementeren van de modules.

Deze zelfstudie is gericht op apparaten met IoT Edge met Linux-containers. Als de ontwikkelcomputer Linux-containers uitvoert, kunt u uw favoriete besturingssysteem gebruiken. We raden u aan Visual Studio te gebruiken om te ontwikkelen met Linux-containers, dus dat is wat in deze zelfstudie wordt gebruikt. U kunt ook Visual Studio Code gebruiken, maar er zijn wel verschillen in ondersteuning tussen de twee hulpprogramma's. Zie Azure IoT Edge-modules ontwikkelen met Visual Studio Code voor meer informatie.

Externe verbinding met docker-cli en Docker-engine instellen

IoT Edge-modules worden verpakt als container. U hebt dus een container-engine op uw ontwikkelcomputer nodig om modules te bouwen en te beheren. De virtuele EFLOW-machine bevat al een docker-engine, dus in deze zelfstudie ziet u hoe u op afstand verbinding kunt maken vanaf de Windows-ontwikkelaarscomputer met het Docker-exemplaar van de EFLOW-VM. Door dit te gebruiken, verwijderen we de afhankelijkheid van Docker Desktop voor Windows.

De eerste stap is het configureren van docker-cli op de Windows-ontwikkelcomputer om verbinding te kunnen maken met de externe Docker-engine.

  1. Download de vooraf gecompileerde docker.exe-versie van de docker-cli van docker-cli Chocolatey. U kunt het officiële CLI-project ook downloaden vanuit docker/cli GitHub en het compileren volgens de instructies voor de opslagplaats.
  2. Pak docker.exe uit naar een map op uw ontwikkelcomputer. Bijvoorbeeld C:\Docker\bin
  3. Open Over uw pc -> Systeeminformatie -> Geavanceerde systeeminstellingen
  4. Selecteer Advanced ->Environment variables -> Under User variables check Path
  5. Bewerk de padvariabele en voeg de locatie van docker.exe toe
  6. Een PowerShell-sessie met verhoogde bevoegdheid openen
  7. Controleer of Docker CLI toegankelijk is met behulp van de opdracht
    docker --version
    

Als alles is geconfigureerd, moet de vorige opdracht de docker-versie uitvoeren, bijvoorbeeld Docker versie 20.10.12, build e91ed57.

De tweede stap is het configureren van de Docker-engine van de virtuele EFLOW-machine voor het accepteren van externe verbindingen en het toevoegen van de juiste firewallregels.

Waarschuwing

Het blootstellen van docker-engine aan externe verbindingen kan de beveiligingsrisico's verhogen. Deze configuratie mag alleen worden gebruikt voor ontwikkelingsdoeleinden. Zorg ervoor dat u de configuratie teruggezet naar de standaardinstellingen nadat de ontwikkeling is voltooid.

  1. Open een PowerShell-sessie met verhoogde bevoegdheid en voer de volgende opdrachten uit

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

    Hier volgt een voorbeeld van uitvoer.

    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. De laatste stap is het testen van de Docker-verbinding met de Docker-engine van de EFLOW-VM. Eerst hebt u het IP-adres van de EFLOW-VM nodig.

    Get-EflowVmAddr
    

    Tip

    Als de EFLOW-VM zonder statisch IP-adres is geïmplementeerd, kan het IP-adres veranderen tijdens het opnieuw opstarten van het Windows-hostbesturingssystem of netwerkwijzigingen. Zorg ervoor dat u het juiste IP-adres van de EFLOW-VM gebruikt telkens wanneer u een externe Docker-engineverbinding tot stand wilt brengen.

    Hier volgt een voorbeeld van uitvoer.

    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. Maak met behulp van het verkregen IP-adres verbinding met de Docker-engine van de EFLOW-VM en voer de Hello-World-voorbeeldcontainer uit. Vervang <EFLOW-VM-IP> door het IP-adres van de EFLOW-VM dat u in de vorige stap hebt verkregen.

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

    U ziet dat de container wordt gedownload en nadat de container wordt uitgevoerd en het volgende wordt uitgevoerd.

    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/
    

Een Azure IoT Edge-project maken

Met de IoT Edge-projectsjabloon in Visual Studio maakt u een oplossing die kan worden geïmplementeerd op IoT Edge-apparaten. Eerst maakt u een Azure IoT Edge-oplossing en vervolgens genereert u de eerste module in die oplossing. Elke IoT Edge-oplossing kan meer dan één module bevatten.

Belangrijk

De IoT Edge-projectstructuur die door Visual Studio is gemaakt, is niet hetzelfde als de structuur in Visual Studio Code.

Momenteel biedt de Azure IoT Edge Dev Tool CLI geen ondersteuning voor het maken van het Visual Studio-projecttype. U moet de Visual Studio IoT Edge-extensie gebruiken om het Visual Studio-project te maken.

  1. Maak een nieuw project in Visual Studio.

  2. Zoek op de pagina Een nieuw project maken naar Azure IoT Edge. Selecteer het project dat overeenkomt met het platform (Linux IoT Edge-module) en architectuur voor uw IoT Edge-apparaat en selecteer Volgende.

    Create New Project

  3. Voer op de pagina Uw nieuwe project configureren een naam in voor uw project en geef de locatie op en selecteer Vervolgens Maken.

  4. Selecteer in het venster Module toevoegen het type module dat u wilt ontwikkelen. U kunt ook bestaande module selecteren om een bestaande IoT Edge-module toe te voegen aan uw implementatie. Geef de naam van de module en de opslagplaats voor de module-installatiekopieën op.

  5. Geef in opslagplaats-URL de naam op van de opslagplaats voor de installatiekopieën van de module. Visual Studio vult de modulenaam automatisch in met localhost:5000/<uw modulenaam>. 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 de aanmeldingsserver vanuit de instellingen van uw register. De aanmeldingsserver ziet eruit als <registernaam.azurecr.io.> Vervang alleen het gedeelte localhost:5000 van de tekenreeks, zodat het uiteindelijke resultaat eruitziet als <registernaam.azurecr.io/<> naam van de module.>

  6. Selecteer Toevoegen om uw module toe te voegen aan het project.

    Screenshot of adding how to add an application and module to Visual Studio solution

    Notitie

    Als u een bestaand IoT Edge-project hebt, kunt u de URL van de opslagplaats wijzigen door het bestand module.json te openen. De URL van de opslagplaats bevindt zich in de opslagplaatseigenschap van het JSON-bestand.

U hebt nu een IoT Edge-project en een IoT Edge-module in uw Visual Studio-oplossing.

Projectstructuur

In uw oplossing zijn er twee mappen op projectniveau, waaronder een hoofdprojectmap en één modulemap. U hebt bijvoorbeeld een hoofdprojectmap met de naam AzureIotEdgeApp1 en een modulemap met de naam IotEdgeModule1. De hoofdprojectmap bevat uw implementatiemanifest.

De modulemap bevat een bestand voor de modulecode, met de naam of Program.csmain.c afhankelijk van de taal die u hebt gekozen. Deze map bevat ook een bestand met de naam module.json waarmee de metagegevens van uw module worden beschreven. Verschillende Docker-bestanden bieden de informatie die nodig is om uw module te bouwen als een Windows- of Linux-container.

Implementatiemanifest van uw project

Het implementatiemanifest dat u bewerkt, heeft de naam deployment.debug.template.json. Dit bestand is een sjabloon van een IoT Edge-implementatiemanifest dat alle modules definieert die op een apparaat worden uitgevoerd, samen met de communicatie met elkaar. Zie Meer informatie over het implementeren van modules en het tot stand brengen van routes voor meer informatie over implementatiemanifesten.

Als u deze implementatiesjabloon opent, ziet u dat de twee runtimemodules edgeAgenten edgeHub zijn opgenomen, samen met de aangepaste module die u in dit Visual Studio-project hebt gemaakt. Er is ook een vierde module met de naam SimulatedTemperatureSensor opgenomen. Met deze standaardmodule worden gesimuleerde gegevens gegenereerd die u kunt gebruiken om uw modules te testen of te verwijderen als dit niet nodig is. Bekijk de broncode SimulatedTemperatureSensor.csproj om te zien hoe de gesimuleerde temperatuursensor werkt.

Runtimeversie van IoT Edge instellen

Momenteel is de nieuwste stabiele runtimeversie 1.4. Werk de IoT Edge-runtimeversie bij naar de meest recente stabiele versie of de versie waarop u zich wilt richten voor uw apparaten.

  1. Klik in Solution Explorer met de rechtermuisknop op de naam van uw hoofdproject en selecteer IoT Edge-runtimeversie instellen.

    Screenshot of how to find and select the menu item named 'Set IoT Edge Runtime version'.

  2. Gebruik de vervolgkeuzelijst om de runtimeversie te kiezen waarop uw IoT Edge-apparaten worden uitgevoerd en selecteer VERVOLGENS OK om uw wijzigingen op te slaan. Als er geen wijziging is aangebracht, selecteert u Annuleren om af te sluiten.

    Momenteel bevat de extensie geen selectie voor de nieuwste runtimeversies. Als u de runtimeversie hoger dan 1.2 wilt instellen, opent u het manifestbestand deployment.debug.template.json deployment. Wijzig de runtimeversie voor de installatiekopieën van de system Runtime-module edgeAgent en edgeHub. Als u bijvoorbeeld de IoT Edge-runtimeversie 1.4 wilt gebruiken, wijzigt u de volgende regels in het distributiemanifestbestand:

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.4"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
       //...
    
  3. Als u de versie hebt gewijzigd, genereert u het implementatiemanifest opnieuw door met de rechtermuisknop op de naam van uw project te klikken en implementatie genereren voor IoT Edge te selecteren. Hiermee wordt een implementatiemanifest gegenereerd op basis van uw implementatiesjabloon en wordt deze weergegeven in de configuratiemap van uw Visual Studio-project.

  1. Open het manifestbestand deployment.debug.template.json-implementatie . Het implementatiemanifest is een JSON-document waarin de modules worden beschreven die moeten worden geconfigureerd op het beoogde IoT Edge-apparaat.

  2. Wijzig de runtimeversie voor de installatiekopieën van de system Runtime-module edgeAgent en edgeHub. Als u bijvoorbeeld de IoT Edge-runtimeversie 1.4 wilt gebruiken, wijzigt u de volgende regels in het distributiemanifestbestand:

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

Visual Studio 2022 extern Docker Engine-exemplaar instellen

Gebruik de extensie azure IoT Edge-hulpprogramma's en configureer deze om de externe Docker-engine te gebruiken die wordt uitgevoerd op de virtuele EFLOW-machine.

  1. Hulpprogramma's selecteren -> Azure IoT Edge-hulpprogramma's - Instellingen voor IoT Edge-hulpprogramma's>...

  2. Vervang de DOCKER_HOST localhost-waarde door het IP-adres van de EFLOW-VM. Als u het IP-adres niet meer weet, gebruikt u de EFLOW PowerShell-cmdlet Get-EflowVmAddr om het te verkrijgen. Als het IP-adres van de EFLOW-VM 172.20.1.100 is, moet de nieuwe waarde worden tcp://172.20.1.100:2375.

    Screenshot of IoT Edge Tools settings

  3. Selecteer OK.

Uw module ontwikkelen

Wanneer u een nieuwe module toevoegt, wordt deze geleverd met standaardcode die klaar is om te worden gebouwd en geïmplementeerd op een apparaat, zodat u kunt beginnen met testen zonder code aan te raken. De modulecode bevindt zich in de modulemap in een bestand met de naam Program.cs (voor C#) of main.c (voor C).

De standaardoplossing is zo gebouwd dat de gesimuleerde gegevens van de Module SimulatedTemperatureSensor worden gerouteerd naar uw module, die de invoer neemt en deze vervolgens naar IoT Hub verzendt.

Wanneer u klaar bent om de modulesjabloon aan te passen met uw eigen code, gebruikt u de Azure IoT Hub SDK's om andere modules te bouwen die voldoen aan de belangrijkste behoeften voor IoT-oplossingen, zoals beveiliging, apparaatbeheer en betrouwbaarheid.

Eén module bouwen en pushen

Normaal gesproken wilt u elke module testen en fouten opsporen voordat u deze uitvoert in een volledige oplossing met meerdere modules. Omdat de oplossing wordt gebouwd of fouten opsporen met behulp van de Docker-engine die wordt uitgevoerd in de EFLOW-VM, is de eerste stap het bouwen en publiceren van de module om externe foutopsporing in te schakelen.

  1. Selecteer en markeer in Solution Explorer de projectmap van de module (bijvoorbeeld myIotEdgeModule). Stel de aangepaste module in als het opstartproject. Selecteer Projectset>als Opstartproject in het menu.

  2. Als u fouten wilt opsporen in de C# Linux-module, moet u het dockerfile.amd64.debug-bestand bijwerken om de SSH-service in te schakelen. Werk het bestand Dockerfile.amd64.debug bij met behulp van de volgende sjabloon: Dockerfile voor Azure IoT Edge AMD64 C#-module met ondersteuning voor externe foutopsporing.

    Notitie

    Wanneer u Fouten opsporen kiest, gebruikt Dockerfile.(amd64|windows-amd64).debug Visual Studio om Docker-installatiekopieën te bouwen. Dit omvat het .NET Core-opdrachtregeldebugger VSDBG in uw containerinstallatiekopie tijdens het bouwen ervan. Voor IoT Edge-modules die gereed zijn voor productie, raden we u aan de releaseconfiguratie te gebruiken, die zonder VSDBG wordt gebruikt Dockerfile.(amd64|windows-amd64) .

    Waarschuwing

    Zorg ervoor dat de laatste regel van de sjabloon ENTRYPOINT ["dotnet", "IotEdgeModule1.dll"] de naam van het DLL-bestand overeenkomt met de naam van uw IoT Edge-moduleproject.

    Screenshot of setting the Dockerfile template

  3. Als u een SSH-verbinding met de Linux-module tot stand wilt brengen, moet u een RSA-sleutel maken. Open een PowerShell-sessie met verhoogde bevoegdheid en voer de volgende opdrachten uit om een nieuwe RSA-sleutel te maken. Zorg ervoor dat u de RSA-sleutel opslaat in dezelfde Map van de IoT Edge-module en dat de naam van de sleutel id_rsa is.

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

    Screenshot of how to create an SSH key

  4. Als u een privéregister zoals Azure Container Registry (ACR) gebruikt, gebruikt u de volgende Docker-opdracht om u aan te melden. U kunt de gebruikersnaam en het wachtwoord ophalen op de pagina Toegangssleutels van uw register in Azure Portal. Als u lokaal register gebruikt, kunt u een lokaal register uitvoeren.

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <ACR username> -p <ACR password> <ACR login server>
    
  1. Klik in Solution Explorer met de rechtermuisknop op de projectmap en selecteer Build and Push IoT Edge Modules om de Docker-installatiekopieën voor elke module te bouwen en pushen.

  2. Als u een privéregister zoals Azure Container Registry gebruikt, moet u uw aanmeldingsgegevens voor het register toevoegen aan de runtime-instellingen in het bestand deployment.template.json. Vervang de tijdelijke aanduidingen door de werkelijke gebruikersnaam, het wachtwoord en de registernaam van de ACR-beheerder.

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

    Notitie

    In dit artikel worden aanmeldingsreferenties voor beheerders gebruikt voor Azure Container Registry, wat handig is voor ontwikkelings- en testscenario's. Wanneer u klaar bent voor productiescenario's, wordt u aangeraden een optie voor verificatie met minimale bevoegdheden, zoals service-principals. Zie Toegang tot uw containerregister beheren voor meer informatie.

  3. U moet poort 22 beschikbaar maken voor toegang tot de SSH-moduleservice. In deze zelfstudie wordt 10022 gebruikt als hostpoort, maar u kunt een andere poort opgeven, die wordt gebruikt als een SSH-poort om verbinding te maken met de Linux C#-module. U moet de SSH-poortgegevens toevoegen aan de instelling createOptions van deze Linux-module in het bestand deployment.debug.template.json.

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. Klik in Solution Explorer met de rechtermuisknop op de projectmap en selecteer Implementatie genereren voor IoT Edge om de nieuwe JSON voor IoT Edge-implementatie te bouwen.

  5. Open Cloud Explorer door op Cloud Explorer weergeven>te klikken. Zorg ervoor dat u bent aangemeld bij Visual Studio 2019.

  6. Vouw in Cloud Explorer uw abonnement uit, zoek uw Azure IoT Hub en het Azure IoT Edge-apparaat dat u wilt implementeren.

  7. Klik met de rechtermuisknop op het IoT Edge-apparaat en kies Implementatie maken. Navigeer naar het distributiemanifest voor foutopsporing dat is geconfigureerd voor uw platform in de configuratiemap in uw Visual Studio-oplossing, zoals deployment.amd64.json.

Docker-installatiekopieën bouwen

Zodra u uw module hebt ontwikkeld, kunt u de module-installatiekopieën bouwen om op te slaan in een containerregister voor implementatie op uw IoT Edge-apparaat.

Gebruik het Dockerfile van de module om de Docker-moduleinstallatiekopieën te bouwen.

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

Stel dat de opdrachtshell zich in de projectmap bevindt en dat de modulenaam IotEdgeModule1 is. Gebruik de volgende opdrachten om de installatiekopieën voor het lokale register of een Azure-containerregister te maken:

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

Docker-installatiekopieën van pushmodule

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

Implementeer de module op het IoT Edge-apparaat.

Open in Visual Studio het manifestbestand deployment.debug.template.json-implementatie in het hoofdproject. Het implementatiemanifest is een JSON-document waarin de modules worden beschreven die moeten worden geconfigureerd op het beoogde IoT Edge-apparaat. Voordat u gaat implementeren, moet u uw Azure Container Registry-referenties, uw moduleinstallatiekopieën en de juiste createOptions waarden bijwerken. Zie Opties voor het maken van containers configureren voor IoT Edge-modules voor meer informatie over createOption-waarden.

  1. Als u een Azure Container Registry gebruikt om uw moduleinstallatiekopieën op te slaan, moet u uw referenties toevoegen aan deployment.debug.template.json in de edgeAgent-instellingen . Bijvoorbeeld:

    "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. Vervang de waarde van de afbeeldingseigenschap door de naam van de module-installatiekopieën die u naar het register hebt gepusht. Als u bijvoorbeeld een afbeelding hebt gepusht die is getagd myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 voor aangepaste module IotEdgeModule1, vervangt u de waarde van de afbeeldingseigenschap door de tagwaarde.

  3. Voeg de waarde createOptions toe of vervang deze door tekenreeksinhoud voor elk systeem en elke aangepaste module in de implementatiesjabloon.

    De installatiekopieën van IotEdgeModule1 en createOptions zijn bijvoorbeeld vergelijkbaar met het volgende:

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

Gebruik de opdracht Azure CLI-setmodules voor IoT Edge om de modules te implementeren in de Azure IoT Hub. Als u bijvoorbeeld de modules wilt implementeren die zijn gedefinieerd in het bestand deployment.debug.amd64.json in IoT Hub my-iot-hub voor het IoT Edge-apparaat, gebruikt u de volgende opdracht:

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

Tip

U vindt uw IoT Hub-verbindingsreeks in Azure Portal onder Azure IoT Hub-beveiligingsinstellingen >>voor gedeeld toegangsbeleid.

  1. Klik in Cloud Explorer met de rechtermuisknop op uw edge-apparaat en vernieuw de nieuwe module, samen met $edgeAgent en $edgeHub modules.

Fouten opsporen in de oplossing

  1. Gebruik en verhoogde PowerShell-sessie om de volgende opdrachten uit te voeren

    1. Haal de module-id op op basis van de naam die wordt gebruikt voor de Linux C#-module. Zorg ervoor dat u de <tijdelijke aanduiding iot-edge-module-name> vervangt door de naam van uw module.

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. Controleer of de $moduleId juist is. Als de variabele leeg is, controleert u of u de juiste modulenaam gebruikt

    3. De SSH-service starten in de Linux-container

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. Open de SSH-modulepoort op de EFLOW-VM (in deze zelfstudie wordt poort 10022 gebruikt)

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

    Waarschuwing

    Elke keer dat de EFLOW-VM opnieuw wordt opgestart, wordt de IP-tabelregel om veiligheidsredenen verwijderd en teruggegaan naar de oorspronkelijke instellingen. Ook moet de module-SSH-service handmatig opnieuw worden gestart.

  2. Nadat u de SSH-service hebt gestart, selecteert u Foutopsporing -> Koppelen aan proces, stelt u Verbinding maken iontype in op SSH en Verbinding maken iondoel op het IP-adres van uw EFLOW-VM. Als u het IP-adres van de EFLOW-VM niet weet, kunt u de Get-EflowVmAddr PowerShell-cmdlet gebruiken. Typ eerst het IP-adres en druk op Enter. Voer in het pop-upvenster de volgende configuraties in:

    Veld Waarde
    Hostnaam Het IP-adres van de EFLOW-VM gebruiken
    Poort 10022 (of degene die u hebt gebruikt in uw implementatieconfiguratie)
    Gebruikersnaam Root
    Verificatietype Persoonlijke sleutel
    Bestand met persoonlijke sleutel Volledig pad naar de id_rsa die in een vorige stap zijn gemaakt
    Passphrase Wachtwoordzin die wordt gebruikt voor de sleutel die in een vorige stap is gemaakt

    Screenshot of how to connect to a remote system

  3. Nadat u verbinding hebt gemaakt met de module met behulp van SSH, kunt u het proces kiezen en Koppelen selecteren. Voor de C#-module moet u proces dotnet kiezen en koppelen aan Managed (CoreCLR). Het kan de eerste keer 10 tot 20 seconden duren.

    Screenshot of how to attach an edge module process.

  4. Stel een onderbrekingspunt in om de module te inspecteren.

    • Als u in C# ontwikkelt, stelt u een onderbrekingspunt in de PipeMessage() functie in ModuleBackgroundService.cs in.
    • Als u C gebruikt, stelt u een onderbrekingspunt in de InputQueue1Callback() functie in main.c.
  5. De uitvoer van de SimulatedTemperatureSensor moet worden omgeleid naar input1 van de aangepaste Linux C#-module. Het onderbrekingspunt moet worden geactiveerd. U kunt variabelen bekijken in het visual Studio Locals-venster .

    Screenshot of how to debug a single module

  6. Druk op Ctrl+F5 of selecteer de stopknop om de foutopsporing te stoppen.

Resources opschonen

Als u van plan bent door te gaan met het volgende aanbevolen artikel, kunt 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.

Anders kunt u de lokale configuraties en Azure-resources die u in dit artikel hebt gemaakt, verwijderen om kosten te voorkomen.

Azure-resources verwijderen

Het verwijderen van de Azure-resources en resourcegroepen kan niet ongedaan worden gemaakt. Zorg ervoor dat u niet per ongeluk de verkeerde resourcegroep of resources verwijdert. Als u de IoT-hub in een bestaande resourcegroep hebt gemaakt met de resources die u wilt behouden, moet u alleen de IoT-hub zelf verwijderen en niet de resourcegroep.

Om de resources te verwijderen:

  1. Meld u aan bij Azure Portal en selecteer vervolgens Resourcegroepen.

  2. Selecteer de naam van de resourcegroep die uw IoT Edge-testresources bevat.

  3. Bekijk de lijst met resources die zich in de resourcegroep bevinden. Als u alle mappen wilt verwijderen, kunt u Resourcegroep verwijderen selecteren. Als u slechts een deel ervan wilt verwijderen, kunt u in elke resource afzonderlijk klikken om ze te verwijderen.

Volgende stappen

In deze zelfstudie hebt u Visual Studio ingesteld op uw ontwikkelcomputer en uw eerste IoT Edge-module geïmplementeerd en er fouten in opgespoord. Nu u de basisconcepten kent, kunt u functionaliteit toevoegen aan een module, zodat de gegevens die worden doorgegeven, kunnen worden geanalyseerd.