Compartilhar via


Tutorial: Desenvolver módulos IoT Edge usando Visual Studio Code

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

Importante

IoT Edge 1.5 LTS é a versão suportada. IoT Edge 1.4 LTS atingiu o fim da vida útil em 12 de novembro de 2024. Se você estiver usando uma versão anterior, consulte Update IoT Edge.

Este tutorial mostra como desenvolver e implantar seu código em um dispositivo IoT Edge. Azure IoT Edge módulos permitem implantar código que executa sua lógica de negócios diretamente em seu dispositivo IoT Edge. No Início rápido: Implantar código em um dispositivo Linux, você configura um dispositivo IoT Edge e implanta um módulo do Azure Marketplace.

Este artigo descreve as etapas para duas ferramentas de desenvolvimento IoT Edge:

  • Azure IoT Edge Dev Tool CLI (linha de comando), que é preferencial para desenvolvimento.
  • Extensão de ferramentas Azure IoT Edge para Visual Studio Code, que está no modo de manutenção.

Use o botão seletor de ferramentas no início deste artigo para escolher sua ferramenta.

Neste tutorial, você aprenderá como:

  • Configurar seu computador de desenvolvimento
  • Usar as ferramentas de IoT Edge para criar um novo projeto
  • Crie seu projeto como um contêiner Docker e armazene-o em um registro de contêiner Azure
  • Implantar seu código em um dispositivo IoT Edge

O módulo IoT Edge que você cria neste tutorial filtra os dados de temperatura gerados pelo dispositivo. Ele envia mensagens upstream somente se a temperatura estiver acima de um limite definido. Esse tipo de análise na borda ajuda a reduzir a quantidade de dados enviados e armazenados na nuvem.

Pré-requisitos

Um computador de desenvolvimento:

  • Use seu computador ou uma máquina virtual.
  • Verifique se o computador de desenvolvimento dá suporte à virtualização aninhada para executar um mecanismo de contêiner.
  • Você pode usar a maioria dos sistemas operacionais que executam um mecanismo de contêiner para desenvolver módulos IoT Edge para dispositivos Linux. Este tutorial usa um computador Windows, mas também aponta diferenças conhecidas no macOS ou linux.
  • Instalar Visual Studio Code
  • Instale o Azure CLI.

Um dispositivo Azure IoT Edge:

Recursos de nuvem:

Se você não tiver uma conta Azure, crie uma conta free antes de começar.

Dica

Para obter orientações sobre depuração interativa no Visual Studio Code ou no Visual Studio 2022:

Este tutorial aborda as etapas de desenvolvimento para Visual Studio Code.

Principais conceitos

Este tutorial explica como desenvolver um módulo IoT Edge. Um módulo IoT Edge é um contêiner com código executável. Você pode implantar um ou mais módulos em um dispositivo IoT Edge. Os módulos fazem tarefas específicas, como ingerir dados de sensores, limpar e analisar dados ou enviar mensagens para um IoT Hub. Para obter mais informações, consulte os módulos Understand Azure IoT Edge.

Ao desenvolver módulos IoT Edge, você deve entender a diferença entre o computador de desenvolvimento e o dispositivo de IoT Edge de destino em que o módulo é implantado. O contêiner que você cria para manter o código do módulo deve corresponder ao sistema operacional (SO) do dispositivo de destino. Por exemplo, o cenário mais comum é desenvolver um módulo em um computador Windows para direcionar um dispositivo Linux em execução IoT Edge. Nesse caso, o sistema operacional de contêiner é Linux. Ao percorrer este tutorial, lembre-se a diferença entre o sistema operacional do computador de desenvolvimento e o sistema operacional do contêiner.

Dica

Se você estiver usando IoT Edge para Linux no Windows, o dispositivo de destino em seu cenário será a máquina virtual Linux, não o host Windows.

Este tutorial tem como destino dispositivos que executam IoT Edge com contêineres do Linux. Use seu sistema operacional preferencial desde que seu computador de desenvolvimento execute contêineres do Linux. Visual Studio Code é recomendável para desenvolver com contêineres do Linux, portanto, este tutorial o usa. Você também pode usar Visual Studio, embora haja diferenças no suporte entre as duas ferramentas.

A tabela a seguir lista cenários de desenvolvimento com suporte para contêineres do Linux em Visual Studio Code e Visual Studio.

Visual Studio Code Visual Studio 2019/2022
Arquitetura de dispositivo do Linux Linux AMD64
Linux ARM32v7
Linux ARM64
Linux AMD64
Linux ARM32
Linux ARM64
Azure services Azure Functions
Azure Stream Analytics
Azure Machine Learning
Idiomas C
C#
Java
Node.js
Python
C
C#
Mais informações Azure IoT Edge para Visual Studio Code Azure IoT Edge Tools for Visual Studio 2019
Azure IoT Edge Tools for Visual Studio 2022

Instalar o mecanismo de contêiner

IoT Edge módulos são empacotados como contêineres, portanto, você precisa de um sistema de gerenciamento de contêiner compatível com Docker em seu computador de desenvolvimento para compilá-los e gerenciá-los. O Docker Desktop é uma opção popular para desenvolvimento porque tem suporte forte a recursos. O Docker Desktop no Windows permite alternar entre contêineres do Linux e contêineres Windows, para que você possa desenvolver módulos para diferentes tipos de dispositivos IoT Edge.

Use a documentação do Docker para instalar o Docker em seu computador de desenvolvimento:

Configurar ferramentas

Instale a ferramenta de desenvolvimento Azure IoT Edge baseada em Python para criar sua solução de IoT Edge. Você tem duas opções:

Importante

As ferramentas da extensão Azure IoT Edge para o Visual Studio Code estão no modo de manutenção. A ferramenta de desenvolvimento preferencial é a CLI (linha de comando) Azure IoT Edge Ferramenta de Desenvolvimento.

Use as extensões de IoT do Visual Studio Code para desenvolver os módulos de IoT Edge. Essas extensões oferecem modelos de projeto, automatizam a criação do manifesto de implantação e permitem monitorar e gerenciar IoT Edge dispositivos. Nesta seção, você instala Visual Studio Code e a extensão de IoT e, em seguida, configura sua conta de Azure para gerenciar IoT Hub recursos de dentro de Visual Studio Code.

  1. Instale a extensão Azure IoT Edge.
  2. Instale a extensão Azure IoT Hub.
  3. Depois de instalar as extensões, abra a paleta de comandos selecionando Exibir > Paleta de Comandos.
  4. Na paleta de comandos, pesquise e selecione Azure IoT Hub: Selecione IoT Hub. Siga os prompts para selecionar sua assinatura Azure e IoT Hub.
  5. Abra a seção explorer do Visual Studio Code selecionando o ícone na barra de atividades ou selecionando View > Explorer.
  6. Na parte inferior da seção do explorador, expanda o menu recolhido Azure IoT Hub/Devices. Você verá os dispositivos e dispositivos IoT Edge associados ao IoT Hub que você selecionou por meio da paleta de comandos.

Instalar ferramentas específicas da linguagem

Instale as ferramentas específicos da linguagem que você está usando para o desenvolvimento:

Criar um registro de contêiner

Neste tutorial, você usará as extensões Azure IoT Edge e Azure IoT Hub para criar um módulo e criar uma imagem de contêiner a partir dos arquivos. Em seguida, você envia essa imagem por push para um registro que armazena e gerencia suas imagens. Por fim, você implanta sua imagem do registro para ser executada em seu dispositivo IoT Edge.

Importante

A extensão Azure IoT Edge Visual Studio Code está no modo manutenção.

Você pode usar qualquer registro compatível com o Docker para manter as imagens de contêiner. Dois serviços populares de registro do Docker são Azure Container Registry e Docker Hub. Este tutorial usa Azure Container Registry.

Se você ainda não tiver um registro de contêiner, siga estas etapas para criar um novo no Azure:

  1. No portal Azure, selecione Criar um recurso>Containers>Container Registry.

  2. Forneça os seguintes valores obrigatórios para criar seu registro de contêiner:

    Campo Valor
    Subscrição Selecione uma assinatura na lista suspensa.
    Grupo de recursos Use o mesmo grupo de recursos para todos os recursos de teste criados durante os guias de início rápido e tutoriais do IoT Edge; por exemplo, IoTEdgeResources.
    Nome do registro Forneça um nome exclusivo.
    Localização Escolha um local perto de você.
    SKU Selecione Básico.
  3. Selecione Examinar + criar, depois Criar.

  4. Selecione o novo registro de contêiner na seção Resources da home page do portal Azure para abri-lo.

  5. No painel esquerdo do registro de contêiner, selecione Chaves de acesso no menu localizado em Configurações.

    Captura de tela do local do menu Teclas de Acesso.

  6. Habilite Usuário administrador com o botão de alternância e exiba o Nome de usuário e a Senha do seu registro de contêiner.

  7. Copie os valores para Servidor de logon, Nome de usuário e Senha e salve-os em um local conveniente. É possível usar esses valores neste tutorial para fornecer acesso ao registro de contêiner.

Criar um projeto de módulo

A extensão Azure IoT Edge oferece modelos de projeto para todos os idiomas de módulo de IoT Edge com suporte no Visual Studio Code. Esses modelos incluem todos os arquivos e código necessários para implantar um módulo de trabalho para testar IoT Edge ou fornecer um ponto de partida para personalizar o modelo com sua própria lógica de negócios.

Criar um modelo de projeto

A ferramenta de desenvolvimento IoT Edge simplifica Azure IoT Edge desenvolvimento, com comandos orientados por variáveis de ambiente. Ele ajuda você a começar no desenvolvimento do IoT Edge usando o contêiner de desenvolvimento IoT Edge e o scaffolding de solução do IoT Edge, que inclui um módulo padrão e todos os arquivos de configuração necessários.

  1. Crie um diretório para sua solução no caminho desejado. Altere para o diretório iotedgesolution.

    mkdir c:\dev\iotedgesolution
    cd c:\dev\iotedgesolution
    
  2. Use o comando iotedgedev solution init para criar uma solução e configurar seu Azure IoT Hub no idioma de desenvolvimento de sua escolha:

    iotedgedev solution init --template csharp
    

O iotedgedev solution init comando solicita que você conclua várias etapas, incluindo:

  • Autenticar no Azure
  • Escolher uma assinatura Azure
  • Escolher ou criar um grupo de recursos
  • Escolher ou criar um Azure IoT Hub
  • Escolher ou criar um dispositivo Azure IoT Edge

Use Visual Studio Code e a extensão Azure IoT Edge. Comece criando uma solução e, em seguida, gere o primeiro módulo nessa solução. Cada solução pode incluir vários módulos.

  1. Selecione Exibir > Paleta de Comandos.
  2. Na paleta de comandos, insira e execute o comando Azure IoT Edge: New IoT Edge Solution.
  3. Navegue até a pasta na qual deseja criar a nova solução e selecione Selecionar pasta.
  4. Digite um nome para a solução.
  5. Selecione um modelo de módulo para sua linguagem de desenvolvimento preferida para ser o primeiro módulo na solução.
  6. Digite um nome para o módulo. Escolha um nome exclusivo no registro de contêiner.
  7. Insira o nome do repositório de imagem do módulo. Visual Studio Code preenche automaticamente o nome do módulo com localhost:5000/<seu nome do módulo>. Substitua-o pelas informações de seu registro. Use localhost se você usa um registro local do Docker para testes. Se você usar o Azure Container Registry, use o servidor de login das configurações do seu registro. O servidor de entrada é semelhante ao <nome de registro>.azurecr.io. Substitua apenas a parte localhost:5000 da cadeia de caracteres, de modo que o resultado final se pareça com <nome do registro>.azurecr.io/<seu nome de módulo>.

Visual Studio Code usa as informações fornecidas, cria uma solução IoT Edge e carrega-a em uma nova janela.

Depois de criar a solução, esses arquivos principais estão na solução:

  • A pasta .vscode inclui o arquivo de configuração launch.json.

  • A pasta módulos tem subpastas para cada módulo. Em cada subpasta, o arquivo module.json controla como os módulos são criados e implantados.

  • O arquivo .env lista suas variáveis de ambiente. A variável de ambiente do registro de contêiner é localhost:5000 por padrão.

  • Dois arquivos de implantação de módulo, deployment.template.json e deployment.debug.template.json, listam os módulos a serem implantados em seu dispositivo. Por padrão, a lista inclui os módulos do sistema IoT Edge (edgeAgent e edgeHub) e módulos de exemplo, como:

    Observação

    Os módulos exatos instalados podem depender do idioma escolhido.

Definir a versão do runtime do IoT Edge

A versão estável mais recente do módulo de sistema IoT Edge é 1.5. Defina os módulos do sistema para a versão 1.5.

  1. Em Visual Studio Code, abra o arquivo de manifesto de implantação deployment.template.json. O manifesto de implantação é um documento JSON que descreve os módulos a serem configurados no dispositivo de IoT Edge de destino.

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

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

Forneça suas credenciais de registro para o agente de IoT Edge

O arquivo de ambiente armazena as credenciais do registro de contêiner e as compartilha com o runtime do IoT Edge. O runtime precisa dessas credenciais para obter suas imagens de contêiner no dispositivo IoT Edge.

A extensão IoT Edge tenta extrair as credenciais do registro de contêiner de Azure e preenchê-las no arquivo de ambiente.

Observação

O arquivo de ambiente será criado somente se você fornecer um repositório de imagens para o módulo. Se você aceitou os padrões do localhost para testar e depurar localmente, não será necessário declarar variáveis de ambiente.

Verifique se suas credenciais existem. Caso contrário, adicione-as agora:

  1. Se Azure Container Registry for seu registro, defina um Azure Container Registry nome de usuário e senha. Obtenha esses valores do menu Configurações>Chaves de Acesso no portal do Azure.

  2. Abra o arquivo .env em sua solução de módulo.

  3. Adicione os valores username e password copiados do registro de contêiner Azure. Por exemplo:

    CONTAINER_REGISTRY_SERVER="myacr.azurecr.io"
    CONTAINER_REGISTRY_USERNAME="myacr"
    CONTAINER_REGISTRY_PASSWORD="<registry_password>"
    
  4. Salve suas alterações no arquivo .env.

Observação

Este tutorial usa credenciais de administrador para Azure Container Registry convenientes para cenários de desenvolvimento e teste. Quando você estiver pronto para cenários de produção, recomendamos uma opção de autenticação com privilégios mínimos, como principais de serviço ou tokens limitados ao repositório. Para obter mais informações, confira Gerenciar o acesso ao registro de contêiner.

Arquitetura de destino

Selecione a arquitetura que você está direcionando para cada solução, pois isso afeta a forma como o contêiner é criado e executado. O padrão é o Linux AMD64. Para este tutorial, use uma máquina virtual do Ubuntu como o dispositivo IoT Edge e mantenha o padrão amd64.

Se você precisar alterar a arquitetura de destino para sua solução, siga estas etapas.

  1. Abra a paleta de comandos e pesquise por Azure IoT Edge: Definir Plataforma de Destino Padrão para Solução de Edge, ou selecione o ícone de atalho na barra lateral na parte inferior da janela.
  2. Na paleta de comandos, selecione a arquitetura de destino na lista de opções.

A arquitetura de destino é definida quando você cria a imagem de contêiner em uma etapa posterior.

Atualizar o módulo com código personalizado

Cada modelo inclui um código de exemplo que usa dados simulados do sensor do módulo SimulatedTemperatureSensor e os roteia para o IoT Hub. O módulo de exemplo recebe mensagens e as transmite. A funcionalidade de pipeline mostra um conceito importante em IoT Edge: como os módulos se comunicam entre si.

Cada módulo pode ter várias filas de entrada e saída declaradas em seu código. O hub IoT Edge em execução no dispositivo roteia mensagens da saída de um módulo para a entrada de um ou mais módulos. O código específico para declarar entradas e saídas varia entre idiomas, mas o conceito é o mesmo para todos os módulos. Para saber mais sobre o roteamento entre módulos, confira Declarar rotas.

O código C# de exemplo que vem com o modelo de projeto usa a classe ModuleClient do SDK do IoT Hub para .NET.

  1. No Visual Studio Code Explorer, abra modules > filtermodule > ModuleBackgroundService.cs.

  2. Antes do filtermodule namespace, adicione três using instruções para tipos usados posteriormente:

    using System.Collections.Generic;     // For KeyValuePair<>
    using Microsoft.Azure.Devices.Shared; // For TwinCollection
    using Newtonsoft.Json;                // For JsonConvert
    
  3. Adicione a temperatureThreshold variável à ModuleBackgroundService classe. Essa variável define o valor que a temperatura medida deve exceder para que os dados sejam enviados para o IoT Hub.

    static int temperatureThreshold { get; set; } = 25;
    
  4. Adicione as classes MessageBody, Machine e Ambient. Essas classes definem o esquema esperado para o corpo de mensagens de entrada.

    class MessageBody
    {
        public Machine machine {get;set;}
        public Ambient ambient {get; set;}
        public string timeCreated {get; set;}
    }
    class Machine
    {
        public double temperature {get; set;}
        public double pressure {get; set;}
    }
    class Ambient
    {
        public double temperature {get; set;}
        public int humidity {get; set;}
    }
    
  5. Localize a função ExecuteAsync. Essa função cria e configura um objeto ModuleClient que permite que o módulo se conecte ao runtime de Azure IoT Edge local para enviar e receber mensagens. Depois de criar o ModuleClient, o código lê o valor temperatureThreshold das propriedades desejadas do módulo gêmeo. O código registra um callback para receber mensagens de um hub IoT Edge via um endpoint chamado input1.

    Substitua a chamada para o método ProcessMessageAsync por uma nova que atualize o nome do ponto de extremidade e o método chamado quando a entrada chega. Além disso, adicione um SetDesiredPropertyUpdateCallbackAsync método para atualizações às propriedades desejadas. Para fazer essa alteração, substitua a última linha do ExecuteAsync método pelo seguinte código:

    // Register a callback for messages that are received by the module.
    // await _moduleClient.SetInputMessageHandlerAsync("input1", PipeMessage, cancellationToken);
    
    // Read the TemperatureThreshold value from the module twin's desired properties
    var moduleTwin = await _moduleClient.GetTwinAsync();
    await OnDesiredPropertiesUpdate(moduleTwin.Properties.Desired, _moduleClient);
    
    // Attach a callback for updates to the module twin's desired properties.
    await _moduleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertiesUpdate, null);
    
    // Register a callback for messages that are received by the module. Messages received on the inputFromSensor endpoint are sent to the FilterMessages method.
    await _moduleClient.SetInputMessageHandlerAsync("inputFromSensor", FilterMessages, _moduleClient);
    
  6. Adicione o OnDesiredPropertiesUpdate método à ModuleBackgroundService classe. Esse método recebe atualizações nas propriedades desejadas do módulo gêmeo e atualiza a temperatureThreshold variável para corresponder. Todos os módulos possuem seu próprio módulo gêmeo, o que permite configurar o código em execução dentro de um módulo diretamente da nuvem.

    static Task OnDesiredPropertiesUpdate(TwinCollection desiredProperties, object userContext)
    {
        try
        {
            Console.WriteLine("Desired property change:");
            Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    
            if (desiredProperties["TemperatureThreshold"]!=null)
                temperatureThreshold = desiredProperties["TemperatureThreshold"];
    
        }
        catch (AggregateException ex)
        {
            foreach (Exception exception in ex.InnerExceptions)
            {
                Console.WriteLine();
                Console.WriteLine("Error when receiving desired property: {0}", exception);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error when receiving desired property: {0}", ex.Message);
        }
        return Task.CompletedTask;
    }
    
  7. Adicione o método FilterMessages. Esse método é chamado sempre que o módulo recebe uma mensagem do hub IoT Edge. Ele filtra as mensagens que reportam temperaturas abaixo do limite de temperatura definido através do módulo gêmeo. Ele também adiciona a MessageType propriedade à mensagem com o valor definido como Alert:

    async Task<MessageResponse> FilterMessages(Message message, object userContext)
    {
        var counterValue = Interlocked.Increment(ref _counter);
        try
        {
            ModuleClient moduleClient = (ModuleClient)userContext;
            var messageBytes = message.GetBytes();
            var messageString = Encoding.UTF8.GetString(messageBytes);
            Console.WriteLine($"Received message {counterValue}: [{messageString}]");
    
            // Get the message body.
            var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString);
    
            if (messageBody != null && messageBody.machine.temperature > temperatureThreshold)
            {
                Console.WriteLine($"Machine temperature {messageBody.machine.temperature} " +
                    $"exceeds threshold {temperatureThreshold}");
                using (var filteredMessage = new Message(messageBytes))
                {
                    foreach (KeyValuePair<string, string> prop in message.Properties)
                    {
                        filteredMessage.Properties.Add(prop.Key, prop.Value);
                    }
    
                    filteredMessage.Properties.Add("MessageType", "Alert");
                    await moduleClient.SendEventAsync("output1", filteredMessage);
                }
            }
    
            // Indicate that the message treatment is completed.
            return MessageResponse.Completed;
        }
        catch (AggregateException ex)
        {
            foreach (Exception exception in ex.InnerExceptions)
            {
                Console.WriteLine();
                Console.WriteLine("Error in sample: {0}", exception);
            }
            // Indicate that the message treatment is not completed.
            var moduleClient = (ModuleClient)userContext;
            return MessageResponse.Abandoned;
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error in sample: {0}", ex.Message);
            // Indicate that the message treatment is not completed.
            ModuleClient moduleClient = (ModuleClient)userContext;
            return MessageResponse.Abandoned;
        }
    }
    
  8. Salve o arquivo ModuleBackgroundService.cs.

  9. No Visual Studio Code Explorer, abra o arquivo deployment.template.json no workspace da solução IoT Edge.

  10. Como alteramos o nome do ponto de extremidade que o módulo escuta, também precisamos atualizar as rotas no manifesto de implantação para que o edgeHub envie mensagens para o novo ponto de extremidade.

    Localize a routes seção no módulo gêmeo $edgeHub . Atualize a rota sensorTofiltermodule para substituir input1 por inputFromSensor:

    "sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"
    
  11. Adicione o módulo gêmeo filtermodule ao manifesto de implantação. Insira o seguinte conteúdo JSON na parte inferior da modulesContent seção, após o módulo gêmeo $edgeHub:

       "filtermodule": {
           "properties.desired":{
               "TemperatureThreshold":25
           }
       }
    
  12. Salve o arquivo deployment.template.json.

Compilar e enviar por push sua solução

Você atualizou o código do módulo e o modelo de implantação para ajudar na compreensão de alguns conceitos importantes de implantação. Agora você está pronto para criar a imagem de contêiner do módulo e efetuar push dela para seu registro de contêiner.

Em Visual Studio Code, abra o arquivo de manifesto de implantação deployment.template.json. O manifesto de implantação descreve os módulos a serem configurados no dispositivo de destino da IoT Edge. Antes da implantação, você deve atualizar suas credenciais de Azure Container Registry e suas imagens de módulo com os valores de createOptions adequados. Para obter mais informações sobre createOptions valores, consulte Como configurar opções de criação de contêiner para módulos IoT Edge.

Se você usar um Azure Container Registry para armazenar a imagem do módulo, adicione suas credenciais à seção modulesContent > edgeAgent > settings > registryCredentials em deployment.template.json. Substitua pelo myacr seu próprio nome de registro e forneça sua senha e endereço do servidor de logon. Por exemplo:

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

Adicione ou substitua o seguinte conteúdo stringificado ao valor createOptions para cada sistema (edgeHub e *edgeAgent) e módulo personalizado (filtermodule e tempSensor) listados. Altere os valores, se necessário:

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

Por exemplo, a filtermodule configuração deve ser semelhante a:

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

Criar imagem do Docker do módulo

Abra o terminal integrado Visual Studio Code selecionando Terminal > Novo Terminal.

Use o comando dotnet publish para compilar a imagem de contêiner para a arquitetura Linux e amd64. Altere o diretório para o diretório filtermodule em seu projeto e execute o dotnet publish comando.

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

Atualmente, o modelo de ferramenta iotedgedev tem como destino .NET 7.0, que chegou ao fim do suporte em maio de 2024. Atualize o projeto para .NET 8.0 (LTS, com suporte até novembro de 2026) editando o arquivo filtermodule.csproj e alterando os valores TargetFramework e PackageReference. Seu arquivo filtermodule.csproj deve ter esta aparência:

<Project Sdk="Microsoft.NET.Sdk.Worker">
    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Devices.Client" Version="1.42.0" />
        <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
    </ItemGroup>
</Project>

Marque a imagem do Docker com as informações, versão e arquitetura do registro de contêiner. Substitua myacr pelo seu próprio nome de registro:

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

Enviar por push a imagem do Docker do módulo

Forneça suas credenciais de registro de contêiner para o Docker para que ele possa efetuar push de sua imagem de contêiner para ser armazenada no registro.

  1. Entre no Docker com as credenciais de Azure Container Registry (ACR):

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

    Talvez você receba um aviso de segurança recomendando usar --password-stdin. Embora essa melhor prática seja recomendada para cenários de produção, ela não serve para este tutorial. Para autenticação do registro de contêiner de produção, use uma entidade de serviço ou tokens com escopo de repositório em vez de credenciais de administrador. Para obter mais informações, consulte Gerenciar acesso ao registro de contêineres e a referência de docker login.

  2. Entre no Azure Container Registry. Você deve instalar Azure CLI para usar o comando az. Este comando solicita o seu nome de usuário e senha encontrados no registro de contêiner em Configurações > Chaves de Acesso:

    az acr login -n <ACR registry name>
    

    Dica

    Se você for desconectado em algum momento deste tutorial, repita as etapas de login do Docker e do Azure Container Registry para continuar.

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

    docker push <ImageName>
    

    Por exemplo:

    # Push the Docker image to the local registry
    
    docker push localhost:5000/filtermodule:0.0.1-amd64
    
    # Or push the Docker image to an Azure Container Registry. Replace myacr with your Azure Container Registry name.
    
    az acr login --name myacr
    docker push myacr.azurecr.io/filtermodule:0.0.1-amd64
    

Atualizar o modelo de implantação

Atualize o modelo de implantação deployment.template.json com o local da imagem do registro de contêiner. Por exemplo, se você estiver usando um Azure Container Registry myacr.azurecr.io e sua imagem estiver filtermodule:0.0.1-amd64, atualize a configuração filtermodule para:

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

No Visual Studio Code Explorer, clique com o botão direito do mouse no arquivo deployment.template.json e selecione Build e Push IoT Edge Solution.

O comando de criação e de envio por push inicia três operações. Primeiro, é criada uma pasta na solução denominada config que contém o manifesto de implantação completo, criado com base nas informações do modelo de implantação e em outros arquivos da solução. Depois, ele executa docker build para montar a imagem de contêiner com base no dockerfile apropriado para sua arquitetura de destino. Por fim, ele executa docker push para enviar por push o repositório de imagens para seu registro de contêiner.

Esse processo pode levar vários minutos na primeira vez, mas é mais rápido na próxima vez que você executar os comandos.

Opcional: atualizar o módulo e a imagem

Se você fizer alterações no código do módulo, deverá recompilar e enviar por push a imagem do módulo para o registro de contêiner. Use as etapas nesta seção para atualizar a compilação e a imagem de contêiner. Você poderá ignorar esta seção se não tiver feito nenhuma alteração no código do módulo.

Abra o arquivo deployment.amd64.json na pasta de configuração recém-criada. O nome do arquivo reflete a arquitetura de destino; portanto, ele será diferente se você escolher uma arquitetura diferente.

Observe que os dois parâmetros que têm espaços reservados agora são contém seus valores adequados. A registryCredentials seção tem seu nome de usuário e senha do Registro extraídos do arquivo .env . O filtermodule possui o repositório de imagem completo com o nome, a versão e a marca de arquitetura do arquivo module.json.

  1. Abra o arquivo module.json na pasta filtermodule.

  2. Altere o número de versão da imagem de módulo. Por exemplo, incremente o número de versão de patch para "version": "0.0.2" como se você tivesse feito uma pequena correção no código do módulo.

    Dica

    As versões do módulo habilitam o controle de versão e permitem que você teste as alterações em um pequeno conjunto de dispositivos antes de implantar atualizações na produção. Se você não incrementar a versão de módulo antes de criar e efetuar push, então você substituirá o repositório em seu registro de contêiner.

  3. Salve as alterações no arquivo module.json.

Crie e efetue push da imagem atualizada com uma marca de versão 0.0.2. Por exemplo, para compilar e enviar por push a imagem para o registro local ou um registro de contêiner Azure, use os seguintes comandos:

# Build the container image for Linux and amd64 architecture.

dotnet publish --os linux --arch x64

# For local registry:
# Tag the image with version 0.0.2, x64 architecture, and the local registry.

docker tag filtermodule localhost:5000/filtermodule:0.0.2-amd64

# For Azure Container Registry:
# Tag the image with version 0.0.2, x64 architecture, and your container registry information. Replace **myacr** with your own registry name.

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

Clique com o botão direito do mouse no arquivo deployment.template.json novamente e selecione Build e Push IoT Edge Solution novamente.

Abra o arquivo deployment.amd64.json novamente. Observe que o sistema de build não cria um novo arquivo ao executar o comando build e efetuar push novamente. Em vez disso, o mesmo arquivo foi atualizado para refletir as alterações. Agora a imagem filtermodule aponta para a versão 0.0.2 do contêiner.

Para verificar ainda mais o que o comando build e push fez, acesse o Azure portal e navegue até o registro de contêiner. No registro de contêiner, selecione Repositórios e, sem seguida, filtermodule. Verifique se as duas versões da imagem foram enviadas por push para o registro.

Captura de tela de onde exibir as duas versões de imagem no registro de contêiner.

Solucionar problemas

Se encontrar erros ao criar e enviar sua imagem de módulo por push, isso geralmente estará relacionado à configuração do Docker em seu computador de desenvolvimento. Use as seguintes verificações para examinar sua configuração:

  • Você executou o comando docker login usando as credenciais que copiou do seu registro de contêiner? Essas credenciais são diferentes das que você usa para entrar no Azure.
  • Seu repositório de contêiner está correto? Ele tem seu nome de registro de contêiner correto e seu nome de módulo correto? Abra o arquivo module.json na pasta filtermodule para verificar. O valor do repositório deve ser semelhante ao <nome> do registro.azurecr.io/filtermodule.
  • Se você usou um nome diferente de filtermodule para o seu módulo, esse nome está consistente em toda a solução?
  • Seu computador está executando o mesmo tipo de contêineres que você está criando? Este tutorial é para dispositivos linux IoT Edge, portanto, Visual Studio Code deve dizer amd64 ou arm32v7 na barra lateral e o Docker Desktop deve estar executando contêineres do Linux.

Implantar módulos no dispositivo

Você verificou que as imagens de contêineres criadas estão armazenadas em seu registro de contêiner; portanto, chegou a hora de implantá-las em um dispositivo. Verifique se o dispositivo IoT Edge está em execução.

Use o comando IoT Edge Azure CLI set-modules para implantar os módulos no Azure IoT Hub. Por exemplo, para implantar os módulos definidos no arquivo deployment.template.json no IoT Hub my-iot-hub para o dispositivo IoT Edge my-device, use o comando a seguir. Substitua os valores hub-name, device-id e login da cadeia de conexão do Hub IoT pelos seus próprios.

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

Dica

Encontre seu IoT Hub connection string, incluindo a chave de acesso compartilhado, no portal do Azure. Vá para o IoT Hub e selecione as Configurações de segurança > Políticas de acesso compartilhado > iothubowner.

  1. No Visual Studio Code Explorer, na seção Azure IoT Hub, expanda Devices para ver sua lista de dispositivos IoT.

  2. Clique com o botão direito do mouse no dispositivo IoT Edge no qual você deseja implantar e selecione Create Deployment for Single Device.

  3. No explorador de arquivos, navegue até a pasta config e selecione o arquivo deployment.amd64.json.

    Não use o arquivo deployment.template.json, que não tem as credenciais de registro de contêiner ou os valores de imagem de módulo nele. Se você direcionar um dispositivo Linux ARM32, o nome do manifesto de implantação será deployment.arm32v7.json.

  4. No dispositivo, expanda Módulos para ver uma lista de módulos implantados e em execução. Selecione o botão Atualizar. Você deve ver os novos módulos tempSensor e filtermodule em execução em seu dispositivo.

    Pode levar alguns minutos para os módulos serem iniciados. O ambiente de execução do IoT Edge recebe seu novo manifesto de implantação, baixa as imagens dos módulos a partir do ambiente de execução do contêiner e, em seguida, inicia cada novo módulo.

Exibir mensagens do dispositivo

O código do módulo de exemplo obtém mensagens por meio de sua fila de entrada e as envia por meio de sua fila de saída. O manifesto de implantação configura rotas que enviam mensagens para filtermodule de tempSensor, e encaminha mensagens de filtermodule para o IoT Hub. As extensões Azure IoT Edge e Azure IoT Hub permitem que você veja as mensagens quando elas chegam ao IoT Hub do seu dispositivo.

  1. No explorador do Visual Studio Code, selecione o dispositivo IoT Edge que você deseja monitorar e selecione Start Monitoring Built-in Event Endpoint.

  2. Observe a janela de saída de dados no Visual Studio Code para ver as mensagens que chegam ao seu IoT Hub.

    Captura de tela da janela de saída do Visual Studio Code mostrando mensagens de dispositivo para nuvem.

Exibir alterações no dispositivo

Para ver o que está acontecendo em seu dispositivo, use os comandos nesta seção para inspecionar o IoT Edge runtime e os módulos em execução em seu dispositivo.

Esses comandos são para seu dispositivo IoT Edge, não para seu computador de desenvolvimento. Se você estiver usando uma máquina virtual para seu dispositivo IoT Edge, conecte-se a ela agora. Em Azure, acesse a página de visão geral da máquina virtual e selecione Connect para acessar a conexão de shell seguro.

  • Exiba todos os módulos implantados em seu dispositivo e verifique seu status:

    iotedge list
    

    Você verá quatro módulos: os dois módulos de runtime IoT Edge, tempSensor e filtermodule. Todos os quatro devem estar listados como em execução.

  • Inspecione os logs para ver se há um módulo específico:

    iotedge logs <module name>
    

    Os nomes dos módulos diferenciam maiúsculas de minúsculas.

    Os logs tempSensor e filtermodule mostram as mensagens que estão processando. O módulo edgeAgent inicia os outros módulos, para que seus logs tenham informações sobre o manifesto de implantação. Se um módulo não estiver listado ou não estiver em execução, verifique se há erros nos logs do edgeAgent. O módulo edgeHub gerencia a comunicação entre os módulos e IoT Hub. Se os módulos estiverem em execução, mas as mensagens não chegarem à sua IoT Hub, verifique os logs edgeHub para ver se há erros.

Limpar os recursos

Se você quiser continuar para o próximo artigo recomendado, mantenha os recursos e configurações criados e reutilize-os. Você também pode continuar usando o mesmo dispositivo IoT Edge como um dispositivo de teste. Caso contrário, para evitar encargos, exclua a configuração local e os recursos Azure usados neste artigo.

Excluir recursos de Azure

Não é possível desfazer a exclusão dos recursos do Azure e grupos de recursos. Não exclua acidentalmente grupo de recursos ou recursos incorretos. Se você criou o IoT Hub dentro de um grupo de recursos existente que tem recursos que deseja manter, exclua apenas o recurso IoT Hub em si, não o grupo de recursos.

Para excluir os recursos:

  1. Entre no Azure portal e selecione Resource groups.
  2. Selecione o nome do grupo de recursos que contém seus recursos de teste IoT Edge.
  3. Examine a lista de recursos que seu grupo de recursos contém. Se você deseja excluir todos eles, selecione Excluir grupo de recursos. Se você quiser excluir apenas alguns deles, selecione cada recurso para excluí-los individualmente.

Próximas etapas

Neste tutorial, você configura Visual Studio Code em seu computador de desenvolvimento e implanta seu primeiro módulo de IoT Edge com código que filtra os dados brutos gerados pelo dispositivo IoT Edge.

Continue para os próximos tutoriais para saber como o Azure IoT Edge permite implantar serviços de nuvem do Azure para processar e analisar dados na extremidade.