使用任務定義來排程和執行韌體更新
您可以使用任務定義來包含韌體更新的詳細資訊,以及定義更新。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 請求期間呈現所有三個欄位 (Station
、PackageVersion
和 Model
) 時,檢查它們是否符合資格。當您使用任務定義時,這些欄位會儲存為 CurrentVersion
欄位的一部分。
您可以使用 AWS IoT Core for LoRaWAN API 或 AWS CLI,為您的閘道取得 CurrentVersion
。下列命令顯示如何使用 CLI 來取得此資訊。
-
如果已經佈建閘道,您可以使用 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" }
-
使用
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 建立任務定義。
-
建立檔案
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" } } } }
-
-
將
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" }
當您下次執行命令時,如果韌體更新生效,它會顯示更新的欄位 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 命令刪除舊的任務,然後再啟動新任務。
aws iotwireless delete-wireless-gateway-task \ --id 1352172b-0602-4b40-896f-54da9ed16b57