UpdateHub: Enviando atualizações OTA usando o Yocto Project

No artigo anterior, UpdateHub - Solução para updates remotos de firmwares, falamos sobre uma ferramenta que provê uma solução completa de atualização OTA, simplificando o processo de atualização remota de dispositivos IoT. Neste artigo iremos abordar, de uma maneira prática e simples, como adicionar suporte ao UpdateHub no seu dispositivo, usando o Yocto Project.

 

Antes de iniciarmos esse tutorial verifique se a sua distribuição Linux é compatível e possui todas as dependências requeridas pelo Yocto Project, você pode consultar as informações em Yocto Project manual. Outra ferramenta necessária é o repo, que é utilizada para baixar os códigos fontes do projeto. Não é necessário ter experiência com a ferramenta, pois utilizaremos poucos comandos.

 

O dispositivo precisa de conexão de rede por DHCP, ou que o usuário tenha um conhecimento prévio de como alterar o IP, ou alterar/criar um layer para o Yocto Project que faça essa configuração. Para facilitar vamos definir alguns termos utilizados nesse tutorial:

  • Target: é o dispositivo de desenvolvimento, neste tutorial utilizaremos uma Raspberry Pi 3 Model B+, mas pode ser a Raspberry Pi 3, Model B ou Model B+.
  • Host: é o computador onde irá fazer o build da imagem no Yocto Project, onde será feita a compilação.

 

O UpdateHub fornece um repositório com um arquivo manifest utilizado como plataforma para a ferramenta repo. O objetivo de utilizar o repo é facilitar o gerenciamento de projetos com vários layers. Você pode consultar em Android development setup guide.

 

Preparando o ambiente para o build

 

Para obter os fontes do projeto instale a ferramenta repo:

 

Crie o diretório que conterá os fontes necessários:

 

Quando o comando repo sync finalizar, é possível ver que todos os layers estarão no diretório sources. Não é necessário adicionar mais nenhum layer ao projeto.

 

Carregar o ambiente do bitbake:

 

Como o platform do UpdateHub fornece suporte para vários dispositivos, veja a lista de dispositivos suportados aqui, será perguntado se você deseja aceitar o End-user license agreement (EULA) do layer meta-freescale, siga os passos mostrados, não sendo necessário aceitar o EULA para o nosso exemplo.

 

Note que o comando acima é válido somente para o shell que você carregou o ambiente. Caso utilize um novo terminal para executar o bitbake, é necessário carregar o ambiente novamente, já a variável MACHINE é necessária configurar somente uma vez.

 

Por padrão o meta-updatehub é configurado para utilizar o UpdateHub Cloud. Neste tutorial utilizaremos o UpdateHub Community Edition (updatehub-ce) que é um servidor totalmente open source, distribuído sob a licença MIT, que você pode iniciá-lo no seu próprio host.

 

Iniciando o UpdateHub Community Edition

 

Para iniciar o updatehub-ce é necessário ter o Docker instalado no host. Para informações de como instalar e configurar o Docker no seu host acesse o seguinte link.

 

Com o Docker instalado, execute o seguinte comando:

 

Esse comando faz o download da imagem Docker e inicia o servidor na porta 8080, para visualizar a interface web, acesse a url http://ENDERECO_IP:8080, o ENDERECO_IP é o mesmo do host que está executando a imagem Docker, por padrão o login e senha são admin e admin, preencha os campos e aperte LOGIN.

 

Esse endereço será utilizado para configurar a variável UPDATEHUB_SERVER_URL no Yocto Project.

 

A interface principal do updatehub-ce é conforme a imagem abaixo:

 

Configurando o ambiente para gerar a imagem

 

Antes de gerar uma imagem é necessário adicionar e configurar algumas variáveis no arquivo conf/local.conf, estas são:

 

UPDATEHUB_SERVER_URL: Contém o endereço de IP de onde o updatehub-ce está executando, conforme mencionado anteriormente.

UPDATEHUB_PACKAGE_VERSION_SUFFIX: Utilizada para adicionar um sufixo na versão da imagem que está sendo gerada. Isso é útil para colocar um número de versão e ir incrementando a cada nova imagem.

 

Quando gravar a imagem no target esta variável estará presente no VERSION_ID, composto da versão da DISTRO_VERSION + UPDATEHUB_PACKAGE_VERSION_SUFFIX. Esta informação pode ser verificada lendo o arquivo /etc/os-release no target.

 

ENABLE_UART: Existem algumas formas de acessar o target. Entre elas, podemos utilizar o serial console ou conectar um teclado e um monitor. Esta variável permite acessar um console na Raspberry Pi utilizando a porta serial.

 

Para mais informações sobre como utilizar a conexão serial na Raspberry Pi acesse esse link.

 

Gerando a imagem

 

Com o ambiente e configurações prontas podemos realizar a compilação da imagem, execute o seguinte comando:

 

Aguarde até ser gerada a imagem, isso pode demorar um bom tempo, dependendo muito do host utilizado. Se for a primeira vez que é gerada uma imagem para a máquina raspberrypi3 na branch thud, o bitbake irá fazer o download de todos os códigos fontes, então a velocidade de download também influenciará no tempo final para gerar a imagem.

 

Finalizada a compilação da imagem, ela estará disponível no diretório tmp/deploy/images/raspberrypi3/ no host. O arquivo que utilizaremos para gravar no cartão SD é o updatehub-image-minimal-raspberrypi3.wic.gz, copie esse arquivo para a sua home para ser gravado em um cartão SD. No comando abaixo é necessário alterar o dispositivo /dev/sdX para o correspondente ao seu cartão SD.

 

CUIDADO: Verifique qual é o nome do dispositivo do cartão SD antes de executar o comando abaixo! Para saber qual é o nome do dispositivo insira o cartão SD e execute o comando dmesg para saber qual é o dispositivo correto.

 

Com o cartão SD pronto, você já pode inseri-lo no target e após estará pronto para ligar a Raspberry Pi. A imagem está com a rede configurada para obter endereço de IP utilizando DHCP. Para acessar o console o usuário está definido como root e não precisa inserir senha.

 

Você pode confirmar a versão da imagem que está executando no target com o comando cat /etc/os-release, a saída será como a mostrada abaixo:

 

Gerando o pacote de atualização

 

Essa etapa do processo você irá criar uma imagem que será utilizada na atualização do seu target. Neste caso, para facilitar, nós iremos utilizar a mesma imagem anterior, apenas mudando a versão. Para gerar o pacote utilizado na atualização vamos alterar a variável UPDATEHUB_PACKAGE_VERSION_SUFFIX e colocar o sufixo -test-image-2, assim fica claro que a imagem atualizada terá outra versão. Edite o arquivo conf/local.conf, salve e execute seguinte o comando:

 

Esse comando gera um arquivo com extensão .uhupkg, formato utilizado pelo UpdateHub para atualizar o sistema. O arquivo gerado estará no mesmo diretório que as imagens, tmp/deploy/images/raspberrypi3, nesse exemplo updatehub-image-minimal-raspberrypi3.uhupkg

 

Utilizando o UpdateHub Community Edition

 

Acesse a interface web do servidor, endereço http://ENDERECO_IP:8080, para saber se o seu device, o target, comunicou-se com o servidor, clique na aba Devices e veja os detalhes.

 

 

Enviando um pacote de atualização

 

Para enviar um pacote de atualização acesse a aba PACKAGES, nessa aba é mostrado uma lista com os pacotes disponíveis, no momento ainda não possuímos nenhum. Clique no botão Upload Package e selecione o arquivo updatehub-image-minimal-raspberrypi3.uhupkg. Aparecerá uma tela mostrando os detalhes do pacote como a imagem abaixo.

 

 

Criando um rollout

 

Com o device reconhecido e o pacote enviado para o servidor, podemos criar um rollout. Navegue até a aba Rollouts e clique em Create Rollout. Na tela de rollout você deve escolher qual versão de pacote será utilizado na atualização, no nosso caso existe somente o pacote enviado no passo anterior com a versão 18.10-test-image-2. Escolha essa versão e confira se o device entrou na lista dos dispositivos que serão atualizados. Ocorrendo tudo como esperado aparecerá uma tela como essa abaixo.

 

 

A imagem em execução no target utiliza como padrão o tempo de 1 minuto para realizar a consulta por atualização ao servidor UpdateHub, então em até um minuto após criado o rollout iniciará o processo de atualização. O status da atualização pode ser acompanhado na aba Rollouts.

 

Após terminar o processo de atualização, o target reiniciará automaticamente. A nova imagem inicializará e automaticamente ela irá consultar o servidor por atualizações. O servidor irá responder que não possui nenhuma atualização a ser feita e assim encerrando o ciclo de atualização.

 

 

Para conferir se o target foi realmente atualizado, você pode executar o comando cat /etc/os-release para obter a versão instalada, você obterá uma saída como essa ao comando:

 

Conforme confirmado na interface web e no target, a imagem foi atualizada com sucesso da versão 18.10-test-image-1 para a 18.10-test-image-2.

 

Adicionando suporte SSH no target

 

Agora que todo o processo de atualização foi explicado, vamos adicionar suporte a um servidor SSH no target e criar um pacote de atualização para instalar essa funcionalidade.

 

Para adicionar suporte ao servidor SSH OpenSSH adicione no arquivo conf/local.conf a seguinte linha:

 

e altere a variável UPDATEHUB_PACKAGE_VERSION_SUFFIX para utilizar a versão 3 da nossa imagem de teste:

 

Podemos salvar o arquivo e gerar um novo pacote de atualização executando o mesmo comando utilizado anteriormente:

 

Após gerado o pacote, envie o novo arquivo para o updatehub-ce conforme mostrado na seção Enviando pacote de atualização. Realizado o upload do pacote podemos criar um novo rollout, como mostrado na seção Criando um rollout, agora utilizando a versão 18-10-test-image-3, que é a versão com um servidor SSH instalado.

 

O procedimento de instalação será igual ao da atualização para a versão 18-10-test-image-2, e o acompanhamento pode ser visto na aba Rollouts. Quando o status mostrar updated, podemos acessar o target utilizando o protocolo SSH, para isso digite no host:

 

Não é necessário senha, somente pressione Enter e estaremos no console do target. Novamente podemos verificar a versão com o conteúdo do arquivo /etc/os-release.

 

Neste tutorial utilizamos como exemplo uma Raspberry Pi 3+ na versão 2.6 do Yocto Project, porém possuímos suporte a outros dispositivos e versões, listados aqui. Se você tiver dúvidas sobre como integrar o seu dispositivo, disponibilizamos um chat no Gitter ou pode entrar em contato através do nosso email: [email protected].

 

No próximo artigo, iremos abordar um tutorial de como incluir o UpdateHub em uma aplicação do Zephyr Project.

 

Artigo publicado em inglês em: UpdateHub: Sending OTA Updates using the Yocto Project

Outros artigos da série

<< UpdateHub - Solução para updates remotos de firmwaresUpdateHub: Habilitando no Zephyr Project >>
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Otavio Salvador
Otavio Salvador ama tecnologia e começou suas atividades com software livre em 1999. Em 2002, fundou a O.S. Systems, uma empresa focada em serviços de desenvolvimento de sistemas embarcados e consultoria. Membro do OpenEmbedded desde 2008, vem trabalhado com o OpenEmbedded e com o Yocto Project de forma ativa culminando com a co-autoria de dois livros “Embedded Linux Development with Yocto Project” e “Heading for the Yocto Project”

Deixe um comentário

avatar
 
  Notificações  
Notificar