タスク定義を使用してファームウェア更新をスケジュールし、実行する - AWS IoT Wireless

タスク定義を使用してファームウェア更新をスケジュールし、実行する

タスク定義を使用して、ファームウェア更新に関する詳細を含めたり、更新を定義できます。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 分かかります。

ゲートウェイで現在実行されているバージョンを取得する

ゲートウェイがファームウェア更新の対象であるかどうかを判断するために、CUPS サーバーは、CUPS 要求時にゲートウェイが StationPackageVersionModel のフィールドを提示したときに、これら 3 つのフィールドすべてについて、一致を確認します。タスク定義を使用する場合、これらのフィールドは CurrentVersion フィールドの一部として格納されています。

AWS IoT Core for LoRaWAN API または AWS CLI を使用して、ゲートウェイの CurrentVersion を取得できます。次のコマンドは、CLI を使用してこの情報を取得する方法を示しています。

  1. ゲートウェイを既にプロビジョニングしている場合は、get-wireless-gateway コマンドを使用して、ゲートウェイに関する情報を取得できます。

    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" }
  2. get-wireless-gateway コマンドによって報告されたワイヤレスゲートウェイ ID を使用して、get-wireless-gateway-firmware-information コマンドによって 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" } } }

ワイヤレスゲートウェイタスク定義を作成する

タスク定義を作成するときは、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

      この情報はゲートウェイの製造元から提供されている可能性がありますが、「ファームウェア更新ファイルと署名を生成する」で説明されている手順に従った場合は、署名の生成時にこの情報を見つけることができます。

    • 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" } } } }
  2. input.json ファイルを create-wireless-gateway-task-definition コマンドに渡して、タスク定義を作成します。

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

ファームウェア更新タスクを実行し、進捗状況を追跡する

ゲートウェイはファームウェア更新を受信する準備ができており、電源が入ると CUPS サーバーに接続します。CUPS サーバーは、ゲートウェイのバージョンで一致するものを検出すると、ファームウェア更新をスケジュールします。

タスクとは、処理中のタスク定義です。AutoCreateTasksTrue に設定して自動タスク作成を指定したので、一致するゲートウェイが見つかるとすぐにファームウェア更新タスクが開始されます。

GetWirelessGatewayTask API を使用してタスクの進行状況を追跡できます。get-wireless-gateway-task コマンドを初めて実行すると、タスクのステータスが 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" }

次回にこのコマンドを実行した場合、ファームウェアの更新が有効になると、更新されたフィールド PackageVersionModel が表示され、タスクのステータスが 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 ゲートウェイを使用したファームウェア更新を紹介しました。更新された PackageVersion、および 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 コマンドを実行して古いタスクを削除します。

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