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:

 

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

 

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

 

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/.

 

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

 

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.

 

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

 

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:

 

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:

 

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:

 

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:

 

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.

 

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.

 

Gravando a imagem assinada da aplicação no dispositivo

 

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

 

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:

 

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:

 

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.

 

UpdateHub Zephyr

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).

 

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
 

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:

 

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:

 

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 [email protected], ou através do nosso canal em gitter.im/UpdateHub.

Outros artigos da série

<< UpdateHub: Enviando atualizações OTA usando o Yocto 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