UpdateHub: Habilitando no Zephyr Project

No artigo anterior, UpdateHub: Enviando atualizações OTA usando o Yocto Project, vimos um tutorial de como adicionar a sua aplicação Yocto Project no UpdateHub. Neste artigo, veremos um tutorial simples e prático de como adicionar o UpdateHub em uma aplicação Zephyr Project.

 

Requisitos e dependências

 

Antes de começarmos, esse tutorial foi executado em um sistema operacional baseado em Debian/Ubuntu, e a aplicação no dispositivo da NXP FRDM-K64F ( Freedom Development Platform for Kinetis® K64) com a versão Zephyr Project 1.14.

 

Você pode utilizar outros sistemas operacionais e outros dispositivos (lembrando que os dispositivos devem ter uma conexão funcional com a Internet), basta só ajustar as configurações para seu ambiente e dispositivo.

 

Para facilitar o andamento deste tutorial, ele foi todo pensado para você executar cada passo no mesmo terminal, sendo assim, ele conterá todas as configurações de ambientes necessárias. Portando, não é necessário abrir múltiplos terminais, basta utilizar sempre o terminal no diretório ~/ para executar os comandos propostos.

 

Para realização deste tutorial é necessário instalar em seu computador algumas dependências como o Zephyr Project e a ferramenta west.

 

Obter o Zephyr Project é muito simples, abaixo iremos mostrar como fazer a instalação e configuração, para isso basta seguir os comandos. O restante do tutorial considera que o diretório do Zephyr Project se encontrará em ~/zephyr.

 

Primeiramente iremos instalar o west em seu sistema, com o seguinte comando:

 

O UpdateHub no momento está próximo de ser integrado ao repositório oficial do Zephyr Project, como pode ser observado nesta Pull Request. Por enquanto podemos utilizar o UpdateHub através do nosso fork do projeto UpdateHub/Zephyr. Você pode fazer o download do nosso fork com o seguinte comando:

pip3 install --user west

 

Após o download do repositório nós precisamos instalar as dependências do Zephyr Project:

west init -m https://github.com/UpdateHub/zephyr

 

Nesse passo iremos realizar o download do zephyr-sdk através do comando:

pip3 install --user -r ~/zephyr/scripts/requirements.txt

 

Para fazer a instalação do zephyr-sdk é só executar o comando abaixo. Uma dica é manter a instalação do SDK no diretório padrão /opt/zephyr-sdk/.

sh zephyr-sdk-0.10.0-setup.run

 

Último passo é a configuração do ambiente de construção, com o seguinte comando:

source ~/zephyr/zephyr-env.sh

 

Caso houver dúvidas, o Zephyr Project conta com um guia de início com a explicação de suas ferramentas.

 

O próximo passo é preparar o MCUboot. O MCUbooté um gerenciador de inicialização seguro para MCUs de 32 bits, nesse tutorial nós utilizaremos o JuulLabs-OSS/MCUboot. Para o restante do tutorial o diretório do MCUboot se encontrará em ~/mcuboot. Basta clonar esse repositório em seu computador.

git clone https://github.com/JuulLabs-OSS/mcuboot.git

 

Após o repositório ser clonado, deve ser instaladas as dependências do MCUboot:

pip3 install --user -r ~/mcuboot/scripts/requirements.txt

 

Agora, precisamos instalar o UpdateHub Utilites (uhu). O uhu é um prompt interativo e um utilitário de linha de comando para gerenciar pacotes de atualização para o agente UpdateHub. Fazer o download do uhu é muito simples, basta executar o seguinte comando:

pip3 install --user uhu

 

Finalmente precisamos instalar o pyOCD que é um pacote Python de código aberto para programação e depuração de microcontroladores ARM Cortex-M, ele será usado nesse tutorial. Para instalar digite o seguinte comando:

pip3 install -U --user pyocd

 

Gravando no dispositivo o MCUboot

 

O primeiro passo para iniciarmos a aplicação é gravar o arquivo de imagem do MCUboot no dispositivo. Isso pode ser feito de várias maneiras, para facilitar usaremos o comando west. No diretório do MCUboot, clonado em seu computador, navegue até ~/mcuboot/boot/zephyr e edite o arquivo prj.conf, a opção CONFIG_MULTITHREADING de n para y. Após essa alteração podemos compilar a imagem do MCUboot e gravar no dispositivo, para isso basta executar os seguintes comandos em seu terminal na home:

west build -s ~/mcuboot/boot/zephyr -d build-mcuboot -b frdm_k64f
west flash -d build-mcuboot

 

Após esse comando o dispositivo já estará executando a imagem do MCUboot.

 

Modos de execução do UpdateHub no Zephyr Project

 

O UpdateHub conta com dois diferentes modos de atualização no Zephyr Project: manual e automático.

 

O modo manual permite que o usuário controle o fluxo de atualização, o usuário fica encarregado de definir em sua aplicação o momento que deseja fazer a consulta por uma atualização e, havendo uma ela deve ser realizada.

 

Já no modo automático, o UpdateHub começará a trabalhar em paralelo com a aplicação e automaticamente irá consultar o servidor se há alguma atualização disponível, dentro de um tempo pré determinado, havendo atualizações realizará a instalação e inicialização do dispositivo automaticamente.

 

A aplicação exemplo mostra como utilizar os dois exemplos, mas por padrão a aplicação está definida para utilizar o modo automático, que facilita as buscas por atualizações. Caso queira utilizar o modo manual é só fazer uma alteração no arquivo de configuração.

 

Iniciando o servidor UpdateHub

 

Por padrão, o aplicativo UpdateHub está configurado para iniciar no UpdateHub Cloud. Este servidor tem a opção de utilizar o CoAPS/DTLS. Neste tutorial nós utilizaremos o servidor de código aberto, chamado Updatehub Community Edition (updatehub-ce).

 

Você pode utilizar o updatehub-ce para fazer seus testes e executar tudo localmente. O restante do tutorial será baseado neste servidor. Para utilizar o updatehub-ce é só executar o seguinte comando em um terminal:

docker run -it -p 8080:8080 \
               -p 5683:5683/udp \
               --rm updatehub/updatehub-ce:latest

 

Utilizando este servidor o usuário precisa criar sua própria opção overaly-prj.conf, navegue até o exemplo da aplicação em ~/zephyr/samples/net/updatehub. Crie o arquivo overlay-prj.conf, seguindo como modelo o overlay-prj.conf.example, configurando a opção CONFIG_UPDATEHUB_SERVER com seu endereço IP local e a opção CONFIG_UPDATEHUB_CE deve ser ativada. As configurações de CONFIG_UPDATEHUB_POLL_INTERVAL e CONFIG_UPDATEHUB_PRODUCT_UID podem ser mantido os mesmos valores do overlay-prj.conf.example.

 

Compilando aplicação UpdateHub

 

Nesse passo mostraremos como compilar a aplicação do UpdateHub para o dispositivo fdrm_k64f. Você deve estar no seguinte diretório ~/ e executar o comando abaixo.

west build -b frdm_k64f -s ~/zephyr/samples/net/updatehub \
           -d build-updatehub \
           -- -DCONF_FILE="prj.conf overlay-prj.conf"

 

Assinando a Imagem compilada

 

Com o intuito de manter segurança para o usuário, as imagens devem ser assinadas com a mesma chave definida na inicialização do MCUboot. Caso a imagem não for assinada ou a chave de assinatura estiver errada, o MCUboot não deixa gravar a imagem no dispositivo.

 

O comando abaixo cria um arquivo de imagem chamado zephyr.signed.bin e salva no diretório seu diretório atual. Está imagem será gravada no dispositivo posteriormente.

west sign -t imgtool --no-hex \-d build-updatehub/ -- \
          --key mcuboot/root-rsa-2048.pem \
          --version 1.0.0+0 \
          --pad

 

Gravando a imagem assinada da aplicação no dispositivo

 

Carregue o arquivo zephyr.signed.bin para o seu dispositivo, digite o seguinte comando:

west flash -d build-updatehub --bin-file zephyr.signed.bin 

 

Gerando a imagem de atualização

 

Nesta etapa do processo você criará uma imagem assinada que será utilizada para a atualização do seu dispositivo. Nesse caso, para facilitar, nós iremos assinar o mesmo binário criado anteriormente apenas mudando a versão, de 1.0.0 para 2.0.0. Para isso, basta executar o comando abaixo:

west sign -t imgtool --no-hex \-d build-updatehub/ -- \
          --key mcuboot/root-rsa-2048.pem \
          --version 2.0.0+0 \
          --pad

 

O esse comando cria um arquivo de imagem chamado zephyr.signed.bin no seu diretório atual.

 

Construa seu pacote utilizando UpdateHub Utilities

 

Construir um pacote utilizando o uhu é muito simples, o primeiro passo é configurar o product-uid do pacote (mesmo definido na configuração da imagem no arquivo overlay-prj.config), adicionar e definir o modo do pacote, informar a versão da imagem, adicionar o hardware suportado e, por fim, você deve gerar o pacote.

 

Para realizar todos passos acima basta utilizar o seguinte comando:

uhu product use "e4d37cfe6ec48a2d069cc0bbb8b078677e9a0d8df3a027c4d8ea131130c4265f"
uhu package add zephyr.signed.bin -m zephyr
uhu package version 2.0.0
uhu hardware add frdm_k64f
uhu package archive --output example.pkg

 

O comando acima cria um arquivo de pacote chamado example.pkg e salva no diretório atual.

 

Adicionando o pacote ao servidor

 

Pacote criado, agora já estamos prontos para adicionar o pacote ao updatehub-ce. Abra o seu navegador e digite URL do servidor (por exemplo <seu-endereço-ip>:8080), abrirá uma página de login, por padrão o login e senha devem ser preenchidos por admin, preencha os campos e aperte login.

 

 

Após acessar o servidor, clique no menu package, em seguida, upload package, e busque em seu computador o pacote example.pkg criado na etapa anterior.

 

Registrando o dispositivo no servidor e criando um Rollout

 

Para que possamos atualizar o dispositivo com a imagem que adicionamos no updatehub-ce é necessário a criação de um rollout. Para criar primeiramente é necessário registrar o dispositivo no servidor. Existem duas maneiras de realizar esse registro, o primeiro é esperar com que a aplicação realize automaticamente no período pré-definido (caso você esteja utilizando a aplicação UpdateHub automática), nesse exemplo o tempo de espera definido é o intervalo de um minuto (conforme definido no arquivo overlay-prj.config) .

 

A outra maneira de registrar o dispositivo no servidor é digitando no terminal de debug do dispositivo o seguinte comando: (Provavelmente o dispositivo já estará registrado pois estamos utilizando o modo automático de consulta ao servidor).

updatehub run

 

Voltando ao seu navegador, onde está aberto o updatehub-ce, você pode navegar até a aba devices e irá perceber que as informações do seu dispositivo estarão lá, portanto assim, é possível a criar um rollout.

UpdateHub Zephyr
Navegue até a aba rollout, clique em create rollout e selecione a versão do pacote que você adicionou (2.0.0) e depois clique em Create. Pronto, irá abrir uma tela com os detalhes do rollout, e logo abaixo possui a informação do status do rollout, inicialmente o status estará como pendente (pending).

 

 
UpdateHub Zephyr
:8080), abrirá uma página de login, por padrão o login e senha devem ser preenchidos por "],[0,[1],1,"admin"],[0,[],0,", preencha os campos e aperte login. "]]],[10,17],[1,"p",[[0,[],0,"Após acessar o servidor, clique no menu p"],[0,[2],1,"ackage"],[0,[],0,", em seguida, u"],[0,[2],1,"pload package"],[0,[],0,", e busque em seu computador o pacote "],[0,[1],1,"example.pkg"],[0,[],0," criado na etapa anterior."]]],[10,18],[1,"h3",[[0,[],0,"Registrando o dispositivo no servidor e criando um Rollout"]]],[1,"p",[[0,[],0,"Para que possamos atualizar o dispositivo com a imagem que adicionamos no updatehub-ce é necessário a criação de um r"],[0,[2],1,"ollout"],[0,[],0,". Para criar primeiramente é necessário registrar o dispositivo no servidor. Existem duas maneiras de realizar esse registro, o primeiro é esperar com que a aplicação realize automaticamente no período pré-definido (caso você esteja utilizando a aplicação UpdateHub automática), nesse exemplo o tempo de espera definido é o intervalo de um minuto (conforme definido no arquivo "],[0,[1],1,"overlay-prj.config"],[0,[],0,") . A outra maneira de registrar o dispositivo no servidor é digitando no terminal de "],[0,[2],1,"debug"],[0,[],0," do dispositivo o seguinte comando: (Provavelmente o dispositivo já estará registrado pois estamos utilizando o modo automático de consulta ao servidor). "]]],[10,19],[1,"p",[[0,[],0,"Voltando ao seu navegador, onde está aberto o updatehub-ce, você pode navegar até a aba d"],[0,[2],1,"evices"],[0,[],0," e irá perceber que as informações do seu dispositivo estarão lá, portanto assim, é possível a criar um "],[0,[2],1,"rollout"],[0,[],0,". "]]],[10,20],[1,"p",[[0,[],0,"Navegue até a aba r"],[0,[2],1,"ollout"],[0,[],0,", clique em c"],[0,[2],1,"reate rollout"],[0,[],0," e selecione a versão do pacote que você adicionou (2.0.0) e depois clique em "],[0,[2],1,"Create"],[0,[],0,". Pronto, irá abrir uma tela com os detalhes do r"],[0,[2],1,"ollout"],[0,[],0,", e logo abaixo possui a informação do status do "],[0,[2],1,"rollout"],[0,[],0,", inicialmente o status estará como pendente ("],[0,[2],1,"pending"],[0,[],0,")."]]],[10,21],[10,22],[1,"h3",[[0,[],0,"Atualizando o dispositivo"]]],[1,"p",[[0,[],0,"Agora está tudo pronto para atualizarmos o dispositivo com a imagem disponibilizada no servidor. A atualização pode ser realizada de duas formas diferentes, automaticamente pela aplicação ou através da console "],[0,[2],1,"shell"],[0,[],0,". "]]],[1,"p",[[0,[],0,"Esse tutorial, como falamos anteriormente, utiliza o modo de consulta automático, onde o dispositivo faz uma consulta ao servidor verificando se possui alguma atualização, obtendo resposta que há atualização a ser realizada, ele irá automaticamente iniciar o "],[0,[2],1,"download"],[0,[],0," e instalar a imagem, por fim reinicializará o dispositivo. Quando o dispositivo inicializar com a nova imagem ele automaticamente irá consultar o servidor se há mais atualizações, o servidor irá retornar para o dispositivo que não há mais atualizações e o r"],[0,[2],1,"ollout"],[0,[],0," será definido como atualizado (Updated)."]]],[1,"p",[[0,[],0,"Você pode optar pelo o segundo modo de atualização onde você pode consultar manualmente, digitando no terminal de "],[0,[2],1,"debug"],[0,[],0," do dispositivo o comando: "]]],[10,23],[1,"p",[[0,[],0,"O dispositivo irá realizar o "],[0,[2],1,"download,"],[0,[],0," fará a instalação da nova imagem e no final aparecerá na tela a mensagem de “"],[0,[2],1,"Image flashed successfully, you can reboot now"],[0,[],0,"”, sendo assim você poderá reiniciar o dispositivo, para isso basta executar o seguinte comando no terminal de "],[0,[2],1,"debug"],[0,[],0," do dispositivo:"]]],[10,24],[1,"p",[[0,[],0,"O dispositivo inicializará com a nova imagem e consultará o servidor se há alguma outra atualização, o servidor irá retornar para o dispositivo que não há mais atualizações e o "],[0,[2],1,"Rollout"],[0,[],0," será definido como atualizado ("],[0,[2],1,"Updated"],[0,[],0,")."]]],[10,25],[1,"p",[[0,[],0,"Com esse tutorial nós encerramos está série que apresentou soluções OTA, destacou uma solução de código aberto e corporativa chamada de UpdateHub, e por fim, dois tutoriais de como integrar o UpdateHub em projetos Yocto Project e Zephyr Project, muito obrigado por estar conosco."]]],[1,"p",[[0,[],0,"Até o próximo artigo, sinta-se a vontade de entrar em contato conosco em caso de dúvida ou sugestões através do nosso email "],[0,[11],1,"contact@updatehub.io"],[0,[],0,", ou através do nosso canal em "],[0,[12],1,"gitter.im/UpdateHub"],[0,[],0,"."]]],[1,"p",[]]]}”>
Atualizando o dispositivo

 

Agora está tudo pronto para atualizarmos o dispositivo com a imagem disponibilizada no servidor. A atualização pode ser realizada de duas formas diferentes, automaticamente pela aplicação ou através da console shell.

 

Esse tutorial, como falamos anteriormente, utiliza o modo de consulta automático, onde o dispositivo faz uma consulta ao servidor verificando se possui alguma atualização, obtendo resposta que há atualização a ser realizada, ele irá automaticamente iniciar o download e instalar a imagem, por fim reinicializará o dispositivo. Quando o dispositivo inicializar com a nova imagem ele automaticamente irá consultar o servidor se há mais atualizações, o servidor irá retornar para o dispositivo que não há mais atualizações e o rollout será definido como atualizado (Updated).

 

Você pode optar pelo o segundo modo de atualização onde você pode consultar manualmente, digitando no terminal de debug do dispositivo o comando:

updatehub run

 

O dispositivo irá realizar o download, fará a instalação da nova imagem e no final aparecerá na tela a mensagem de “Image flashed successfully, you can reboot now”, sendo assim você poderá reiniciar o dispositivo, para isso basta executar o seguinte comando no terminal de debug do dispositivo:

kernel reboot warm

 

O dispositivo inicializará com a nova imagem e consultará o servidor se há alguma outra atualização, o servidor irá retornar para o dispositivo que não há mais atualizações e o Rollout será definido como atualizado (Updated).

Com esse tutorial nós encerramos está série que apresentou soluções OTA, destacou uma solução de código aberto e corporativa chamada de UpdateHub, e por fim, dois tutoriais de como integrar o UpdateHub em projetos Yocto Project e Zephyr Project, muito obrigado por estar conosco.

 

Até o próximo artigo, sinta-se a vontade de entrar em contato conosco em caso de dúvida ou sugestões através do nosso email contact@updatehub.io, ou através do nosso canal em gitter.im/UpdateHub.

Atualização OTA (Over-the-Air) - Solução para updates remotos de firmwares

UpdateHub: Enviando atualizações OTA usando o Yocto Project
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Software » UpdateHub: Habilitando no Zephyr Project

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: