

# Agende e execute a atualização do firmware usando uma definição de tarefa
<a name="lorawan-schedule-firmware-update"></a>

Você pode usar uma definição de tarefa para incluir detalhes sobre a atualização do firmware e definir a atualização. AWS IoT Core for LoRaWAN oferece uma atualização de firmware com base nas informações dos três campos a seguir associados ao gateway.
+ 

**Estação**  
A versão e o tempo de compilação do software Basics Station. Para identificar essas informações, você também pode gerá-las usando o software Basics Station que está sendo executado pelo gateway (por exemplo, `2.0.5(rpi/std) 2021-03-09 03:45:09`).
+ 

**PackageVersion**  
A versão do firmware, especificada pelo arquivo `version.txt` no gateway. Embora essas informações possam não estar presentes no gateway, recomendamos que elas sejam uma forma de definir a versão do firmware (por exemplo, `1.0.0`).
+ 

**Modelo**  
A plataforma ou o modelo que está sendo usado pelo gateway (por exemplo, Linux).

Esse procedimento leva 20 minutos para ser concluído.

**Topics**
+ [Obtenha a versão atual em execução no gateway](#lorawan-gateway-current-version)
+ [Criar uma definição de tarefa de gateway sem fio](#lorawan-create-task-definition)
+ [Execute a tarefa de atualização do firmware e acompanhe o progresso](#lorawan-run-fwupdate-task)

## Obtenha a versão atual em execução no gateway
<a name="lorawan-gateway-current-version"></a>

Para determinar a elegibilidade do gateway para uma atualização de firmware, o servidor CUPS verifica todos os três campos, `Station`, `PackageVersion` e `Model`, em busca de uma correspondência quando o gateway os apresenta durante uma solicitação do CUPS. Quando você usa uma definição de tarefa, esses campos são armazenados como parte do campo `CurrentVersion`.

Você pode usar a API AWS IoT Core for LoRaWAN ou a AWS CLI para obter `CurrentVersion` para o gateway. Os comandos a seguir mostram como obter essas informações usando a CLI.

1. Se você já tiver provisionado um gateway, poderá obter informações sobre ele usando o 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
   ```

   Confira a seguir um exemplo de saída para o 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. Usando o ID do gateway sem fio informado pelo comando `get-wireless-gateway`, você pode usar o comando [get-wireless-gateway-firmware-information](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-firmware-information.html) para obter `CurrentVersion`. 

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

   A seguir, confira um exemplo de saída para o comando, com informações de todos os três campos exibidos pela `CurrentVersion`.

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

## Criar uma definição de tarefa de gateway sem fio
<a name="lorawan-create-task-definition"></a>

Ao criar a definição da tarefa, é recomendável especificar a criação automática de tarefas utilizando o parâmetro AutoCreateTasks. O `AutoCreateTasks` aplica-se a qualquer gateway que corresponda aos três parâmetros mencionados anteriormente. Se esse parâmetro estiver desativado, os parâmetros deverão ser atribuídos manualmente ao gateway.

Você pode criar a definição da tarefa do gateway sem fio usando a API AWS IoT Core for LoRaWAN ou a AWS CLI. Os comandos a seguir mostram como criar a definição da tarefa usando a CLI.

1. Crie um arquivo, `input.json`, que conterá as informações a serem passadas para a API `CreateWirelessGatewayTaskDefinition`. No arquivo `input.json`, dê as seguintes informações que você obteve anteriormente:
   + 

**UpdateDataSource**  
Forneça o link para seu objeto contendo o arquivo de atualização do firmware que você carregou no bucket do S3 (por exemplo, `s3://iotwirelessfwupdate/fwstation`).
   + 

**UpdateDataRole**  
Forneça o link para o ARN do perfil do IAM criado, que dá permissões para ler o bucket do S3 (por exemplo, `arn:aws:iam::123456789012:role/IoTWirelessFwUpdateRole`).
   + 

**SigKeyCRC e UpdateSignature**  
Essas informações podem ser fornecidas pelo fabricante do gateway, mas se seguiu o procedimento descrito em [Gere o arquivo e a assinatura de atualização de firmware](lorawan-script-fwupdate-sigkey.md), você as encontrará ao gerar a assinatura.
   + 

**CurrentVersion**  
Apresente a saída `CurrentVersion` que você obteve anteriormente executando o comando `get-wireless-gateway-firmware-information `.

     ```
     cat input.json
     ```

     O exemplo a seguir mostra o conteúdo do arquivo `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. Passe o arquivo `input.json` para o comando [create-wireless-gateway-task-definition](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-task-definition.html) para criar a definição da tarefa. 

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

   Confira a seguir a saída do comando.

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

## Execute a tarefa de atualização do firmware e acompanhe o progresso
<a name="lorawan-run-fwupdate-task"></a>

O gateway está pronto para receber a atualização do firmware e, uma vez ligado, ele se conecta ao servidor CUPS. Quando o servidor CUPS encontra uma correspondência na versão do gateway, ele agenda uma atualização de firmware.

Uma tarefa é uma definição de tarefa em andamento. Como você especificou a criação automática de tarefas definindo `AutoCreateTasks` como `True`, a tarefa de atualização do firmware começará assim que um gateway correspondente for encontrado.

É possível acompanhar o andamento da tarefa usando a API `GetWirelessGatewayTask`. Quando você executa o comando [get-wireless-gateway-task](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-task.html) pela primeira vez, ele mostra o status da tarefa como `IN_PROGRESS`.

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

Confira a seguir a saída do 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 você executar o comando da próxima vez, se a atualização do firmware entrar em vigor, ela mostrará os campos atualizados, `Package`, `Version` e `Model` e o status da tarefa será alterado para `COMPLETED`.

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

Confira a seguir a saída do 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"
}
```

Neste exemplo, mostramos a atualização do firmware usando o RAKWireless Gateway baseado em Raspberry Pi. O script de atualização do firmware interrompe a execução do BasicStation para armazenar os campos `Package`, `Version` e `Model` atualizados, portanto, BasicStation precisará ser reiniciado.

```
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 a atualização do firmware falhar, você verá um status de `FIRST_RETRY` do servidor CUPS e o gateway enviará a mesma solicitação. Se o servidor CUPS não conseguir se conectar ao gateway após um `SECOND_RETRY`, ele mostrará um status de `FAILED`.

Depois que a tarefa anterior for `COMPLETED` ou `FAILED`, exclua a tarefa antiga usando o comando [delete-wireless-gateway-task](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/delete-wireless-gateway-task.html) antes de iniciar uma nova.

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