- Introdução a atualização OTA (Over-the-Air)
- UpdateHub – Solução para updates remotos de firmwares
- UpdateHub: Enviando atualizações OTA usando o Yocto Project
- UpdateHub: Habilitando no Zephyr 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
:
1 2 3 4 |
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:
1 2 3 4 |
mkdir updatehub-platform cd updatehub-platform repo init -u https://github.com/UpdateHub/updatehub-yocto-project-reference-platform.git -b thud repo sync |
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
:
1 |
MACHINE="raspberrypi3" source ./setup-environment build |
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:
1 |
docker run -d -p 8080:8080 updatehub/updatehub-ce:latest |
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:
1 2 3 |
UPDATEHUB_SERVER_URL = "http://ENDERECO_IP:8080" UPDATEHUB_PACKAGE_VERSION_SUFFIX = "-test-image-1" ENABLE_UART = "1" |
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:
1 |
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.
1 |
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:
1 2 3 4 5 6 7 |
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:
1 |
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:
1 2 3 4 5 6 7 |
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" |
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:
1 |
IMAGE_FEATURES += "ssh-server-openssh" |
e altere a variável UPDATEHUB_PACKAGE_VERSION_SUFFIX
para utilizar a versão 3
da nossa imagem de teste:
1 |
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:
1 |
bitbake updatehub-image-minimal -c uhuarchive |
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:
1 |
ssh root@IP_DO_TARGET |
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