

# 使用任務定義來排程和執行韌體更新
<a name="lorawan-schedule-firmware-update"></a>

您可以使用任務定義來包含韌體更新的詳細資訊，以及定義更新。AWS IoT Core for LoRaWAN 根據與閘道相關聯的下列三個欄位中的資訊來提供韌體更新。
+ 

**工作站**  
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 伺服器會在閘道於 CUPS 請求期間呈現所有三個欄位 (`Station`、`PackageVersion` 和 `Model`) 時，檢查它們是否符合資格。當您使用任務定義時，這些欄位會儲存為 `CurrentVersion` 欄位的一部分。

您可以使用 AWS IoT Core for LoRaWAN 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` 適用於任何符合前述所有三個參數的閘道。如果停用此參數，則必須手動將參數指派給閘道。

您可以建立無線閘道任務定義，方法為使用 AWS IoT Core for LoRaWAN API 或 AWS CLI。下列命令顯示如何使用 CLI 建立任務定義。

1. 建立檔案 `input.json`，其中將包含要傳遞至 `CreateWirelessGatewayTaskDefinition` API 的資訊。在 `input.json` 檔案中，提供您先前取得的下列資訊：
   + 

**UpdateDataSource**  
提供物件的連結，其中包含您上傳至 S3 儲存貯體的韌體更新檔案 (例如，`s3://iotwirelessfwupdate/fwstation`)。
   + 

**UpdateDataRole**  
為您建立的 IAM 角色提供角色 ARN 的連結，該 IAM 角色許可讀取 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 伺服器的狀態 `FIRST_RETRY`，而且閘道會傳送相同的請求。如果 CUPS 伺服器在 `SECOND_RETRY` 之後無法連接至閘道，它將顯示狀態 `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
```