使用任务定义计划并运行固件更新 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用任务定义计划并运行固件更新

您可以使用任务定义包含有关固件更新的详细信息并定义更新。适用于 LoRaWAN 的 Amazon IoT Core 将根据与网关关联的以下三个字段中的信息提供固件更新。

  • Station

    Basics Station 软件的版本和构建时间。要识别此信息,您还可以使用网关运行的 Basics Station 软件生成该信息(例如,2.0.5(rpi/std) 2021-03-09 03:45:09)。

  • PackageVersion

    固件版本,由网关中的文件 version.txt 指定。虽然网关中可能不存在此信息,但我们建议您使用此方法定义固件版本(例如,1.0.0)。

  • Model

    网关正在使用的平台或模型(例如,Linux)。

此流程需要 20 分钟时间完成。

获取网关上运行的当前版本

要确定网关是否有资格进行固件更新,CUPS 服务器将检查所有三个字段:StationPackageVersionModel,网关在 CUPS 请求期间提供这些信息时,服务器将进行匹配。使用任务定义时,这些字段将作为 CurrentVersion 字段的一部分予以存储。

您可以使用适用于 LoRaWAN 的 Amazon IoT Core API 或 Amazon 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 适用于与前面提到的所有三个参数匹配的任何网关。如果禁用此参数,则必须手动将参数分配给网关。

您可以使用适用于 LoRaWAN 的 Amazon IoT Core API 或 Amazon CLI 创建无限网关任务定义。以下命令演示如何使用 CLI 创建任务定义。

  1. 创建一个文件,input.json,它将包含要传递给 CreateWirelessGatewayTaskDefinition API 的信息。在 input.json 文件中,提供之前获取的以下信息:

    • UpdateDataSource

      提供指向对象的链接,该对象中包含您上载到 S3 存储桶的固件更新文件(例如,s3://iotwirelessfwupdate/fwstation)。

    • UpdateDataRole

      提供指向您创建的 IAM 角色的角色 ARN 的链接,该角色提供读取 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 server 看到 FIRST_RETRY 的状态,而网关会发送相同的请求。如果 SECOND_RETRY 后 CUPS 服务器无法连接到网关,它将显示 FAILED 的状态。

在上一任务处于 COMPLETED 或者 FAILED 之后,使用 delete-wireless-gateway-task 命令删除旧任务,然后再启动一个新任务。

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