

# タスク定義を使用してファームウェア更新をスケジュールし、実行する
<a name="lorawan-schedule-firmware-update"></a>

タスク定義を使用して、ファームウェア更新に関する詳細を含めたり、更新を定義できます。AWS IoT Core for LoRaWAN では、ゲートウェイに関連付けられた次の 3 つのフィールドからの情報に基づいてファームウェアの更新が提供されます。
+ 

**ステーション**  
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` のフィールドを提示したときに、これら 3 つのフィールドすべてについて、一致を確認します。タスク定義を使用する場合、これらのフィールドは `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"
   ```

   以下は、このコマンドの出力例で、3 つのフィールドすべての情報が `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` は、前述の 3 つのパラメータすべてに一致するゲートウェイに適用されます。このパラメータが無効になっている場合は、パラメータを手動でゲートウェイに割り当てる必要があります。

AWS IoT Core for LoRaWAN API または AWS CLI を使用してワイヤレスゲートウェイのタスク定義を作成できます。以下のコマンドは、CLI を使用してタスク定義を作成する方法を示します。

1. `input.json` ファイルを作成します。このファイルには、`CreateWirelessGatewayTaskDefinition` API に渡す情報が含まれます。`input.json` ファイルで、前に取得した次の情報を指定します。
   + 

**UpdateDataSource**  
S3 バケットにアップロードしたファームウェア更新ファイルを含むオブジェクトへのリンクを指定します (例えば、`s3://iotwirelessfwupdate/fwstation`)。
   + 

**UpdateDataRole**  
S3 バケットを読み取る許可を提供する、作成した IAM ロールのロール ARN へのリンクを指定します (例えば、`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 ゲートウェイを使用したファームウェア更新を紹介しました。更新された `Package`、`Version`、および `Model` フィールドを保存するために、ファームウェア更新スクリプトによって、実行中の BasicStation が停止します。そのため、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` のステータスが表示され、ゲートウェイは同じ要求を送信します。`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
```