Introdução ao Azure IoT Edge com Raspberry Pi 4

No artigo introdutório conhecemos um pouco do que o Azure tem a nos oferecer quando o assunto é IoT e conhecemos dois tipos de dispositivo: dispositivos IoT e dispositivos IoT Edge.  

Os dispositivos IoT Edge, diferentes dos dispositivos puramente IoT que geralmente são MCUs ou SOCs, são usualmente dispositivos mais robustos, como uma Raspberry Pi ou mesmo um servidor, que executam serviços do Azure localmente ou aplicações customizadas encapsuladas dentro de contêineres compatíveis com Docker e transferem parte dos resultados para a nuvem, compondo soluções híbridas (parte na borda, parte na nuvem). 

Essa arquitetura traz como vantagens a redução da latência e o aumento da segurança quando usado como gateway, por exemplo, porque reduz o número de exposições de dispositivos na rede pública. Existe também a possibilidade de implantar uma hierarquia de dispositivos para atender cenários de redes híbridas com  dispositivos IoT utilizam protocolos como LoRaWAN, Modbus, entre outros.

Neste tutorial mostrarei como transformar do zero uma Raspberry Pi em um dispositivo IoT Edge, conectá-la ao IoT Hub e fazer o deploy de um módulo que simula dados de temperatura, umidade e pressão de uma máquina e de um ambiente.

Pré-requisitos

  • Uma conta do Azure e uma subscription com créditos.

Caso você ainda não tenha uma conta do Azure, crie uma conta gratuita seguindo as instruções deste link: https://azure.microsoft.com/pt-br/free/.

Esta subscription disponibiliza US$ 200,00 de créditos que podem ser usados em até 30 dias. 

  • Azure CLI

Algumas instruções aqui utilizam a Azure CLI (Command Line Interface) que permite o gerenciamento e manipulação de recursos do Azure via linha de comando. Ela pode ser instalada no Linux, no Windows, MacOS ou ainda pode ser acessada de dentro do Portal do Azure, através do Cloud Shell. 

Para instalá-la na sua máquina: https://docs.microsoft.com/pt-br/cli/azure/install-azure-cli

Para usar o Cloud Shell no Portal do Azure, acesse o portal e clique no ícone abaixo no canto superior direito :

Figura 1 – Ícone Cloud Shell no Portal do Azure.
  • Dispositivo IoT Edge:

DevKit Utilizado: 1 Raspberry Pi 4 Model B. (É esperado que funcione com outros modelos de Raspberry Pi).

SO: Raspberry Pi OS versão Desktop baseado no Debian Bullseye 

Hands-On

 Nesta sessão de Hands-on criaremos uma solução IoT Edge do zero. Vou te mostrar como instalar o IoT Edge Runtime, utilizar um módulo do Marketplace e fazer o deploy. Uma solução IoT Edge pode vir em “diferentes sabores”, portanto, eu vou lhes apresentar as opções que temos disponíveis e o caminho que usaremos.

Escolhendo o provisionamento

Primeiro, precisamos definir qual o método de provisionamento usaremos. 

O provisionamento é um processo de duas etapas: 

  1. A primeira consiste no registro do dispositivo em um IoT Hub. O registro gera uma identidade na qual o dispositivo utilizará para se conectar ao IoT Hub.
  2. A segunda consiste em configurar o dispositivo com sua identidade.

    A tabela a seguir mostra os dois tipos de provisionamento existentes e os métodos de autenticação que cada um deles suporta. Estes métodos são utilizados para garantir autenticidade entre o IoT Hub e o IoT Edge.

Provisionamento Manual(Programador deve fazer manualmente para cada dispositivo)Métodos:Certificados X.509Chaves Simétricas
Provisionamento Automático(Programador utiliza o DPS – Device Provisioning Service- para registrar automaticamente múltiplos dispositivos no IoT Hub)Métodos:Certificados X.509Chaves SimétricasTPM

Como buscamos aqui construir uma solução rápida e para fins de demonstração usaremos o provisionamento manual com autenticação via chave simétrica. Em um cenário de produção, deveríamos usar o provisionamento automático para criar uma solução escalável e certificados X.509 para uma solução mais segura. 

Escolhendo o Sistema Operacional dos containers e do Host

Um dispositivo IoT Edge consiste basicamente em um dispositivo com um sistema operacional executando o IoT Edge Runtime, que é uma coletânea de software que permite o gerenciamento dos módulos do IoT Edge, que são pacotes executáveis compatíveis com contêineres Docker.

O Sistema Operacional que executa o IoT Edge Runtime é chamado de host OS, enquanto o sistema operacional nos quais os contêineres são baseados é chamado Sistema Operacional dos contêineres.

Há várias combinações possíveis:

  • Contêineres baseado em Linux  no Linux host OS.
  • Contêineres baseado em Linux no Windows host OS.
  • Contêineres baseado em Windows no Windows host OS.

    Aqui, vamos adotar a primeira solução porque é a única solução que suporta a versão mais atualizada do IoT Edge Runtime no presente momento do desenvolvimento deste artigo.

Para implantar nossa solução, seguiremos as seguintes fases e instruções: 

  1. Criar um IoT Hub.
  2. Registrar um dispositivo Edge no IoT Hub.
  3. Obter a Connection String usada pelo dispositivo.
  4. Instalar o Edge Runtime no dispositivo Edge. 
  5. Configurar o dispositivo com sua Connection String.
  6. Realizar o deploy de módulos para o dispositivo.
  7. Monitorar as mensagens vindas do módulo no IoT Hub.

1 – Crie uma instância de um IoT Hub.

    Antes, a partir do seu computador (pode ser de um terminal do Linux, do Power Shell ou ainda do Cloud Shell no Portal do Azure), faça o login na sua conta do Azure antes de iniciar os comandos:

    Adicione a extensão azure-iot para gerenciar serviços de IoT pela CLI:

    Crie um resource group:

  Crie um IoT Hub. Use um nome único para o seu IoT Hub e depois utilize este nome nos comandos que necessitarem dele.

2 – Crie uma identidade para o dispositivo, ao qual ele irá se conectar, no IoT Hub (Provisionamento). Essa etapa registra o dispositivo com um ID e o associa ao recém-criado IoT Hub.

3 – Recupere a string de conexão que será usada no dispositivo posteriormente para se conectar a sua identidade no IoT Hub.

Guarde a string para usar posteriormente (sem as aspas duplas).

4 – Instale o IoT Edge Runtime.

Antes de instalar o IoT Edge Runtime, precisamos de preparar o dispositivo resolvendo as dependências. Para isso, acesse seu dispositivo, por exemplo, via SSH, e execute as seguintes instruções:

  • Faça o download de pacotes de configuração do repositório da Microsoft, conforme comando abaixo:

Raspberry Pi OS

Copie para o diretório sources.list.d.

Instale a chave pública GPG Microsoft.

  • O Azure IoT Edge depende de uma container engine. Para ambientes de produção é aconselhável usar a Moby Engine, pois é a única engine oficialmente suportada pelo IoT Edge. Porém, a versão mais recente do Raspberry Pi OS baseada no Debian Bullseye não possui algumas configurações do kernel habilitadas que são dependências para a Moby Engine. Portanto, neste artigo, vamos instalar o Docker Engine, que é bem suportado por este OS.

        Garanta que os repositórios e o sistema estão atualizados:

Faça o download do script de instalação do Docker e o execute em seguida:

Ao fim da execução do script, deve ser exibido na tela informações do cliente e servidor Docker, versões, etc.

Por conveniência, para não precisar usar sudo nos comandos docker, adicione seu usuário ao grupo docker:

Faça logout para que a mudança tenha efeito:

Isso irá te deslogar da conexão SSH, acesse a placa Raspberry Pi novamente.

Cheque que a instalação foi bem sucedida. Consulte a versão:

A saída esperada deve ser como essa:

Figura 2 – Resultado esperado do comando docker version.

Use o seguinte comando para fazer o download de uma imagem de teste chamada “hello-world” e executá-la para confirmar que o docker está funcional:

O resultado esperado deve ser similar a imagem abaixo:

Figura 3 – Resultado esperado do comando docker run hello-world.

Finalmente, instale a versão mais atualizada do IoT Edge Runtime.

5 – Vamos agora à segunda etapa do provisionamento manual, configurando o dispositivo com sua string de conexão que o permite conectar a sua identidade na nuvem. O comando iotedge config mp cria um arquivo de configuração no dispositivo e adiciona a string de conexão passada como argumento. Utilize o seguinte comando usando a string que você guardou anteriormente.

    Aplique às mudanças:

    Se tudo ocorreu bem, você deve ter uma tela como essa:

Figura 4 – Resultado esperado do comando sudo iotedge config apply.

Verifique o status do serviço do IoT Edge:

O resultado esperado deve ser como este:

Figura 5 – Resultado esperado do comando sudo iotedge system status.

Execute o seguinte comando para verificar se as configurações foram aplicadas corretamente e que a conectividade está bem sucedida.

O resultado esperado deve ser como este:

Figura 6 – Resultado esperado do comando sudo iotedge check.

O erro acima é esperado porque o módulo edgeHub ainda não foi criado. Será criado numa próxima etapa.

Execute o seguinte comando para visualizar os módulos em execução no seu dispositivo edge:

O resultado esperado deve ser como este:

Figura 7 – Resultado esperado do comando sudo iotedge list.

Inicialmente, teremos apenas o módulo edgeAgent e ele será o responsável tanto pela instalação de módulos adicionais, inclusive o módulo edgeHub, e pelo monitoramento dos módulos. O módulo edgeHub gerencia a comunicação entre os módulos e entre o dispositivo Edge e o IoT Hub.

Acesse o portal do Azure e verifique que o dispositivo conecta-se com a sua identidade na nuvem. 

Primeiro, acesse o IoT Hub e visualize no gráfico “number of messages used”, dentro do menu “overview” a evidência de conexão do dispositivo. Depois, acesse o menu de dispositivos IoT Edge, clique no seu dispositivo e acesse “Modules” na parte inferior da tela para observar o status dos módulos no dispositivo:

Figura 8 – Janela do dispositivo com destaque para o status dos módulos.

Essas informações nos permitem verificar que a etapa de provisionamento foi bem sucedida. Observe o campo “Runtime Response” com a mensagem “417 -- The device's deployment configuration is not set “, esta mensagem significa que o dispositivo está pronto para receber um novo deployment. Permaneça nesta janela para a próxima etapa.

6 – Faça o deploy de um módulo gerador de dados de temperatura e umidade simulados.

A Microsoft disponibiliza, junto a outras empresas, módulos prontos para uso em um Marketplace. Neste exemplo, usaremos este módulo gerador de dados simulados, porém, eu recomendo fortemente que você explore as outras ofertas do Marketplace. 

Para fazer o deploy de módulos no dispositivo, precisamos indicar as imagens, o container registry e as rotas das mensagens dos módulos que irão ser executados no dispositivo. Indicamos essas informações através do  IoT Hub, que automaticamente irá compor o arquivo denominado “Deployment Manifest”. O dispositivo Edge continuamente realizará uma varredura para identificar se há algum novo Deployment Manifest ou alguma atualização no IoT Hub e fará o download deste arquivo para buscar pelas imagens diretamente no Container Registry indicado pelo arquivo para criar localmente os containers baseados nas imagens e tags. Observe a figura a seguir que ilustra a interação entre os diferentes atores do mecanismo.

Figura 9 – Mecanismo de interação entre dispositivo Edge, IoT Hub e Container Registry. Fonte: https://docs.microsoft.com/en-us/azure/iot-edge/quickstart-linux?view=iotedge-2020-11

Finalmente vamos realizar o deploy do nosso módulo simulador:

A partir da última janela, clique em Set Modules (na barra de navegação na parte superior da tela). Vá na seção IoT Edge Modules, clique em Add e selecione a opção Marketplace Module para buscar uma imagem do Marketplace. Digite Simulated na janela de busca e selecione o módulo Simulated Temperature Sensor.

Observe as imagens abaixo que ilustram os passos acima.

Figura 10 – Janela de busca de imagens no Marketplace da Microsoft.
Figura 11 – Janela de configuração de deployment para dispostivo Edge.

Ainda, na mesma seção IoT Edge Modules, clique em “Runtime Settings” e modifique a versão dos módulos Edge Agent e Edge Hub para 1.2, que é a mais recente. Aplique as mudanças em seguida.

Figura 12 – Janela das configurações de Runtime.

Clique em next para irmos para a próxima etapa do deployment, a etapa de configuração de rotas. Uma rota é composta por um nome que identifica a rota e um valor que descreve o caminho das mensagens. Podemos configurar uma rota para estabelecer comunicação entre módulos e entre o dispositivo e o IoT Hub. No nosso caso, vamos configurar uma rota para que as mensagens produzidas pelo módulo de simulação sejam escoadas para o IoT Hub. 

Observe na imagem a seguir que temos duas rotas já pré-configuradas. A primeira é a padrão e direciona todas as mensagens de qualquer módulo emissor de mensagens para $upstream, que é o IoT Hub. A segunda rota foi criada automaticamente quando selecionamos o módulo de simulação do Marketplace e direciona o que vem deste módulo para o IoT Hub. Como essas rotas acabam sendo redundantes, podemos excluir a primeira clicando no ícone da lixeira ao lado da rota. 

Figura 13 – Janela das rotas de comunicação dos módulos.

Clique em Review + Create. Nessa etapa o IoT Hub terá construído o arquivo “Deployment Manifest” no formato JSON. Explore o arquivo para revisar e observar as especificações. Dentro da tag $edgeAgent temos a especificação da imagem do módulo de simulação, do próprio módulo Edge Agent e do Edge Hub atualizados para versão 1.2. Lembra que o Edge Agent é o módulo responsável pelo monitoramento e gerenciamento dos módulos? Inclusive cuida de sua própria atualização!

Na seção do $edgeHub temos a especificação das rotas. Lembra que ele é o módulo que gerencia a comunicação interna e externa?  

Para finalizarmos a etapa de deployment, clique em create. Você será redirecionado para a página inicial do dispositivo. Aguarde um momento e atualize até que o status dos módulos estejam Running como na imagem a seguir:

Figura 14 – Janela do dispositivo com destaque para o status dos módulos após um deployment de sucesso.

    Você pode também checar novamente o status dos módulos no dispositivo e realizar novamente a verificação de conectividade e de configurações:

Figura 15 – Resultado esperado do comando sudo iotedge list.

   

Figura 16 – Resultado esperado do comando sudo iotedge check.

    Observe que agora, não tivemos nenhum erro porque o módulo Edge Hub foi implantado após configurarmos o deployment no IoT Hub.

7 – Monitore as mensagens que estão chegando no IoT Hub.

    Antes de monitorarmos as mensagens no IoT Hub, vamos verificar que o módulo está emitindo no dispositivo. Para isso, execute o seguinte comando no seu dispositivo Edge:

    Você deve observar mensagens como esta com informação simulada de temperatura e pressão de uma máquina e temperatura e umidade do ambiente:

Finalmente, vamos confirmar que as mensagens estão chegando no IoT Hub.

Do seu computador monitore os eventos que estão chegando no IoT Hub:

Figura 17 – Resultado esperado do monitoramento de eventos.

Descomissionamento

Concluiu o tutorial com sucesso? Então pode ser que seja a hora de limpar seu ambiente de trabalho e liberar os recursos.

Acesse o Portal do Azure e delete o IoT Hub, caso contrário, será debitado o uso diário dos seus créditos. Exclua também o resource group que criou.

Para desinstalar o IoT Edge Runtime do seu Raspberry, execute o seguinte comando (Use –purge para excluir também os arquivos de configuração) :

    Liste todos os containers:

Figura 18 – Exemplo de resultado esperado do comando docker ps -a.

    Use os IDs para deletar os containers associados ao tutorial:

    Caso seja do interesse do leitor, remova a container engine docker do Raspberry:

    E para deletar arquivos, imagens, contêineres e outros dados deixados para trás:

Conclusão

Neste artigo aprendemos do zero como fazer de uma Raspberry i um dispositivo IoT Edge, fazer o deploy de um módulo direto do Marketplace da Microsoft e conectá-lo com o IoT Hub do Azure.

Este é só o começo da nossa jornada com o IoT Edge. Há um enorme potencial ao translocarmos computação da nuvem para a borda. Em um próximo tutorial exploraremos como criar nossos próprios módulos e como encapsular serviços da nuvem do Azure em um módulo para rodar localmente.

Stay Tuned! 

Troubleshooting (Caso tenha problema na instalação do docker):


Caso o script de instalação do docker apresente o seguinte erro: E: Sub-process /usr/bin/dpkg returned an error code (1), experimenta a solução apresentada no link a seguir.
https://raspberrypi.stackexchange.com/questions/103709/installing-docker-on-raspberry-pi/114025#114025?newreg=3de0012dda9849d9b8930fd0a224bf58

Bônus: Teste seu conhecimento

Acesse o quiz a seguir e avalie o quanto você aprendeu hoje!

https://www.goconqr.com/pt-BR/quiz/35425686/introdu-o-ao-iot-edge

Referências

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Home » Software » Introdução ao Azure IoT Edge com Raspberry Pi 4
Comentários:
Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments
Talvez você goste:
Nenhum resultado encontrado.
Menu