Neste artigo Otavio Salvador irá abordar, de uma maneira prática e simples, como adicionar suporte ao UpdateHub no seu dispositivo, 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:
mkdir ~/bin curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo export PATH=${PATH}:~/bin
Crie o diretório que conterá os fontes necessários:
mkdir updatehub-platform cd updatehub-platform repo init -u https://github.com/UpdateHub/updatehub-yocto-project-reference-platform.git -b thud repo sync
repo init -u https://github.com/UpdateHub/updatehub-yocto-project-reference-platform.git -b thud
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 = "http://ENDERECO_IP:8080" UPDATEHUB_PACKAGE_VERSION_SUFFIX = "-test-image-1" ENABLE_UART = "1"
UPDATEHUB_SERVER_URL = "http://ENDERECO_IP:8080"
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.
Com o ambiente e configurações prontas podemos realizar a compilação da imagem, execute o seguinte comando:
bitbake updatehub-image-minimal
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.
zcat updatehub-image-minimal-raspberrypi3.wic.gz | sudo dd of=/dev/sdX
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:
root@raspberrypi3:~# cat /etc/os-release ID="oel" NAME="O.S. Systems Embedded Linux" VERSION="18.10" VERSION_ID="18.10-test-image-1" PRETTY_NAME="O.S. Systems Embedded Linux 18.10" UPDATEHUB_PRODUCT_UID="0000000000000000000000000000000000000000000000000000000000000000"
root@raspberrypi3:~# cat /etc/os-release
ID="oel"
NAME="O.S. Systems Embedded Linux"
VERSION="18.10"
VERSION_ID="18.10-test-image-1"
PRETTY_NAME="O.S. Systems Embedded Linux 18.10"
UPDATEHUB_PRODUCT_UID="0000000000000000000000000000000000000000000000000000000000000000"
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:
bitbake updatehub-image-minimal -c uhuarchive
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:
root@raspberrypi3:~# cat /etc/os-release ID="oel" NAME="O.S. Systems Embedded Linux" VERSION="18.10" VERSION_ID="18.10-test-image-2" PRETTY_NAME="O.S. Systems Embedded Linux 18.10" UPDATEHUB_PRODUCT_UID="0000000000000000000000000000000000000000000000000000000000000000"
VERSION_ID="18.10-test-image-2"
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:
UPDATEHUB_PACKAGE_VERSION_SUFFIX = "-test-image-3"
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: contato@updatehub.io.
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
<< UpdateHub – Solução para updates remotos de firmwaresUpdateHub: Habilitando no Zephyr Project >>
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