Gere o arquivo e a assinatura de atualização de firmware - AWS IoT Wireless

Gere o arquivo e a assinatura de atualização de firmware

As etapas desse procedimento são opcionais e dependem do gateway que você está usando. Os fabricantes de gateway oferecem a própria atualização de firmware na forma de um arquivo de atualização ou script, e o Basics Station executa esse script em segundo plano. Nesse caso, você provavelmente encontrará o arquivo de atualização do firmware nas notas de lançamento do gateway que está usando. Em vez disso, você pode usar esse arquivo ou script de atualização e passar para Fazer upload do arquivo de firmware para um bucket do S3 e adicionar um perfil do IAM.

Se você não tiver esse script, a seguir são mostrados os comandos a serem executados para gerar o arquivo de atualização do firmware. As atualizações também podem ser assinadas para garantir que o código não tenha sido alterado ou corrompido e que os dispositivos executem códigos publicados somente por autores confiáveis.

Gerar o arquivo de atualização de firmware

O software LoRa Basics Station executado no gateway é capaz de receber atualizações de firmware na resposta do CUPS. Se você não tiver um script fornecido pelo fabricante, consulte o seguinte script de atualização de firmware escrito para o RAKWireless Gateway baseado em Raspberry Pi. Temos um script básico e o novo binário da estação, arquivo de versão, e station.conf estão anexados a ele.

nota

O script é específico para o RAKWireless Gateway. Por isso, será necessário adaptá-lo ao seu aplicativo, dependendo do gateway que você estiver usando.

Script básico

A seguir é mostrado um exemplo de script básico para o RAKWireless Gateway baseado em Raspberry Pi. Você pode salvar os seguintes comandos em um arquivo base.sh e, em seguida, executar o script no terminal do navegador da Web do Raspberry Pi.

*#!/bin/bash* execution_folder=/home/pi/Documents/basicstation/examples/aws_lorawan station_path="$execution_folder/station" version_path="$execution_folder/version.txt" station_conf_path="$execution_folder/station_conf" # Function to find the Basics Station binary at the end of this script # and store it in the station path function prepare_station() { match=$(grep --text --line-number '^STATION:$' $0 | cut -d ':' -f 1) payload_start=$((match + 1)) match_end=$(grep --text --line-number '^END_STATION:$' $0 | cut -d ':' -f 1) payload_end=$((match_end - 1)) lines=$(($payload_end-$payload_start+1)) head -n $payload_end $0 | tail -n $lines > $station_path } # Function to find the version.txt at the end of this script # and store it in the location for version.txt function prepare_version() { match=$(grep --text --line-number '^VERSION:$' $0 | cut -d ':' -f 1) payload_start=$((match + 1)) match_end=$(grep --text --line-number '^END_VERSION:$' $0 | cut -d ':' -f 1) payload_end=$((match_end - 1)) lines=$(($payload_end-$payload_start+1)) head -n $payload_end $0 | tail -n $lines > $version_path } # Function to find the version.txt at the end of this script # and store it in the location for version.txt function prepare_station_conf() { match=$(grep --text --line-number '^CONF:$' $0 | cut -d ':' -f 1) payload_start=$((match + 1)) match_end=$(grep --text --line-number '^END_CONF:$' $0 | cut -d ':' -f 1) payload_end=$((match_end - 1)) lines=$(($payload_end-$payload_start+1)) head -n $payload_end $0 | tail -n $lines > $station_conf_path } # Stop the currently running Basics station so that it can be overwritten # by the new one killall station # Store the different files prepare_station prepare_versionp prepare_station_conf # Provide execute permission for Basics station binary chmod +x $station_path # Remove update.bin so that it is not read again next time Basics station starts rm -f /tmp/update.bin # Exit so that rest of this script which has binaries attached does not get executed exit 0
Adicionar script de carga

Ao script básico, anexamos o binário Basics Station, o version.txt que identifica a versão para a qual atualizar e station.conf em um script chamado addpayload.sh. Em seguida, execute este script.

*#!/bin/bash * base.sh > fwstation # Add station echo "STATION:" >> fwstation cat $1 >> fwstation echo "" >> fwstation echo "END_STATION:" >> fwstation # Add version.txt echo "VERSION:" >> fwstation cat $2 >> fwstation echo "" >> fwstation echo "END_VERSION:" >> fwstation # Add station.conf echo "CONF:" >> fwstation cat $3 >> fwstation echo "END_CONF:" >> fwstation # executable chmod +x fwstation

Depois de executar esses scripts, você pode executar o seguinte comando no terminal para gerar o arquivo de atualização do firmware, fwstation.

$ ./addpayload.sh station version.txt station.conf

Gerar a assinatura de atualização de firmware

O software LoRa Basics Station oferece atualizações de firmware assinadas com assinaturas ECDSA. Para oferecer suporte a atualizações assinadas, você precisará:

  • Uma assinatura que deve ser gerada por uma chave privada ECDSA e com menos de 128 bytes.

  • A chave privada que é usada para a assinatura e deve ser armazenada no gateway com o nome do arquivo do formato sig-%d.key. Recomendamos usar o nome do arquivo sig-0.key.

  • Um CRC de 32 bits sobre a chave privada.

A assinatura e o CRC serão passados para as APIs AWS IoT Core for LoRaWAN. Para gerar os arquivos anteriores, você pode usar o script gen.sh a seguir, inspirado no exemplo basicstation no repositório do GitHub.

*#!/bin/bash *function ecdsaKey() { # Key not password protected for simplicity openssl ecparam -name prime256v1 -genkey | openssl ec -out $1 } # Generate ECDSA key ecdsaKey sig-0.prime256v1.pem # Generate public key openssl ec -in sig-0.prime256v1.pem -pubout -out sig-0.prime256v1.pub # Generate signature private key openssl ec -in sig-0.prime256v1.pub -inform PEM -outform DER -pubin | tail -c 64 > sig-0.key # Generate signature openssl dgst -sha512 -sign sig-0.prime256v1.pem $1 > sig-0.signature # Convert signature to base64 openssl enc -base64 -in sig-0.signature -out sig-0.signature.base64 # Print the crc crc_res=$(crc32 sig-0.key)printf "The crc for the private key=%d\n" $((16#$crc_res)) # Remove the generated files which won't be needed later rm -rf sig-0.prime256v1.pem sig-0.signature sig-0.prime256v1.pub

A chave privada gerada pelo script deve ser salva no gateway. O arquivo da chave está em formato binário.

./gen_sig.sh fwstation read EC key writing EC key read EC key writing EC key read EC key writing EC key The crc for the private key=3434210794 $ cat sig-0.signature.base64 MEQCIDPY/p2ssgXIPNCOgZr+NzeTLpX+WfBo5tYWbh5pQWN3AiBROen+XlIdMScv AsfVfU/ZScJCalkVNZh4esyS8mNIgA== $ ls sig-0.key sig-0.key $ scp sig-0.key pi@192.168.1.11:/home/pi/Documents/basicstation/examples/iotwireless

Reveja as próximas etapas

Agora que você gerou o firmware e a assinatura, vá para o próximo tópico para fazer o upload do arquivo de firmware, fwstation, em um bucket do Amazon S3. O bucket é um contêiner que armazenará o arquivo de atualização do firmware como um objeto. Você pode adicionar um perfil do IAM que dará ao servidor CUPS permissão para ler o arquivo de atualização do firmware no bucket do S3.