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.













