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


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












