使用任務定義來排程和執行韌體更新 - AWS IoT Wireless

使用任務定義來排程和執行韌體更新

您可以使用任務定義來包含韌體更新的詳細資訊,以及定義更新。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 分鐘才能完成。

取得目前在閘道上執行的版本

若要判斷閘道是否符合韌體更新的資格,CUPS 伺服器會在閘道於 CUPS 請求期間呈現所有三個欄位 (StationPackageVersionModel) 時,檢查它們是否符合資格。當您使用任務定義時,這些欄位會儲存為 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"

    下列顯示命令的範例輸出,其中資訊來自 CurrentVersion 顯示的所有三個欄位。

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

建立無線閘道任務定義

建立任務定義時,建議您使用 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

      此資訊可能是由閘道製造商提供,但如果已遵循 產生韌體更新檔案和簽章 所述的程序,您會在產生簽章時找到此資訊。

    • 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 伺服器在閘道版本中找到相符項目時,就會排定韌體更新。

任務是程序中的任務定義。當您已將 AutoCreateTasks 設定為 True 來指定自動任務建立時,只要找到相符的閘道,韌體更新任務就會開始。

您可以使用 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 閘道進行的韌體更新。韌體更新指令碼會停止執行中的 BasicStation,以存放更新的 PackageVersionModel 欄位,因此必須重新啟動 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

在前一個任務是 COMPLETEDFAILED 之後,請使用 delete-wireless-gateway-task 命令刪除舊的任務,然後再啟動新任務。

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