Génération du fichier de mise à jour du micrologiciel et de la signature
Les étapes de cette procédure sont facultatives et dépendent de la passerelle que vous utilisez. Les fabricants de passerelles fournissent leur propre mise à jour du micrologiciel sous la forme d’un fichier de mise à jour ou d’un script et Basics Station exécute ce script en arrière-plan. Dans ce cas, vous trouverez probablement le fichier de mise à jour du micrologiciel dans les notes de version de la passerelle que vous utilisez. Vous pouvez ensuite utiliser ce fichier ou script de mise à jour à la place et passer à Téléchargement du fichier du micrologiciel vers un compartiment S3 et ajout d’un rôle IAM.
Si vous ne disposez pas de ce script, voici les commandes à exécuter pour générer le fichier de mise à jour du micrologiciel. Les mises à jour peuvent également être signées pour garantir que le code n’a pas été modifié ou corrompu et que les appareils exécutent du code publié uniquement par des auteurs fiables.
Dans le cadre de cette procédure, vous allez :
Générer le fichier de mise à jour du micrologiciel
Le logiciel LoRa Basics Station exécuté sur la passerelle est capable de recevoir des mises à jour du micrologiciel dans la réponse CUPS. Si vous n’avez pas de script fourni par le fabricant, reportez-vous au script de mise à jour du micrologiciel suivant, écrit pour la passerelle sans fil RAKWireless basée sur le Raspberry Pi. Nous avons un script de base et le nouveau binaire de la station, le fichier de version, et station.conf
sont attachés à celui-ci.
Note
Le script est spécifique à la passerelle RAKWireless, vous devrez donc l’adapter à votre application en fonction de la passerelle que vous utilisez.
Script de base
Vous trouverez ci-dessous un exemple de script de base pour la passerelle sans fil RAKWireless basée sur le Raspberry Pi. Vous pouvez enregistrer les commandes suivantes dans un fichier base.sh
, puis exécuter le script dans le terminal sur le navigateur Web du 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
Ajouter un script de charge utile
Au script de base, nous ajoutons le binaire Basics Station, le fichier version.txt qui identifie la version à mettre à jour, et station.conf
dans un script appelé addpayload.sh
. Exécutez ensuite ce 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
Après avoir exécuté ces scripts, vous pouvez exécuter la commande suivante dans le terminal pour générer le fichier de mise à jour du micrologiciel, fwstation
.
$ ./addpayload.sh station version.txt station.conf
Générer une signature pour la mise à jour du micrologiciel
Le logiciel LoRa Basics Station fournit des mises à jour du micrologiciel signées avec des signatures ECDSA. Pour prendre en charge les mises à jour signées, vous avez besoin des éléments suivants :
-
Signature qui doit être générée par une clé privée ECDSA et inférieure à 128 octets.
-
La clé privée qui est utilisée pour la signature et doit être stockée dans la passerelle avec le nom de fichier au format
sig-%d.key
. Nous vous recommandons d’utiliser le nom du fichiersig-0.key
. -
Un CRC 32 bits sur la clé privée.
La signature et le CRC seront transmis aux API AWS IoT Core for LoRaWAN. Pour générer les fichiers précédents, vous pouvez utiliser le script gen.sh
suivant, inspiré de l’exemple de basicstation
*#!/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
La clé privée générée par le script doit être enregistrée dans la passerelle. Le fichier clé est au format binaire.
./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
Passer en revue les étapes suivantes
Maintenant que vous avez généré le micrologiciel et la signature, passez à la rubrique suivante pour télécharger le fichier du micrologiciel dans un compartiment Amazon S3 fwstation
. Le compartiment est un conteneur qui stockera le fichier de mise à jour du micrologiciel sous forme d’objet. Vous pouvez ajouter un rôle IAM qui autorisera le serveur CUPS à lire le fichier de mise à jour du micrologiciel dans le compartiment S3.