quinta-feira, 8 de dezembro de 2022

u-BLOX NINA W106 SENDO PROGRAMADO COM GOLIOTH - ESP-IDF/ZEPHYR-RTOS

   u-BLOX NINA W106 SENDO PROGRAMADO COM GOLIOTH - ESp-IDF


O objetivo deste BLOG é demonstrar como é possível programar o módulo u-BLOX NINA W106 (ESP32) no BREAKOUT com GOLIOTH (Powered by esp-idf ou Zephyr RTOS).

Baseado no Blog


Compilado com o WSL2 (Ubuntu)

u-BLOX NINA W106

Wi-Fi 802.11b/g/n
Dual-Mode Bluetooth v4.2
Poderoso suporte de CPU aberta para aplicativos personalizados
Tamanho pequeno e várias opções de antena
Pino compatível com outros módulos NINA
Certificação global
Módulo baseado no ESP32, com 4MB FLASH
HOMOLOGADO PELA ANATEL

SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.Nosso portifólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS/GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.

IoT

IoT permite que você resolva seus problemas empresariais usando seus próprios dados. A Internet das Coisas não tem a ver apenas com dispositivos conectados – tem a ver com as informações que esses dispositivos coletam e com os insights poderosos e imediatos que podem ser obtidos com essas informações. Esses insights podem ser usados para transformar seus negócios e reduzir os custos por meio de aprimoramentos, como a redução de materiais desperdiçados, processos operacionais e mecânicos simplificados, ou a expansão para novas linhas empresariais que só se tornam possíveis usando dados confiáveis em tempo real. Crie uma vantagem competitiva real usando a IoT para transformar seus dados em insights e transformar esses insights em ação.

u-BLOX



Golioth é uma plataforma de desenvolvimento de IoT comercial direta construída para escala. Acelere o desenvolvimento e aumente as chances de seus pilotos serem colocados em produção com uma plataforma completa de firmware, serviços e gerenciamento de nuvem. 

Golioth é uma plataforma IoT que fornece serviços em nuvem para dispositivos embarcados. Coloquialmente, esperamos resolver a "incompatibilidade de impedância entre as equipes de engenharia de hardware e nuvem" (uma frase que aprendemos com um dos primeiros usuários). , incluindo mensagens de dispositivo, segurança, atualizações, análises e muito mais.

Golioth escolheu o Zephyr Project™ como base de nossa primeira oferta integrada. O Zephyr é um RTOS de código aberto, seguro e flexível sob a Linux Foundation. Oferecemos o Golioth SDK - construído sobre o Zephyr SDK - que você pode usar para inicializar rapidamente um aplicativo IoT.

Mas o roteiro abaixo é para o ESP-IDF e o próximo para ZEPHYR-RTOS

Instalando Golioth no u-BLOX NINA W106

Baseado no LINK

  • Instale WSL2 no WINDOWS
  • Instale ESP-IDF v4.4.2
    cd ~/esp-idf
    git fetch
    git checkout v4.4.2
    git submodule update --init --recursive ./install.sh all
    source export.sh
  • git clone --recursive https://github.com/golioth/golioth-firmware-sdk.git
    cd golioth-firmware-sdk
    git submodule update --init --recursive
    cd ~/golioth-firmware-sdk/examples/esp_idf/golioth_basics
    idf.py build


  • Baseado no endereços do esptool
    esptool.py esp32 -p /dev/ttyS3 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 bootloader/bootloader.bin 0x10000 golioth_basics.bin 0x8000 partition_table/partition-table.bin 0xd000 ota_data_initial.bin
  • Gravar com FlashTOOLS
     (abra "explorer.exe ." no WSL2)

  • Execução

CREDENCIAIS E CONEXÃO

Existem várias maneiras de atribuir credenciais ao seu dispositivo (incluindo Bluetooth por meio do navegador!), Mas talvez a mais fácil seja digitá-las no shell. Vá até o Golioth Console e selecione a Tab Device Credentials (Se você não possui uma conta, inscreva-se no Dev Tier agora, seus primeiros 50 dispositivos são gratuitos).

Use a janela do shell para definir as credenciais. Aqui você pode ver o processo, com os quatro 
comandos para credenciais Golioth e WiFi destacados:

Type 'help' to get the list of commands.
Use UP/DOWN arrows to navigate through command history.
Press TAB when typing command name to auto-complete.
esp32> W (2212) golioth_example: WiFi and golioth credentials are not set
W (2212) golioth_example: Use the shell settings commands to set them, then restart
esp32>
esp32> settings set golioth/psk-id 20221122201152-esp32@developer-training
Setting golioth/psk-id saved
esp32> settings set golioth/psk 5bfb64ad29dce4e3dd30ab10c5b95a6a
Setting golioth/psk saved
esp32> settings set wifi/ssid MyWifiAp
Setting wifi/ssid saved
esp32> settings set wifi/psk MyWifiPassword
Setting wifi/psk saved
esp32> reset

O comando final redefine o dispositivo para que ele use as novas credenciais.

Você verá algo assim:

I (4235) esp_netif_handlers: sta ip: 192.168.1.159, mask: 255.255.255.0, gw: 192.168.1.1
I (4235) example_wifi: WiFi Connected. Got IP:192.168.1.159
I (4235) example_wifi: Connected to AP SSID: MyWifiAp
I (4255) golioth_mbox: Mbox created, bufsize: 2184, num_items: 20, item_size: 104
I (4255) golioth_basics: Waiting for connection to Golioth...
W (4295) wifi:<ba-add>idx:0 (ifx:0, c6:ff:d4:a8:fa:10), tid:0, ssn:1, winSize:64
I (4395) golioth_coap_client: Start CoAP session with host: coaps://coap.golioth.io
I (4405) libcoap: Setting PSK key
I (4415) golioth_coap_client: Entering CoAP I/O loop
I (4805) golioth_basics: Golioth client connected
I (4805) golioth_basics: Hello, Golioth!
I (4815) golioth_coap_client: Golioth CoAP client connected
I (4815) golioth_fw_update: Current firmware version: 1.2.5
I (5735) golioth_fw_update: Waiting to receive OTA manifest
I (5835) golioth_basics: Synchronously got my_int = 42
I (5845) golioth_basics: Entering endless loop
I (5845) golioth_basics: Sending hello! 0
I (5935) golioth_fw_update: Received OTA manifest
I (5935) golioth_fw_update: Manifest does not contain different firmware version. Nothing to do.
I (5945) golioth_fw_update: Waiting to receive OTA manifest
I (6545) golioth_basics: Callback got my_int = 42
W (9805) golioth_coap_client: CoAP message retransmitted
W (10335) golioth_coap_client: 4.00 (req type: 3, path: .c/status), len 59
I (15845) golioth_basics: Sending hello! 1
I (21965) wifi:bcn_timout,ap_probe_send_start
I (25855) golioth_basics: Sending hello! 2
I (35005) wifi:bcn_timout,ap_probe_send_start
I (35855) golioth_basics: Sending hello! 3
Primeiro o ESP32 se conecta ao WiFi, depois ao Golioth. Depois de verificar (e não encontrar) uma atualização de firmware disponível, este exemplo começa a enviar mensagens de saudação a cada poucos segundos.

Agora vamos fazer uma atualização de firmware OTA

Conectamos ao Golioth com o dispositivo, agora vamos criar e carregar um novo pacote de firmware para testar os recursos OTA. Usaremos o mesmo código, atualizando o número da versão atual que o dispositivo usa para identificar quando uma atualização é necessária. Também alteraremos a string usada nas mensagens de log para que seja fácil reconhecer que nosso novo firmware está em execução.

Altere a versão do código-fonte e faça o Build

O arquivo que precisamos atualizar é um arquivo comum usado por vários Golioth SDKs. 
Edite o arquivo ~/golioth-firmware-sdk/examples/common/golioth_basics.c:

#define TAG "golioth_basics_new"
// Current firmware version
static const char* _current_version = "1.2.6";

Você pode ver que anexei “_new” ao nome da tag e incrementei o número da versão para 1.2.6. Agora estamos prontos para rebuild… mas lembre-se, não atualize isso no seu ESP32. Vamos carregá-lo no Golioth e realizar uma atualização de firmware remota!

cd ~/golioth-firmware-sdk/examples/esp_idf/golioth_basics
idf.py build

O binário recém-"buildado"está localizado na pasta de compilação build

Carregar firmware para Golioth e lançar uma versão

Depois de muito preâmbulo chegamos ao momento importante.

Para definir o cenário, o ESP32 que está sendo executado em sua mesa é um dispositivo IoT remoto que faz leituras de sensores em um estabelecimento de varejo de tijolo e argamassa em Waldorf, Maryland. Enviaremos uma atualização para ele usando um processo de três etapas:

  • Carregue o binário como um “artifact
  • Crie um “release” usando o artifact
  • Clique no botão "rollout" para fazer o lançamento ao vivo
Vá para o console Golioth e selecione Firmware Update→Artifacts na barra lateral esquerda. 
Clique no botão “Create”.






A única coisa que vamos mudar nesta janela é a “Artifact Version”. Digite o mesmo número de versão inserido no código-fonte deste firmware (provavelmente 1.2.6 se você estiver acompanhando). Clique no ícone de upload no meio da janela e escolha o arquivo “golioth_basics.bin” no diretório de compilação onde você executou o comando idf.py build. Por fim, clique no botão Upload Artifact.

Você tem a opção aqui de usar um Blueprint. Não estou detalhando isso hoje para resumir, mas é uma boa prática usar Blueprints para organizar seus dispositivos de produção.Agora vamos criar uma versão com base no Artifact. Clique em Firmware Update → Release na barra lateral esquerda e clique no botão "Create".


Tudo o que vamos fazer aqui é escolher o artifact que criamos anteriormente na caixa 
Artefatos e pressionar Create Release.

Você tem algumas opções aqui, principalmente você pode optar por iniciar o lançamento assim que a versão for criada. Prefiro esperar e implementá-lo como uma etapa de confirmação separada, caso eu tenha cometido algum erro ao longo do caminho.

Observe que você tem a opção aqui de selecionar Blueprints e Tags do dispositivo para tornar esta versão mais direcionada. Esta janela está me dizendo que a versão será aplicada a 51 dispositivos (!). Tudo bem aqui porque todos esses são dispositivos de teste em um projeto de teste que usamos para treinamento.

Por fim, vamos lançar a versão para nossos dispositivos:


O botão Rollout é tudo o que existe entre você e as atualizações automáticas. Clique nele e você verá (quase) imediatamente seu dispositivo começar a baixar o novo binário.

Aqui está um recurso incrível para se manter em mente. Quando você tem mais de um lançamento, pode usar este botão para reverter para versões anteriores. Isso significa que, se você perceber que lançou uma atualização com um bug, basta alternar este botão e todos os seus dispositivos baixarão automaticamente a próxima versão mais recente com lançamento selecionado.

Acompanhe a atualização do seu ESP32

Se você ler o código-fonte do exemplo golioth_basics, notará que ele chama golioth_fw_update_init(client, _current_version);. Isso significa que o dispositivo foi registrado nos servidores Golioth para receber atualizações quando um novo firmware estiver disponível. Olhe na saída do terminal e você verá o resultado:

I (175827) golioth_basics: Sending hello! 17
I (185007) golioth_fw_update: Received OTA manifest
I (185007) golioth_fw_update: Current version = 1.2.5, Target version = 1.2.6
I (185017) golioth_fw_update: State = Downloading
I (185317) golioth_fw_update: Image size = 1211744
I (185327) golioth_fw_update: Getting block index 0 (1/1184)
I (185827) golioth_basics: Sending hello! 18
W (187867) golioth_coap_client: CoAP message retransmitted
I (187947) fw_update_esp_idf: Writing to partition subtype 17 at offset 0x1a0000
I (187947) fw_update_esp_idf: Erasing flash
I (191627) golioth_fw_update: Getting block index 1 (2/1184)
I (191837) golioth_fw_update: Getting block index 2 (3/1184)
I (192037) golioth_fw_update: Getting block index 3 (4/1184)
I (192187) golioth_fw_update: Getting block index 4 (5/1184)
I (192447) golioth_fw_update: Getting block index 5 (6/1184)
I (192597) golioth_fw_update: Getting block index 6 (7/1184)
... snip ...
I (279837) golioth_fw_update: Getting block index 1181 (1182/1184)
I (280107) golioth_fw_update: Getting block index 1182 (1183/1184)
I (280317) golioth_fw_update: Getting block index 1183 (1184/1184)
I (280457) golioth_fw_update: Total bytes written: 1211760
I (280467) esp_image: segment 0: paddr=001a0020 vaddr=3f400020 size=29df0h (171504) map
I (280527) esp_image: segment 1: paddr=001c9e18 vaddr=3ffbdb60 size=05868h ( 22632)
I (280537) esp_image: segment 2: paddr=001cf688 vaddr=40080000 size=00990h ( 2448)
I (280547) esp_image: segment 3: paddr=001d0020 vaddr=400d0020 size=d9a64h (891492) map
I (280847) esp_image: segment 4: paddr=002a9a8c vaddr=40080990 size=1e2a0h (123552)
I (280887) esp_image: segment 5: paddr=002c7d34 vaddr=50000000 size=00010h ( 16)
I (280887) golioth_fw_update: State = Downloaded
I (281127) golioth_fw_update: State = Updating
I (281327) fw_update_esp_idf: Setting boot partition
I (281337) esp_image: segment 0: paddr=001a0020 vaddr=3f400020 size=29df0h (171504) map
I (281397) esp_image: segment 1: paddr=001c9e18 vaddr=3ffbdb60 size=05868h ( 22632)
I (281417) esp_image: segment 2: paddr=001cf688 vaddr=40080000 size=00990h ( 2448)
I (281417) esp_image: segment 3: paddr=001d0020 vaddr=400d0020 size=d9a64h (891492) map
I (281717) esp_image: segment 4: paddr=002a9a8c vaddr=40080990 size=1e2a0h (123552)
I (281757) esp_image: segment 5: paddr=002c7d34 vaddr=50000000 size=00010h ( 16)
I (281827) golioth_fw_update: Rebooting into new image in 5 seconds
I (282827) golioth_fw_update: Rebooting into new image in 4 seconds
I (283827) golioth_fw_update: Rebooting into new image in 3 seconds
I (284827) golioth_fw_update: Rebooting into new image in 2 seconds
I (285827) golioth_fw_update: Rebooting into new image in 1 seconds
... snip ...
I (4267) esp_netif_handlers: sta ip: 192.168.1.159, mask: 255.255.255.0, gw: 192.168.1.1
I (4267) example_wifi: WiFi Connected. Got IP:192.168.1.159
I (4277) example_wifi: Connected to AP SSID: TheNewPeachRepublic
I (4287) golioth_mbox: Mbox created, bufsize: 2184, num_items: 20, item_size: 104
I (4287) golioth_basics_new: Waiting for connection to Golioth...
W (4297) wifi:<ba-add>idx:0 (ifx:0, c6:ff:d4:a8:fa:10), tid:0, ssn:1, winSize:64
I (4307) golioth_coap_client: Start CoAP session with host: coaps://coap.golioth.io
I (4307) libcoap: Setting PSK key
I (4317) golioth_coap_client: Entering CoAP I/O loop
I (4637) golioth_basics_new: Golioth client connected
I (4647) golioth_coap_client: Golioth CoAP client connected
I (4657) golioth_basics_new: Hello, Golioth!
I (4657) golioth_fw_update: Current firmware version: 1.2.6
I (4657) golioth_fw_update: Waiting for golioth client to connect before cancelling rollback
I (4677) golioth_fw_update: Firmware updated successfully!
I (4727) golioth_fw_update: State = Idle
I (5937) golioth_basics_new: Synchronously got my_int = 42
I (5937) golioth_basics_new: Entering endless loop
I (5937) golioth_basics_new: Sending hello! 0

Primeiro, o dispositivo compara os números de versão e, em seguida, começa a baixar os blocos do novo firmware. Após o download, ele será reinicializado, conectado ao Golioth e verificado se está executando a versão mais recente. Os rótulos de log próximos ao final da saída agora mostram golioth_basics_new, confirmando uma das alterações que fizemos em nosso código-fonte.


Com o Golioth, o OTA é integrado ao SDK

Golioth fez o trabalho pesado para que você não precise. Nosso SDK usa apenas uma única chamada de API para registrar seus dispositivos para atualizações de firmware. Use as ferramentas de gerenciamento de frota no Golioth Cloud para provisionar seus dispositivos em grupos e por variantes de hardware. Isso possibilita direcionar seus dispositivos de teste para a primeira rodada de atualizações ou enviar novos recursos apenas para os dispositivos no quarto andar de sua 
fábrica em Des Moines.

TESTES COM u-BLOX NINA W106









No u-BLOX NINA  W106 pressione Enter (CR)

Você verá o Prompt

esp32>

esp32>settings set golioth/psk-id xxxxxxxx@hhhh-hhhhh-alligator
esp32>settings set golioth/psk xxxxxxxxx
esp32>settings set wifi/ssid Andreia\ Oi\ Miguel\ 2.4G
esp32>settings set wifi/psk xxxxxx






BLE




Veja BLOGS


FORUMS


APLICAÇÃO COM O SDK ZEPHYR


PREÇOS


Compilando para ZEPHYR-RTOS






















void main(void) { int r; int counter = 0; LOG_DBG("Start Hello sample"); k_sem_take(&golioth_client_ready, K_FOREVER); while (true) { LOG_INF("Sending hello! %d", counter++); r = golioth_send_hello(client); if (r < 0) { LOG_WRN("Failed to send hello!"); } k_sleep(K_SECONDS(5)); } LOG_DBG("Quit"); }




Baseado na tentativa de gravação

FATAL ERROR: command exited with status 2: /home/ubuntu/golioth-zephyr-workspace/.venv/bin/python3 /home/ubuntu/golioth-zephyr-workspace/modules/hal/espressif/components/esptool_py/esptool/esptool.py --chip auto --baud 921600 --before default_reset --after hard_reset write_flash -u --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 /home/ubuntu/golioth-zephyr-workspace/modules/lib/golioth/build/esp-idf/build/bootloader/bootloader.bin 0x8000 /home/ubuntu/golioth-zephyr-workspace/modules/lib/golioth/build/esp-idf/build/partitions_singleapp.bin 0x10000 /home/ubuntu/golioth-zephyr-workspace/modules/lib/golioth/build/zephyr/zephyr.bin

Os binários a serem gravados e seus endereços correspondentes

0x1000 bootloader.bin
0x8000 partitions_singleapp.bin 
0x10000zephyr.bin

Execute "explorer.exe ." no WSL2 para ter acesso aos BIN pelo Windows






DÚVIDAS
REFERÊNCIAS

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portfólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.

Mais detalhes em www.smartcore.com.br