Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:
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:
- Execute IoT Edge em um dispositivo separado. Manter o computador de desenvolvimento e IoT Edge dispositivo separado simula um cenário de implantação real e ajuda a manter os conceitos claros. Use o artigo de início rápido Implantar código em um dispositivo Linux para criar um dispositivo IoT Edge no Azure ou o modelo do Azure Resource Manager para implantar uma VM habilitada para IoT Edge.
Recursos de nuvem:
- Use uma camada Azure IoT Hub gratuita ou padrão.
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:
- Debug Azure IoT Edge módulos usando Visual Studio Code
- Use Visual Studio 2022 para desenvolver e depurar módulos para Azure IoT Edge
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:
Instale o Docker Desktop para Windows. Ao instalar o Docker Desktop para Windows, você será questionado se deseja usar o Linux ou Windows contêineres. Você pode alterar essa configuração a qualquer momento. Este tutorial usa contêineres do Linux porque os módulos têm como destino dispositivos Linux. Para obter mais informações, consulte Switch entre contêineres Windows e Linux.
Leia Sobre o Docker CE para obter informações sobre a instalação em várias plataformas do Linux. Para o Windows Subsystem for Linux (WSL), instale o Docker Desktop para Windows.
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:
- Use o contêiner de desenvolvimento IoT Edge predefinido.
- Instale a ferramenta usando a configuração de desenvolvimento iotedgedev.
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.
- Instale a extensão Azure IoT Edge.
- Instale a extensão Azure IoT Hub.
- Depois de instalar as extensões, abra a paleta de comandos selecionando Exibir > Paleta de Comandos.
- Na paleta de comandos, pesquise e selecione Azure IoT Hub: Selecione IoT Hub. Siga os prompts para selecionar sua assinatura Azure e IoT Hub.
- Abra a seção explorer do Visual Studio Code selecionando o ícone na barra de atividades ou selecionando View > Explorer.
- 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:
No portal Azure, selecione Criar um recurso>Containers>Container Registry.
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. Selecione Examinar + criar, depois Criar.
Selecione o novo registro de contêiner na seção Resources da home page do portal Azure para abri-lo.
No painel esquerdo do registro de contêiner, selecione Chaves de acesso no menu localizado em Configurações.
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.
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.
Crie um diretório para sua solução no caminho desejado. Altere para o diretório
iotedgesolution.mkdir c:\dev\iotedgesolution cd c:\dev\iotedgesolutionUse o comando
iotedgedev solution initpara criar uma solução e configurar seu Azure IoT Hub no idioma de desenvolvimento de sua escolha:
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.
- Selecione Exibir > Paleta de Comandos.
- Na paleta de comandos, insira e execute o comando Azure IoT Edge: New IoT Edge Solution.
- Navegue até a pasta na qual deseja criar a nova solução e selecione Selecionar pasta.
- Digite um nome para a solução.
- Selecione um modelo de módulo para sua linguagem de desenvolvimento preferida para ser o primeiro módulo na solução.
- Digite um nome para o módulo. Escolha um nome exclusivo no registro de contêiner.
- 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:
- filtermodule é um módulo de exemplo que implementa uma função de filtro simples.
- O módulo SimulatedTemperatureSensor simula os dados que você pode usar para teste. Para obter mais informações sobre o funcionamento dos manifestos de implantação, consulte Saiba como usar manifestos de implantação para implantar módulos e estabelecer rotas. Para obter mais informações sobre como o módulo de temperatura simulado funciona, consulte o código-fonte SimulatedTemperatureSensor.csproj.
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.
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.
Altere a versão de runtime das imagens do módulo de runtime do sistema
edgeAgenteedgeHub. 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:
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.
Abra o arquivo .env em sua solução de módulo.
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>"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.
- 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.
- 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.
No Visual Studio Code Explorer, abra modules > filtermodule > ModuleBackgroundService.cs.
Antes do
filtermodulenamespace, adicione trêsusinginstruções para tipos usados posteriormente:using System.Collections.Generic; // For KeyValuePair<> using Microsoft.Azure.Devices.Shared; // For TwinCollection using Newtonsoft.Json; // For JsonConvertAdicione a
temperatureThresholdvariável àModuleBackgroundServiceclasse. 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;Adicione as classes
MessageBody,MachineeAmbient. 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;} }Localize a função
ExecuteAsync. Essa função cria e configura um objetoModuleClientque permite que o módulo se conecte ao runtime de Azure IoT Edge local para enviar e receber mensagens. Depois de criar oModuleClient, o código lê o valortemperatureThresholddas propriedades desejadas do módulo gêmeo. O código registra um callback para receber mensagens de um hub IoT Edge via um endpoint chamadoinput1.Substitua a chamada para o método
ProcessMessageAsyncpor uma nova que atualize o nome do ponto de extremidade e o método chamado quando a entrada chega. Além disso, adicione umSetDesiredPropertyUpdateCallbackAsyncmétodo para atualizações às propriedades desejadas. Para fazer essa alteração, substitua a última linha doExecuteAsyncmé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);Adicione o
OnDesiredPropertiesUpdatemétodo àModuleBackgroundServiceclasse. Esse método recebe atualizações nas propriedades desejadas do módulo gêmeo e atualiza atemperatureThresholdvariá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; }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 aMessageTypepropriedade à mensagem com o valor definido comoAlert: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; } }Salve o arquivo ModuleBackgroundService.cs.
No Visual Studio Code Explorer, abra o arquivo deployment.template.json no workspace da solução IoT Edge.
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
routesseção no módulo gêmeo $edgeHub . Atualize a rotasensorTofiltermodulepara substituirinput1porinputFromSensor:"sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"Adicione o módulo gêmeo filtermodule ao manifesto de implantação. Insira o seguinte conteúdo JSON na parte inferior da
modulesContentseção, após o módulo gêmeo $edgeHub:"filtermodule": { "properties.desired":{ "TemperatureThreshold":25 } }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.
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.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 emConfiguraçõ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.
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.
Abra o arquivo module.json na pasta filtermodule.
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.
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.
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 loginusando 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.
No Visual Studio Code Explorer, na seção Azure IoT Hub, expanda Devices para ver sua lista de dispositivos IoT.
Clique com o botão direito do mouse no dispositivo IoT Edge no qual você deseja implantar e selecione Create Deployment for Single Device.
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.
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.
No explorador do Visual Studio Code, selecione o dispositivo IoT Edge que você deseja monitorar e selecione Start Monitoring Built-in Event Endpoint.
Observe a janela de saída de dados no Visual Studio Code para ver as mensagens que chegam ao seu IoT Hub.
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 listVocê 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:
- Entre no Azure portal e selecione Resource groups.
- Selecione o nome do grupo de recursos que contém seus recursos de teste IoT Edge.
- 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.