

# 使用任务定义安排并运行固件更新
<a name="lorawan-schedule-firmware-update"></a>

您可以使用任务定义包含有关固件更新的详细信息并定义更新。适用于 LoRaWAN 的 AWS IoT Core 将根据与网关关联的以下三个字段中的信息提供固件更新。
+ 

**Station**  
Basics Station 软件的版本和构建时间。要识别此信息，您还可以使用网关运行的 Basics Station 软件生成该信息（例如，`2.0.5(rpi/std) 2021-03-09 03:45:09`）。
+ 

**PackageVersion**  
固件版本，由网关中的文件 `version.txt` 指定。虽然网关中可能不存在此信息，但我们建议您使用此方法定义固件版本（例如，`1.0.0`）。
+ 

**模型**  
网关正在使用的平台或模型（例如，Linux）。

此流程需要 20 分钟时间完成。

**Topics**
+ [获取网关上运行的当前版本](#lorawan-gateway-current-version)
+ [创建无限网关任务定义](#lorawan-create-task-definition)
+ [运行固件更新任务并跟踪进度](#lorawan-run-fwupdate-task)

## 获取网关上运行的当前版本
<a name="lorawan-gateway-current-version"></a>

要确定网关是否有资格进行固件更新，CUPS 服务器将检查所有三个字段：`Station`、`PackageVersion` 和 `Model`，网关在 CUPS 请求期间提供这些信息时，服务器将进行匹配。使用任务定义时，这些字段将作为 `CurrentVersion` 字段的一部分予以存储。

您可以使用 适用于 LoRaWAN 的 AWS IoT Core API 或 AWS CLI 为您的网关获取 `CurrentVersion`。以下命令演示如何使用 CLI 获取此信息。

1. 如果您已经预调配了网关，则可以使用 [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
   ```

   下面显示了此命令的示例输出。

   ```
   {
       "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. 借助 `get-wireless-gateway` 命令报告的无线网关 ID，您可以使用 [get-wireless-gateway-firmware-information](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-firmware-information.html) 命令来获取 `CurrentVersion`。

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

   下面显示了该命令的示例输出，其中包含 `CurrentVersion` 显示的所有三个字段的信息。

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

## 创建无限网关任务定义
<a name="lorawan-create-task-definition"></a>

在创建任务定义时，我们建议您使用 AutoCreateTasks 参数指定任务自动创建。`AutoCreateTasks` 适用于与前面提到的所有三个参数匹配的任何网关。如果禁用此参数，则必须手动将参数分配给网关。

您可以使用 适用于 LoRaWAN 的 AWS IoT Core API 或 AWS CLI 创建无限网关任务定义。以下命令演示如何使用 CLI 创建任务定义。

1. 创建一个文件，`input.json`，它将包含要传递给 `CreateWirelessGatewayTaskDefinition` API 的信息。在 `input.json` 文件中，提供之前获取的以下信息：
   + 

**UpdateDataSource**  
提供指向对象的链接，该对象中包含您上载到 S3 存储桶的固件更新文件（例如，`s3://iotwirelessfwupdate/fwstation`）。
   + 

**UpdateDataRole**  
提供指向您创建的 IAM 角色的角色 ARN 的链接，该角色提供读取 S3 存储桶的权限（例如，`arn:aws:iam::123456789012:role/IoTWirelessFwUpdateRole`）。
   + 

**SigKeyCRC 和 UpdateSignature**  
此信息可能由您的网关制造商提供，但如果您遵循 [生成固件更新文件和签名](lorawan-script-fwupdate-sigkey.md) 中所述的流程，则您将在生成签名时找到此信息。
   + 

**CurrentVersion**  
提供您之前通过运行 `get-wireless-gateway-firmware-information ` 命令获得的 `CurrentVersion` 输出。

     ```
     cat input.json
     ```

     下面显示的是 `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. 将 `input.json` 文件传递到 [create-wireless-gateway-task-definition](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-task-definition.html) 命令以创建任务定义。

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

   以下显示了命令的输出。

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

## 运行固件更新任务并跟踪进度
<a name="lorawan-run-fwupdate-task"></a>

网关已准备好接收固件更新，一旦打开电源，就会连接到 CUPS 服务器。当 CUPS 服务器在网关版本中找到匹配项时，它会计划固件更新。

任务是正在进行的任务定义。当您通过将 `AutoCreateTasks` 设置为 `True` 指定自动任务创建时，一旦找到匹配的网关，固件更新任务就会立即启动。

您可以使用 `GetWirelessGatewayTask` API 跟踪任务的进度。当您首次运行 [get-wireless-gateway-task](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-task.html) 命令时，它会将任务状态显示为 `IN_PROGRESS`。

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

以下显示了命令的输出。

```
{
    "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"
}
```

下次运行命令时，如果固件更新生效，它将显示更新后的字段，`Package`、`Version` 和 `Model`，而任务状态将变为 `COMPLETED`。

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

以下显示了命令的输出。

```
{
    "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"
}
```

在此示例中，我们向您展示了使用基于 Raspberry Pi 的 RAKWireless 网关的固件更新。固件更新脚本停止 BasicStation 的运行，以存储更新后的 `Package`、`Version` 和 `Model` 字段，因此必须重新启动 BasicStation。

```
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
```

如果固件更新失败，您将从 CUPS server 看到 `FIRST_RETRY` 的状态，而网关会发送相同的请求。如果 `SECOND_RETRY` 后 CUPS 服务器无法连接到网关，它将显示 `FAILED` 的状态。

在上一任务处于 `COMPLETED` 或者 `FAILED` 之后，使用 [delete-wireless-gateway-task](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/delete-wireless-gateway-task.html) 命令删除旧任务，然后再启动一个新任务。

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