

# Pianifica ed esegui l'aggiornamento del firmware utilizzando una definizione di processo
<a name="lorawan-schedule-firmware-update"></a>

È possibile utilizzare una definizione di processo per includere dettagli sull'aggiornamento del firmware e definire l'aggiornamento. AWS IoT Core per LoRaWAN fornisce un aggiornamento del firmware basato sulle informazioni dei seguenti tre campi associati al gateway.
+ 

**Station**  
La versione e il tempo di compilazione del software Basics Station. Per identificare queste informazioni, è inoltre possibile generarle utilizzando il software Basics Station che viene eseguito dal gateway (ad esempio, `2.0.5(rpi/std) 2021-03-09 03:45:09`).
+ 

**PackageVersion**  
La versione del firmware, specificata dal file `version.txt` nel gateway. Anche se queste informazioni potrebbero non essere presenti nel gateway, è consigliabile utilizzarle come metodo per definire la versione del firmware (ad esempio, `1.0.0`).
+ 

**Modello**  
La piattaforma o il modello utilizzato dal gateway (ad esempio, Linux).

Questa procedura richiede 20 minuti.

**Topics**
+ [Scarica la versione corrente in esecuzione sul tuo gateway](#lorawan-gateway-current-version)
+ [Creare una definizione di attività Wireless gateway](#lorawan-create-task-definition)
+ [Esegui il processo di aggiornamento del firmware e monitora l'avanzamento](#lorawan-run-fwupdate-task)

## Scarica la versione corrente in esecuzione sul tuo gateway
<a name="lorawan-gateway-current-version"></a>

Per determinare l'idoneità del gateway per un aggiornamento del firmware, il server CUPS controlla tutti e tre i campi `Station`, `PackageVersion` e `Model`, per una corrispondenza quando il gateway li presenta durante una richiesta CUPS. Quando si utilizza una definizione di attività, questi campi vengono memorizzati come parte del campo `CurrentVersion`.

Puoi utilizzare l'API AWS IoT Core per LoRaWAN o AWS CLI per ottenere il `CurrentVersion` per il gateway. I comandi seguenti mostrano come ottenere queste informazioni utilizzando la CLI.

1. Se è già stato eseguito il provisioning di un gateway, è possibile ottenere informazioni sul gateway utilizzando il comando [get-wireless-gateway](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway.html).

   ```
   aws iotwireless get-wireless-gateway \ 
       --identifier 5a11b0a85a11b0a8 \ 
           --identifier-type GatewayEui
   ```

   L'esempio seguente mostra un output di esempio per questo comando.

   ```
   {
       "Name": "Raspberry pi",
       "Id": "1352172b-0602-4b40-896f-54da9ed16b57",
       "Description": "Raspberry pi",
       "LoRaWAN": {
           "GatewayEui": "5a11b0a85a11b0a8",
           "RfRegion": "US915"
       },
       "Arn": "arn:aws:iotwireless:us-east-1:231894231068:WirelessGateway/1352172b-0602-4b40-896f-54da9ed16b57"
   }
   ```

1. Utilizzando l'ID del gateway wireless riportato dal comando `get-wireless-gateway`, puoi utilizzare il comando [get-wireless-gateway-firmware-informazioni](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-firmware-information.html) per ottenere `CurrentVersion`. 

   ```
   aws iotwireless get-wireless-gateway-firmware-information \
       --id "3039b406-5cc9-4307-925b-9948c63da25b"
   ```

   Di seguito viene mostrato un output di esempio per il comando, con le informazioni provenienti da tutti e tre i campi visualizzati dal `CurrentVersion`.

   ```
   {
       "LoRaWAN": {
           "CurrentVersion": {
               "PackageVersion": "1.0.0",
               "Model": "rpi",
               "Station": "2.0.5(rpi/std) 2021-03-09 03:45:09"
           }
       }
   }
   ```

## Creare una definizione di attività Wireless gateway
<a name="lorawan-create-task-definition"></a>

Quando si crea la definizione dell'attività, si consiglia di specificare la creazione automatica delle attività utilizzando il parametro AutoCreateTasks. `AutoCreateTasks` si applica a qualsiasi gateway che abbia una corrispondenza per tutti e tre i parametri menzionati in precedenza. Se questo parametro è disabilitato, i parametri devono essere assegnati manualmente al gateway.

È possibile creare la definizione del processo del gateway wireless utilizzando l'API AWS IoT Core per LoRaWAN o AWS CLI. I comandi seguenti mostrano come creare la definizione di processo utilizzando la CLI.

1. Crea un file, `input.json`, che conterrà le informazioni da passare all’API `CreateWirelessGatewayTaskDefinition`. Nel file `input.json`, fornisci le informazioni riportate di seguito:
   + 

**UpdateDataSource**  
Fornisci il collegamento all'oggetto contenente il file di aggiornamento del firmware caricato nel bucket S3. (ad esempio, `s3://iotwirelessfwupdate/fwstation`).
   + 

**UpdateDataRole**  
Fornisci il collegamento al ruolo ARN del ruolo IAM creato, che fornisce le autorizzazioni per leggere il bucket S3. (ad esempio, `arn:aws:iam::123456789012:role/IoTWirelessFwUpdateRole`).
   + 

**SigKeyCRC e UpdateSignature**  
Queste informazioni potrebbero essere fornite dal produttore del gateway, ma se è stata eseguita la procedura descritta in [Genera il file di aggiornamento del firmware e la firma](lorawan-script-fwupdate-sigkey.md), queste informazioni si trovano quando si genera la firma.
   + 

**CurrentVersion**  
Fornisci il `CurrentVersion` che è stato ottenuto in precedenza eseguendo il comando `get-wireless-gateway-firmware-information `.

     ```
     cat input.json
     ```

     Di seguito viene mostrato il contenuto del file `input.json`.

     ```
     {
         "AutoCreateTasks": true,
         "Name": "FirmwareUpdate",
         "Update":
         {
             "UpdateDataSource" : "s3://iotwirelessfwupdate/fwstation",
             "UpdateDataRole" : "arn:aws:iam::123456789012:role/IoTWirelessFwUpdateRole",
             "LoRaWAN" :
             {
                 "SigKeyCrc": 3434210794,
                 "UpdateSignature": "MEQCIDPY/p2ssgXIPNCOgZr+NzeTLpX+WfBo5tYWbh5pQWN3AiBROen+XlIdMScvAsfVfU/ZScJCalkVNZh4esyS8mNIgA==",
                 "CurrentVersion" :
                 {
                 "PackageVersion": "1.0.0",
                 "Model": "rpi",
                 "Station": "2.0.5(rpi/std) 2021-03-09 03:45:09"
                 }
             }
         }
     }
     ```

1. Passa il file `input.json` nel comando [create-wireless-gateway-task-definition](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-task-definition.html) per creare la definizione dell'attività. 

   ```
   aws iotwireless create-wireless-gateway-task-definition \ 
       --cli-input-json file://input.json
   ```

   Di seguito viene mostrato l'output del comando.

   ```
   {
       "Id": "4ac46ff4-efc5-44fd-9def-e8517077bb12",
       "Arn": "arn:aws:iotwireless:us-east-1:231894231068:WirelessGatewayTaskDefinition/4ac46ff4-efc5-44fd-9def-e8517077bb12"
   }
   ```

## Esegui il processo di aggiornamento del firmware e monitora l'avanzamento
<a name="lorawan-run-fwupdate-task"></a>

Il gateway è pronto per ricevere l'aggiornamento del firmware e, una volta acceso, si connette al server CUPS. Quando il server CUPS trova una corrispondenza nella versione del gateway, pianifica un aggiornamento del firmware.

Un processo è una definizione di processo in corso. Una volta specificata la creazione automatica delle attività impostando `AutoCreateTasks` a `True`, l'attività di aggiornamento del firmware viene avviata non appena viene trovato un gateway corrispondente.

È possibile tenere traccia dello stato di avanzamento dell'attività utilizzando l’API `GetWirelessGatewayTask`. Quando si esegue il comando [get-wireless-gateway-task](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-task.html) per la prima volta, mostrerà lo stato dell'attività come `IN_PROGRESS`.

```
aws iotwireless get-wireless-gateway-task \ 
    --id 1352172b-0602-4b40-896f-54da9ed16b57
```

Di seguito viene mostrato l'output del comando.

```
{
    "WirelessGatewayId": "1352172b-0602-4b40-896f-54da9ed16b57",
    "WirelessGatewayTaskDefinitionId": "ec11f9e7-b037-4fcc-aa60-a43b839f5de3",
    "LastUplinkReceivedAt": "2021-03-12T09:56:12.047Z",
    "TaskCreatedAt": "2021-03-12T09:56:12.047Z",
    "Status": "IN_PROGRESS"
}
```

Quando si esegue il comando la volta successiva, se l'aggiornamento del firmware ha effetto, mostrerà i campi aggiornati `Package`, `Version` e `Model` e lo stato dell'attività cambia in `COMPLETED`.

```
aws iotwireless get-wireless-gateway-task \ 
    --id 1352172b-0602-4b40-896f-54da9ed16b57
```

Di seguito viene mostrato l'output del comando.

```
{
    "WirelessGatewayId": "1352172b-0602-4b40-896f-54da9ed16b57",
    "WirelessGatewayTaskDefinitionId": "ec11f9e7-b037-4fcc-aa60-a43b839f5de3",
    "LastUplinkReceivedAt": "2021-03-12T09:56:12.047Z",
    "TaskCreatedAt": "2021-03-12T09:56:12.047Z",
    "Status": "COMPLETED"
}
```

In questo esempio, abbiamo mostrato l'aggiornamento del firmware utilizzando il gateway RAKWireless basato su Raspberry Pi. Lo script di aggiornamento del firmware interrompe la BasicStation in esecuzione per archiviare l'aggiornamento `Package`, `Version` e i campi `Model` in modo che BasicStation debba essere riavviato.

```
2021-03-12 09:56:13.108 [CUP:INFO] CUPS provided update.bin
2021-03-12 09:56:13.108 [CUP:INFO] CUPS provided signature len=70 keycrc=37316C36
2021-03-12 09:56:13.148 [CUP:INFO] ECDSA key#0 -> VERIFIED
2021-03-12 09:56:13.148 [CUP:INFO] Running update.bin as background process
2021-03-12 09:56:13.149 [SYS:VERB] /tmp/update.bin: Forked, waiting...
2021-03-12 09:56:13.151 [SYS:INFO] Process /tmp/update.bin (pid=6873) completed
2021-03-12 09:56:13.152 [CUP:INFO] Interaction with CUPS done - next regular check in 10s
```

Se l'aggiornamento del firmware non riesce, viene visualizzato lo stato `FIRST_RETRY` dal server CUPS e il gateway invia la stessa richiesta. Se il server CUPS non è in grado di connettersi al gateway dopo un `SECOND_RETRY`, mostrerà uno stato di `FAILED`.

Dopo l'attività precedente è stata `COMPLETED` o `FAILED`, elimina la vecchia attività utilizzando il comando [delete-wireless-gateway-task](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/delete-wireless-gateway-task.html) prima di avviarne uno nuovo.

```
aws iotwireless delete-wireless-gateway-task \ 
    --id 1352172b-0602-4b40-896f-54da9ed16b57
```