Tutorial: Desenvolver módulos do IoT Edge com contêineres Linux usando o IoT Edge para Linux no Windows

Aplica-se a:IoT Edge 1.4 checkmark IoT Edge 1.4

Importante

O IoT Edge 1.4 é a versão suportada. Se tiver uma versão anterior, consulte Atualizar IoT Edge.

Este tutorial explica como desenvolver, depurar e implantar seu próprio código em um dispositivo IoT Edge usando o IoT Edge para Linux no Windows e no Visual Studio 2022. Você aprenderá o cenário de desenvolvedor mais comum para soluções IoT Edge implantando um módulo C# em um dispositivo Linux. Você implantará e depurará um módulo personalizado do Azure IoT Edge em execução em um contêiner Linux no Windows (EFLOW). Mesmo se você planeja usar uma linguagem diferente ou implantar um serviço do Azure, este tutorial ainda é útil para aprender sobre as ferramentas e conceitos de desenvolvimento.

Este artigo inclui etapas para duas ferramentas de desenvolvimento do IoT Edge:

  • A interface de linha de comando (CLI) é a ferramenta preferida para o desenvolvimento.
  • Ferramentas do Azure IoT Edge para extensão do Visual Studio . A extensão está em modo de manutenção.

Use o botão seletor de ferramentas no início deste artigo para selecionar a versão da ferramenta.

Neste tutorial, irá aprender a:

  • Configure sua máquina de desenvolvimento.
  • Use as ferramentas do IoT Edge para Visual Studio Code para criar um novo projeto.
  • Crie seu projeto como um contêiner e armazene-o em um registro de contêiner do Azure.
  • Implante seu código em um dispositivo IoT Edge.

Pré-requisitos

Este artigo pressupõe que você use uma máquina que executa o Windows como sua máquina de desenvolvimento. Em computadores Windows, você pode desenvolver módulos Windows ou Linux. Este tutorial orienta você pelo desenvolvimento de contêineres Linux, usando o IoT Edge para Linux no Windows para criar e implantar os módulos.

Depois que o Visual Studio 2022 estiver pronto, você também precisará das seguintes ferramentas e componentes:

  • Transfira e instale as Ferramentas do Azure IoT Edge a partir do Visual Studio Marketplace. Você pode usar a extensão Azure IoT Edge Tools para criar e criar sua solução IoT Edge. A ferramenta de desenvolvimento preferida é a linha de comando (CLI) Azure IoT Edge Dev Tool. A extensão inclui os modelos de projeto do Azure IoT Edge usados para criar o projeto do Visual Studio. Atualmente, você precisa da extensão instalada independentemente da ferramenta de desenvolvimento que você usa.

    Importante

    A extensão Azure IoT Edge Tools for VS 2022 está no modo de manutenção. A ferramenta de desenvolvimento preferida é a linha de comando (CLI) Azure IoT Edge Dev Tool.

    Gorjeta

    Se você estiver usando o Visual Studio 2019, baixe e instale o Azure IoT Edge Tools for VS 2019 do mercado do Visual Studio.

Recursos da cloud:

Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.

Conceitos-chave

Este tutorial descreve o desenvolvimento de um módulo do IoT Edge. Um módulo IoT Edge, ou às vezes apenas módulo, é um contêiner com código executável. Você pode implantar um ou mais módulos em um dispositivo IoT Edge. Os módulos executam tarefas específicas, como ingerir dados de sensores, limpar e analisar dados ou enviar mensagens para um hub IoT. Para obter mais informações, consulte Compreender os módulos do Azure IoT Edge.

Ao desenvolver módulos IoT Edge, é importante entender a diferença entre a máquina de desenvolvimento e o dispositivo IoT Edge de destino onde o módulo será eventualmente implantado. O contêiner que você cria para armazenar o código do módulo deve corresponder ao sistema operacional (SO) do dispositivo de destino. Por exemplo, o cenário mais comum é alguém desenvolvendo um módulo em um computador Windows com a intenção de atingir um dispositivo Linux executando o IoT Edge. Nesse caso, o sistema operacional do contêiner seria o Linux. Ao passar por este tutorial, tenha em mente a diferença entre o sistema operacional da máquina de desenvolvimento e o sistema operacional do contêiner. Para este tutorial, você usará seu host Windows para desenvolvimento e a VM IoT Edge para Linux on Windows (EFLOW) para criar e implantar os módulos.

Este tutorial destina-se a dispositivos que executam o IoT Edge com contêineres Linux. Você pode usar seu sistema operacional preferido, desde que sua máquina de desenvolvimento execute contêineres Linux. Recomendamos usar o Visual Studio para desenvolver com contêineres Linux, então é isso que este tutorial usa. Você também pode usar o Visual Studio Code, embora haja diferenças no suporte entre as duas ferramentas. Para obter mais informações, consulte Desenvolver módulos do Azure IoT Edge usando o Visual Studio Code.

Configurar a conexão remota do docker-cli e do mecanismo do Docker

Os módulos do IoT Edge são empacotados como contêineres, portanto, você precisa de um mecanismo de contêiner em sua máquina de desenvolvimento para criá-los e gerenciá-los. A máquina virtual EFLOW já contém uma instância do mecanismo Docker, portanto, este tutorial mostra como se conectar remotamente da máquina de desenvolvedor do Windows à instância do Docker da VM EFLOW. Usando isso, removemos a dependência do Docker Desktop para Windows.

A primeira etapa é configurar o docker-cli na máquina de desenvolvimento do Windows para poder se conectar ao mecanismo de docker remoto.

  1. Faça o download da versão docker.exe pré-compilada do docker-cli do docker-cli Chocolatey. Você também pode baixar o projeto cli oficial do docker/cli GitHub e compilá-lo seguindo as instruções do repositório.
  2. Extraia o docker.exe para um diretório em sua máquina de desenvolvimento. Por exemplo, C:\Docker\bin
  3. Abra Sobre o seu PC -Informações do sistema ->>Configurações avançadas do sistema
  4. Selecione Variáveis avançadas -Ambiente ->> Em Variáveis de usuário, marque Caminho
  5. Edite a variável Path e adicione o local do docker.exe
  6. Abrir uma sessão elevada do PowerShell
  7. Verifique se a CLI do Docker está acessível usando o comando
    docker --version
    

Se tudo foi configurado com sucesso, o comando anterior deve sair da versão docker, algo como Docker versão 20.10.12, build e91ed57.

A segunda etapa é configurar o mecanismo Docker da máquina virtual EFLOW para aceitar conexões externas e adicionar as regras de firewall apropriadas.

Aviso

Expor o mecanismo Docker a conexões externas pode aumentar os riscos de segurança. Esta configuração só deve ser usada para fins de desenvolvimento. Certifique-se de reverter a configuração para as configurações padrão após a conclusão do desenvolvimento.

  1. Abra uma sessão elevada do PowerShell e execute os seguintes comandos

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

    Segue-se um exemplo de saída.

    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. A etapa final é testar a conexão do Docker com o mecanismo do Docker da VM EFLOW. Primeiro, você precisa do endereço IP da VM Eflow.

    Get-EflowVmAddr
    

    Gorjeta

    Se a VM EFLOW foi implantada sem IP estático, o endereço IP pode mudar em reinicializações do sistema operacional host Windows ou alterações de rede. Certifique-se de que está a utilizar o endereço IP EFLOW VM correto sempre que pretender estabelecer uma ligação remota ao motor Docker.

    Segue-se um exemplo de saída.

    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. Usando o endereço IP obtido, conecte-se ao mecanismo EFLOW VM Docker e execute o contêiner de amostra Hello-World. Substitua <EFLOW-VM-IP> pelo endereço IP EFLOW VM obtido na etapa anterior.

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

    Você deve ver que o contêiner está sendo baixado, e depois será executado e produzirá o seguinte.

    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/
    

Criar um projeto do Azure IoT Edge

O modelo de projeto IoT Edge no Visual Studio cria uma solução que pode ser implantada em dispositivos IoT Edge. Primeiro, você cria uma solução do Azure IoT Edge e, em seguida, gera o primeiro módulo dessa solução. Cada solução IoT Edge pode conter mais de um módulo.

Importante

A estrutura do projeto IoT Edge criada pelo Visual Studio não é a mesma do Visual Studio Code.

Atualmente, a CLI da Ferramenta de Desenvolvimento do Azure IoT Edge não oferece suporte à criação do tipo de projeto do Visual Studio. Você precisa usar a extensão do Visual Studio IoT Edge para criar o projeto do Visual Studio.

  1. No Visual Studio, crie um novo projeto.

  2. Na página Criar um novo projeto, procure Azure IoT Edge. Selecione o projeto que corresponde à plataforma (módulo Linux IoT Edge) e à arquitetura do seu dispositivo IoT Edge e selecione Avançar.

    Create New Project

  3. Na página Configurar seu novo projeto, insira um nome para seu projeto e especifique o local e, em seguida, selecione Criar.

  4. Na janela Adicionar módulo, selecione o tipo de módulo que deseja desenvolver. Você também pode selecionar Módulo existente para adicionar um módulo IoT Edge existente à sua implantação. Especifique o nome do módulo e o repositório de imagens do módulo.

  5. Em URL do repositório, forneça o nome do repositório de imagens do módulo. O Visual Studio preenche automaticamente o nome do módulo com localhost:5000/<your module name>. Substitua-o por suas próprias informações de registro. Use localhost se você usar um registro Docker local para teste. Se você usar o Registro de Contêiner do Azure, use o servidor de logon nas configurações do Registro. O servidor de login se parece com <o nome> do registro.azurecr.io. Substitua apenas a parte localhost:5000 da cadeia de caracteres para que o resultado final se< pareça com o nome do registro.azurecr.io/< nome> do módulo.>

  6. Selecione Adicionar para adicionar seu módulo ao projeto.

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

    Nota

    Se você tiver um projeto IoT Edge existente, poderá alterar a URL do repositório abrindo o arquivo module.json . A URL do repositório está localizada na propriedade repository do arquivo JSON.

Agora, você tem um projeto do IoT Edge e um módulo do IoT Edge em sua solução do Visual Studio.

Estrutura do projeto

Em sua solução, há duas pastas de nível de projeto, incluindo uma pasta de projeto principal e uma única pasta de módulo. Por exemplo, você pode ter uma pasta de projeto principal chamada AzureIotEdgeApp1 e uma pasta de módulo chamada IotEdgeModule1. A pasta principal do projeto contém seu manifesto de implantação.

A pasta do módulo contém um arquivo para o código do módulo, nomeado ou Program.csmain.c dependendo do idioma escolhido. Esta pasta também contém um arquivo chamado module.json que descreve os metadados do seu módulo. Vários arquivos Docker fornecem as informações necessárias para construir seu módulo como um contêiner Windows ou Linux.

Manifesto de implantação do seu projeto

O manifesto de implantação editado é chamado deployment.debug.template.json. Esse arquivo é um modelo de um manifesto de implantação do IoT Edge que define todos os módulos executados em um dispositivo, juntamente com a forma como eles se comunicam entre si. Para obter mais informações sobre manifestos de implantação, consulte Saiba como implantar módulos e estabelecer rotas.

Se você abrir esse modelo de implantação, verá que os dois módulos de tempo de execução, edgeAgent e edgeHub estão incluídos, juntamente com o módulo personalizado que você criou neste projeto do Visual Studio. Um quarto módulo chamado SimulatedTemperatureSensor também está incluído. Este módulo padrão gera dados simulados que você pode usar para testar seus módulos ou excluir se não for necessário. Para ver como o sensor de temperatura simulado funciona, veja o código-fonte SimulatedTemperatureSensor.csproj.

Definir a versão do tempo de execução do IoT Edge

Atualmente, a última versão de tempo de execução estável é 1.4. Você deve atualizar a versão de tempo de execução do IoT Edge para a versão estável mais recente ou para a versão que deseja direcionar para seus dispositivos.

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no nome do seu projeto principal e selecione Definir versão do tempo de execução do IoT Edge.

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

  2. Use o menu suspenso para escolher a versão de tempo de execução que seus dispositivos IoT Edge estão executando e selecione OK para salvar as alterações. Se nenhuma alteração tiver sido feita, selecione Cancelar para sair.

    Atualmente, a extensão não inclui uma seleção para as versões mais recentes do tempo de execução. Se você quiser definir a versão de tempo de execução superior a 1.2, abra o arquivo de manifesto de implantação deployment.debug.template.json . Altere a versão de tempo de execução para as imagens do módulo de tempo de execução do sistema edgeAgent e edgeHub. Por exemplo, se você quiser usar o tempo de execução do IoT Edge versão 1.4, altere as seguintes linhas no arquivo de manifesto de implantação:

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.4"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
       //...
    
  3. Se você alterou a versão, regenere seu manifesto de implantação clicando com o botão direito do mouse no nome do seu projeto e selecione Gerar implantação para IoT Edge. Isso gera um manifesto de implantação com base em seu modelo de implantação e aparece na pasta config do seu projeto do Visual Studio.

  1. Abra o arquivo de manifesto de implantação deployment.debug.template.json . O manifesto de implantação é um documento JSON que descreve os módulos a serem configurados no dispositivo IoT Edge de destino.

  2. Altere a versão de tempo de execução para as imagens do módulo de tempo de execução do sistema edgeAgent e edgeHub. Por exemplo, se você quiser usar o tempo de execução do IoT Edge versão 1.4, altere as seguintes linhas no arquivo de manifesto de implantação:

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

Configurar a instância remota do mecanismo Docker do Visual Studio 2022

Use a extensão das ferramentas do Azure IoT Edge e configure-a para usar o mecanismo Docker remoto em execução dentro da máquina virtual EFLOW.

  1. Selecione Ferramentas -Azure IoT Edge tools ->>IoT Edge tools settings...

  2. Substitua o valor DOCKER_HOST localhost pelo endereço IP da VM Eflow. Se você não se lembra do endereço IP, use o cmdlet Get-EflowVmAddr EFLOW PowerShell para obtê-lo. Por exemplo, se o endereço IP do EFLOW VM for 172.20.1.100, o novo valor deverá ser tcp://172.20.1.100:2375.

    Screenshot of IoT Edge Tools settings

  3. Selecione OK

Desenvolva o seu módulo

Quando você adiciona um novo módulo, ele vem com um código padrão que está pronto para ser criado e implantado em um dispositivo para que você possa começar a testar sem tocar em nenhum código. O código do módulo está localizado dentro da pasta do módulo em um arquivo chamado Program.cs (para C#) ou main.c (para C).

A solução padrão é criada para que os dados simulados do módulo SimulatedTemperatureSensor sejam roteados para o módulo, que recebe a entrada e a envia para o Hub IoT.

Quando estiver pronto para personalizar o modelo de módulo com seu próprio código, use os SDKs do Hub IoT do Azure para criar outros módulos que atendam às principais necessidades de soluções de IoT, como segurança, gerenciamento de dispositivos e confiabilidade.

Crie e envie um único módulo

Normalmente, você vai querer testar e depurar cada módulo antes de executá-lo dentro de uma solução inteira com vários módulos. Como a solução será compilada ou depurada usando o mecanismo Docker em execução dentro da VM EFLOW, a primeira etapa é criar e publicar o módulo para habilitar a depuração remota.

  1. No Gerenciador de Soluções, selecione e realce a pasta do projeto do módulo (por exemplo, myIotEdgeModule). Defina o módulo personalizado como o projeto de inicialização. Selecione Project set as StartUp Project (Projeto>definido como projeto de inicialização) no menu.

  2. Para depurar o módulo Linux C#, precisamos atualizar o arquivo Dockerfile.amd64.debug para habilitar o serviço SSH. Atualize o arquivo Dockerfile.amd64.debug para usar o seguinte modelo: Dockerfile for Azure IoT Edge AMD64 C# Module with Remote Debug Support.

    Nota

    Ao escolher Depurar, o Visual Studio usa Dockerfile.(amd64|windows-amd64).debug para criar imagens do Docker. Isso inclui o depurador de linha de comando .NET Core VSDBG em sua imagem de contêiner durante a criação. Para módulos IoT Edge prontos para produção, recomendamos que você use a configuração Release , que usa Dockerfile.(amd64|windows-amd64) sem VSDBG.

    Aviso

    Verifique se a última linha do modelo ENTRYPOINT ["dotnet", "IotEdgeModule1.dll"] o nome da DLL corresponde ao nome do seu projeto do módulo IoT Edge.

    Screenshot of setting the Dockerfile template

  3. Para estabelecer uma conexão SSH com o módulo Linux, precisamos criar uma chave RSA. Abra uma sessão elevada do PowerShell e execute os seguintes comandos para criar uma nova chave RSA. Certifique-se de salvar a chave RSA na mesma pasta do módulo IoT Edge e o nome da chave é id_rsa.

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

    Screenshot of how to create an SSH key

  4. Se você estiver usando um registro privado como o Azure Container Registry (ACR), use o seguinte comando do Docker para entrar nele. Pode obter o nome de utilizador e a palavra-passe a partir da página Chaves de acesso do seu registo no portal do Azure. Se estiver a utilizar o registo local, pode executar um registo local.

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <ACR username> -p <ACR password> <ACR login server>
    
  1. No Gerenciador de Soluções, clique com o botão direito do mouse na pasta do projeto e selecione Build and Push IoT Edge Modules para criar e enviar por push a imagem do Docker para cada módulo.

  2. Se você estiver usando um registro privado como o Registro de Contêiner do Azure, precisará adicionar suas informações de logon do Registro às configurações de tempo de execução encontradas no arquivo deployment.template.json. Substitua os espaços reservados pelo seu nome de usuário, senha e nome de registro reais do administrador do ACR.

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

    Nota

    Este artigo usa credenciais de logon de administrador para o Registro de Contêiner do Azure, que são convenientes para cenários de desenvolvimento e teste. Quando estiver pronto para cenários de produção, recomendamos uma opção de autenticação de privilégios mínimos, como entidades de serviço. Para obter mais informações, consulte Gerenciar o acesso ao registro de contêiner.

  3. É necessário expor a porta 22 para acessar o serviço SSH do módulo. Este tutorial usa 10022 como a porta do host, mas você pode especificar uma porta diferente, que será usada como uma porta SSH para se conectar ao módulo C# do Linux. Você precisa adicionar as informações da porta SSH para o "createOptions" desta configuração do módulo Linux encontrado no arquivo deployment.debug.template.json.

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. No Gerenciador de Soluções, clique com o botão direito do mouse na pasta do projeto e selecione Gerar Implantação para IoT Edge para criar o novo json de implantação do IoT Edge.

  5. Abra o Cloud Explorer clicando em View>Cloud Explorer. Certifique-se de que iniciou sessão no Visual Studio 2019.

  6. No Cloud Explorer, expanda sua assinatura, localize seu Hub IoT do Azure e o dispositivo Azure IoT Edge que você deseja implantar.

  7. Clique com o botão direito do mouse no dispositivo IoT Edge e escolha Criar implantação. Navegue até o manifesto de implantação de depuração configurado para sua plataforma localizado na pasta config em sua solução do Visual Studio, como deployment.amd64.json.

Imagem do Docker do módulo de compilação

Depois de desenvolver o módulo, você pode criar a imagem do módulo para armazenar em um registro de contêiner para implantação em seu dispositivo IoT Edge.

Use o Dockerfile do módulo para criar a imagem do Docker do módulo.

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

Por exemplo, vamos supor que seu shell de comando esteja no diretório do projeto e o nome do módulo seja IotEdgeModule1. Para criar a imagem para o registro local ou um registro de contêiner do Azure, use os seguintes comandos:

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

Imagem do Docker do módulo Push

Envie a imagem do módulo para o registro local ou para um registro de contêiner.

docker push <ImageName>

Por exemplo:

# 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

Implante o módulo no dispositivo IoT Edge.

No Visual Studio, abra o arquivo de manifesto de implantação deployment.debug.template.json no projeto principal. O manifesto de implantação é um documento JSON que descreve os módulos a serem configurados no dispositivo IoT Edge de destino. Antes da implantação, você precisa atualizar suas credenciais do Registro de Contêiner do Azure, suas imagens de módulo e os valores adequados createOptions . Para obter mais informações sobre valores createOption, consulte Como configurar opções de criação de contêiner para módulos IoT Edge.

  1. Se você estiver usando um Registro de Contêiner do Azure para armazenar a imagem do módulo, precisará adicionar suas credenciais a deployment.debug.template.json nas configurações do edgeAgent . Por exemplo,

    "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. Substitua o valor da propriedade image pelo nome da imagem do módulo enviado por push para o registro. Por exemplo, se você enviou por push uma imagem marcada myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 para o módulo personalizado IotEdgeModule1, substitua o valor da propriedade image pelo valor da tag.

  3. Adicione ou substitua o valor createOptions por conteúdo stringified para cada sistema e módulo personalizado no modelo de implantação.

    Por exemplo, as configurações de imagem e createOptions do IotEdgeModule1 seriam semelhantes às seguintes:

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

Use o comando IoT Edge Azure CLI set-modules para implantar os módulos no Hub IoT do Azure. Por exemplo, para implantar os módulos definidos no arquivo deployment.debug.amd64.json no Hub IoT my-iot-hub para o dispositivo my-device do IoT Edge, use o seguinte comando:

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

Gorjeta

Você pode encontrar sua cadeia de conexão do Hub IoT no portal do Azure em Configurações de segurança do Hub >IoT do>Azure Políticas de acesso compartilhado.

  1. No Cloud Explorer, clique com o botão direito do mouse em seu dispositivo de borda e atualize para ver o novo módulo em execução junto com os módulos $edgeAgent e $edgeHub .

Depurar a solução

  1. Usando e sessão elevada do PowerShell, execute os seguintes comandos:

    1. Obtenha o moduleId com base no nome usado para o módulo Linux C#. Certifique-se de substituir o <espaço reservado iot-edge-module-name> pelo nome do módulo.

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. Verifique se o $moduleId está correto - Se a variável estiver vazia, certifique-se de que está a utilizar o nome do módulo correto

    3. Inicie o serviço SSH dentro do contêiner Linux

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. Abra a porta SSH do módulo na VM EFLOW (este tutorial usa a porta 10022)

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

    Aviso

    Por motivos de segurança, sempre que a VM EFLOW for reinicializada, a regra da tabela IP será excluída e voltará às configurações originais. Além disso, o serviço SSH do módulo terá que ser iniciado novamente manualmente.

  2. Depois de iniciar com êxito o serviço SSH, selecione Depurar ->Anexar ao Processo, defina Tipo de Conexão como SSH e Destino de Conexão para o endereço IP da sua VM EFLOW. Se você não souber o EFLOW VM IP, poderá usar o Get-EflowVmAddr cmdlet PowerShell. Primeiro, digite o IP e pressione enter. Na janela pop-up, insira as seguintes configurações:

    Campo valor
    Nome de Anfitrião Usar o IP da VM EFLOW
    Porta 10022 (Ou o que você usou em sua configuração de implantação)
    Nome de utilizador raiz
    Tipo de autenticação Chave Privada
    Arquivo de chave privada Caminho completo para o id_rsa criado em uma etapa anterior
    Frase secreta Senha usada para a chave criada em uma etapa anterior

    Screenshot of how to connect to a remote system

  3. Depois de se conectar com sucesso ao módulo usando SSH, você pode escolher o processo e selecionar Anexar. Para o módulo C#, você precisa escolher processar dotnet e Anexar ao gerenciado (CoreCLR). Pode demorar 10 a 20 segundos na primeira vez.

    Screenshot of how to attach an edge module process.

  4. Defina um ponto de interrupção para inspecionar o módulo.

    • Se estiver desenvolvendo em C#, defina um ponto de interrupção na PipeMessage() função em ModuleBackgroundService.cs.
    • Se estiver usando C, defina um ponto de interrupção na InputQueue1Callback() função em main.c.
  5. A saída do SimulatedTemperatureSensor deve ser redirecionada para input1 do módulo C# Linux personalizado. O ponto de interrupção deve ser acionado. Você pode observar variáveis na janela Locais do Visual Studio.

    Screenshot of how to debug a single module

  6. Pressione Ctrl + F5 ou selecione o botão Parar para parar a depuração.

Clean up resources (Limpar recursos)

Se planeia avançar para o próximo artigo recomendado, pode manter os recursos e as configurações que criou e reutilizá-los. Também pode continuar a utilizar o mesmo dispositivo IoT Edge como um dispositivo de teste.

Caso contrário, você pode excluir as configurações locais e os recursos do Azure usados neste artigo para evitar cobranças.

Eliminar recursos do Azure

A eliminação de recursos e grupos de recursos do Azure é irreversível. Confirme que não elimina acidentalmente o grupo de recursos ou recursos errados. Se você criou o hub IoT dentro de um grupo de recursos existente que tem recursos que deseja manter, exclua apenas o recurso do hub IoT em si, não o grupo de recursos.

Para eliminar os recursos:

  1. Inicie sessão no Portal do Azure e selecione Grupos de recursos.

  2. Selecione o nome do grupo de recursos que contém os recursos de teste do IoT Edge.

  3. Reveja a lista de recursos contidos no seu grupo de recursos. Se quiser eliminá-los todos, pode selecionar Eliminar grupo de recursos. Se quiser eliminar apenas alguns dos recursos, pode clicar em cada um para eliminá-los individualmente.

Próximos passos

Neste tutorial, você configurou o Visual Studio em sua máquina de desenvolvimento e implantou e depurou seu primeiro módulo IoT Edge a partir dele. Agora que você já conhece os conceitos básicos, tente adicionar funcionalidade a um módulo para que ele possa analisar os dados que passam por ele.