启动和监控命令执行 - AWS IoT Core

启动和监控命令执行

创建命令资源后,您可以在目标设备上启动命令执行。一旦设备开始执行命令,它可以开始更新命令执行的结果,并将状态更新和结果信息发布到 MQTT 保留主题。然后,您可以检索命令执行的状态并监控您账户中执行的状态。

本节介绍您如何同时使用 AWS IoT 控制台和 AWS CLI 来启动和监控命令。

启动命令执行

重要

您全权负责以安全且符合适用法律的方式部署命令。

在启动命令执行之前,您必须确保:

  • 您已在 AWS IoT 命名空间中创建了一个命令并提供了有效载荷信息。当您开始执行命令时,设备将处理有效载荷中的指令并执行指定的操作。有关创建命令的信息,请参阅 创建命令资源

  • 您的设备已订阅 MQTT 命令保留主题。当您启动命令执行时,有效载荷信息将发布到以下 MQTT 保留请求主题。

    在这种情况下,<devices> 可以是物联网事物或 MQTT 客户端,而 <DeviceID> 是事物名称或客户端 ID。支持的 <PayloadFormat> 是 JSON 和 CBOR。有关命令主题的更多信息,请参阅 命令主题

    $aws/commands/<devices>/<DeviceID>/executions/+/request/<PayloadFormat>

    如果 <PayloadFormat> 不是 JSON 和 CBOR,则以下显示命令主题格式。

    $aws/commands/<devices>/<DeviceID>/executions/+/request

当您要运行命令时,必须指定将接收命令并执行指定指令的目标设备。目标设备可以是 AWS IoT 事物,或者如果设备尚未在 AWS IoT 注册表中注册,则可以是客户端 ID。接收命令有效载荷后,设备可以开始执行命令并执行指定的操作。

AWS IoT 事物

该命令的目标设备可以是您在 AWS IoT 事物注册表中注册的 AWS IoT 事物。AWS IoT 中的事物可让您更轻松地搜索和管理设备。

您可以在将设备连接到 AWS IoT 时,从连接设备页面或使用 CreateThing API 将设备注册为事物。您可以从 AWS IoT 控制台的事物中心页面或使用 DescribeThing API 找到要为其运行命令的现有事物。有关如何将设备注册为 AWS IoT 事物的信息,请参阅使用注册表管理事物

客户端 ID

如果您的设备尚未向 AWS IoT 注册为事物,则可以改用客户端 ID。

客户端 ID 是您分配给设备或客户端的唯一标识符。客户端 ID 在 MQTT 协议中定义,可以包含字母数字字符、下划线或破折号。它对于连接到 AWS IoT 的每个设备必须是唯一的。

注意
  • 如果您的设备已在 AWS IoT 注册表中注册为事物,则客户端 ID 可以与事物名称相同。

  • 如果您的命令执行针对特定的 MQTT 客户端 ID,为了从基于客户端 ID 的命令主题接收命令有效载荷,您的设备必须使用相同的客户端 ID 连接到 AWS IoT。

客户端 ID 通常是您的设备在连接到 AWS IoT Core 时可以使用的 MQTT 客户端 ID。此 ID 由 AWS IoT 用于识别每个特定设备并管理连接和订阅。

超时表示设备可以提供命令执行结果的持续时间(以秒为单位)。

创建命令执行后,计时器启动。如果设备在超时时间内离线或未能报告执行结果,则命令执行将超时,执行状态将报告为 TIMED_OUT

此字段是可选的,如果您不指定任何值,则默认为 10 秒。也可以将超时配置为最大值 12 小时。

超时值和 TIMED_OUT 执行状态

云端和设备均可报告超时情况。

在命令发送到设备后,计时器启动。如果在指定的超时持续时间内(如上所述)没有收到来自设备的响应。在这种情况下,云端将命令执行状态设置为 TIMED_OUT,原因代码为 $NO_RESPONSE_FROM_DEVICE

这可能发生在以下任一情况。

  • 设备在执行命令时离线。

  • 设备未能在指定持续时间内完成运行命令。

  • 设备未能在超时持续时间内报告更新的状态信息。

在这种情况下,当从云端报告 TIMED_OUT 的执行状态时,命令执行是非终端的。您的设备可以发布响应,将状态覆盖为任何终端状态,SUCCEEDEDFAILEDREJECTED。命令执行现在变为终端,并不再接受任何进一步的更新。

您的设备还可以通过报告在执行命令时发生超时来更新由云端发起的 TIMED_OUT 状态。在这种情况下,命令执行状态保持在 TIMED_OUT,但 statusReason 对象将根据设备报告的信息进行更新。命令执行现在将变为终端,并且不再接受进一步的更新。

使用 MQTT 持久会话

您可以配置 MQTT 持久会话以与 AWS IoT Device Management 命令功能一起使用。此功能在诸如您的设备离线并且您希望确保设备在超时持续时间之前重新上线时仍能接收命令并执行指定指令的情况下特别有用。

默认情况下,MQTT 持久会话到期时间设置为 60 分钟。如果您的命令执行超时配置为超过此时长,运行时间超过 60 分钟的命令执行可能会被消息代理拒绝并可能失败。要运行持续时间超过 60 分钟的命令,您可以请求延长持续会话的到期时间。

注意

为确保您正确使用 MQTT 持久会话功能,请确保“清理开始”标志设置为零。有关更多信息,请参阅 MQTT 持久会话

要从控制台开始运行命令,请转到 AWS IoT 控制台的命令中心页面并执行以下步骤。

  1. 要运行您创建的命令,请选择运行命令

  2. 查看您创建的命令的相关信息、有效载荷文件和格式类型以及 MQTT 保留主题。

  3. 指定您要为其运行命令的目标设备。设备可以指定为 AWS IoT 事物(如果它已在 AWS IoT 注册),或者使用客户端 ID(如果您的设备尚未注册)。有关更多信息,请参阅 目标设备注意事项

  4. (可选)为命令配置一个超时值,该值决定了您希望命令在超时前运行的持续时间。如果您的命令需要运行超过 60 分钟,您可能必须增加 MQTT 持久会话的过期时间。有关更多信息,请参阅 命令执行超时注意事项

  5. 选择 Run command(运行命令)

使用 StartCommandExecution HTTP 数据面板 API 操作来启动命令执行。API 请求和响应通过命令执行 ID 进行关联。设备完成命令执行后,它可以通过向命令响应主题发布消息来向云端报告状态和执行结果。对于自定义响应代码,您拥有的应用程序代码可以处理响应消息并将结果发布到 AWS IoT。

如果您的设备已订阅命令请求主题,则 StartCommandExecution API 将有效载荷消息发布到该主题。有效载荷可以使用您选择的任何格式。有关更多信息,请参阅 命令有效载荷

$aws/commands/<devices>/<DeviceID>/executions/+/request/<PayloadFormat>

如果有效载荷格式不是 JSON 或 CBOR,则以下显示命令请求主题的格式。

$aws/commands/<devices>/<DeviceID>/executions/+/request

IAM 策略示例

在使用此 API 操作之前,请确保您的 IAM 策略授权您对设备执行此操作。以下示例显示一个 IAM 策略,允许用户执行 StartCommandExecution 操作。

在此示例中:

  • region 替换成您的 AWS 区域,例如 ap-south-1

  • account-id 替换成您的 AWS 账户 编号,例如 123456789012

  • command-id 替换成您的 AWS IoT 命令的唯一标识符,例如 LockDoor。如果您想发送多个命令,可以在 IAM 策略指定这些命令。

  • devices 替换成 thingclient,具体取决于您的设备是否已注册为 AWS IoT 事物,或指定为 MQTT 客户端。

  • device-id 替换成您的 AWS IoT thing-nameclient-id

{ "Effect": "Allow", "Action": [ "iot:StartCommandExecution" ], "Resource": [ "arn:aws:iot:region:account-id:command/command-id", "arn:aws:iot:region:account-id:devices/device-id" ] }

获取账户特定的数据面板端点

在运行 API 命令之前,您必须获取该端点的账户特定端点 URL。如果您使用双栈端点(IPv4 和 IPv6),请使用 iot:Data-ATSiot:Jobs 端点仅适用于 IPv4。例如,如果您运行此命令:

aws iot describe-endpoint --endpoint-type iot:Data-ATS

它将返回账户特定的端点 URL,如下面的示例响应所示。

{ "endpointAddress": "<account-specific-prefix>-ats.iot.<region>.api.com" }

启动命令执行示例 (AWS CLI)

以下示例显示如何使用 start-command-execution AWS CLI 命令开始执行命令。

在此示例中:

  • <command-arn> 替换成您要执行的命令的 ARN。您可以从 create-command CLI 命令的响应中获取此信息。例如,如果您要执行更改方向盘模式的命令,请使用 arn:aws:iot:region:account-id:command/SetComfortSteeringMode

  • <target-arn> 替换成目标设备的事物 ARN,该设备可以是您要对其执行命令的物联网事物或 MQTT 客户端。例如,如果您要为目标设备 myRegisteredThing 执行命令,请使用 arn:aws:iot:region:account-id:thing/myRegisteredThing

  • <endpoint-url> 替换成您在 获取账户特定的数据面板端点 中获取的账户特定端点,并以 https:// 为前缀。例如 https://123456789012abcd.jobs.iot.ap-south-1.amazonaws.com

  • (可选)您还可以在执行 StartCommandExecution API 操作时指定一个附加参数 executionTimeoutSeconds。此可选字段指定设备必须完成执行命令的时间(以秒为单位)。默认值为 10 秒。当命令执行状态为 CREATED 时,计时器启动。如果在计时器到期前未收到命令执行结果,则状态自动更改为 TIMED_OUT

aws iot-jobs-data start-command-execution \ --command-arn <command-arn> \ --target-arn <target-arn> \ --endpoint <endpoint-url> \ --execution-timeout-seconds 900

运行此命令会返回一个命令执行 ID。您可以使用此 ID 查询命令执行状态、详细信息和命令执行历史记录。

注意

如果命令已被弃用,则 StartCommandExecution API 请求将失败并出现验证异常。要修复此错误,请首先使用 UpdateCommand API 恢复命令,然后执行 StartCommandExecution 请求。

{ "executionId": "07e4b780-7eca-4ffd-b772-b76358da5542" }

更新命令执行的结果

使用 UpdateCommandExecution MQTT 数据面板 API 操作更新命令执行的状态或结果。

注意

在使用此 API 之前:

  • 您的设备必须已建立 MQTT 连接并订阅命令请求和响应主题。有关更多信息,请参阅 高级命令工作流程

  • 您必须已经使用 StartCommandExecution API 操作执行了此命令。

在使用此 API 操作之前,请确保您的 IAM 策略授权您的设备执行这些操作。以下显示一个授权您的设备执行该操作的示例策略。有关允许用户执行 UpdateCommandExecution 操作的其他示例 IAM 策略,请参阅 连接和发布策略示例

在此示例中:

  • Region 替换成您的 AWS 区域,例如 ap-south-1

  • AccountID 替换成您的 AWS 账户 编号,例如 123456789012

  • ThingName 替换成您针对其执行命令的 AWS IoT 事物的名称,例如 myRegisteredThing

  • commands-request-topiccommands-response-topic 替换成您的 AWS IoT 命令请求主题和响应主题的名称。有关更多信息,请参阅 高级命令工作流程

MQTT 客户端 ID 的示例 IAM 策略

以下代码显示使用 MQTT 客户端 ID 时的示例设备策略。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Publish", "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response/json" ] }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/request", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response/accepted", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response/rejected", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/request/json", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response/accepted/json", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/clients/${iot:ClientId}/executions/*/response/rejected/json" ] }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/request", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/response/accepted", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/response/rejected", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/request/json", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/response/accepted/json", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/clients/${iot:ClientId}/executions/+/response/rejected/json" ] }, { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:us-east-1:123456789012:client/${iot:ClientId}" } ] }

IoT 事物的示例 IAM 策略

以下代码显示使用 AWS IoT 事物时的示例设备策略。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/response" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/request", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/response/accepted", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/response/rejected", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/request/json", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/response/accepted/json", "arn:aws:iot:us-east-1:123456789012:topic/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/*/response/rejected/json" ] }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/request", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/response/accepted", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/response/rejected", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/request/json", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/response/accepted/json", "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/commands/things/${iot:Connection.Thing.ThingName}/executions/+/response/rejected/json" ] }, { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:us-east-1:123456789012:client/${iot:ClientId}" } ] }

在请求主题收到命令执行后,设备处理该命令。然后,它使用 UpdateCommandExecution API 将命令执行的状态和结果更新为以下响应主题。

$aws/commands/<devices>/<DeviceID>/executions/<ExecutionId>/response/<PayloadFormat>

在此示例中,<DeviceID> 是您目标设备的唯一标识符,<execution-id> 是目标设备上命令执行的标识符。<PayloadFormat> 可以是 JSON 或 CBOR。

注意

如果您尚未向 AWS IoT 注册您的设备,您可以使用客户端 ID 作为您的标识符,而不是事物名称。

$aws/commands/clients/<ClientID>/executions/<ExecutionId>/response/<PayloadFormat>

设备报告的执行状态更新

您的设备可以使用 API 向命令执行报告以下任何状态更新。有关这些状态的更多信息,请参阅 命令执行状态

  • IN_PROGRESS:当设备开始执行命令时,它可以将状态更新为 IN_PROGRESS

  • SUCCEEDED:当设备成功处理命令并完成执行后,设备可以将消息作为 SUCCEEDED 发布到响应主题。

  • FAILED:如果设备执行命令失败,它可以将消息作为 FAILED 发布到响应主题。

  • REJECTED:如果设备接受命令失败,它可以将消息作为 REJECTED 发布到响应主题。

  • TIMED_OUT:命令执行状态可因以下任何原因更改为 TIMED_OUT

    • 未收到命令执行结果。这可能是因为执行未在指定持续时间内完成,或者设备未能将状态信息发布到响应主题。

    • 设备报告在尝试执行命令时发生超时。

有关 TIMED_OUT 状态的更多信息,请参阅 超时值和 TIMED_OUT 执行状态

使用 UpdateCommandExecution API 时的注意事项

以下是使用 UpdateCommandExecution API 时的一些重要注意事项。

  • 您的设备可以使用一个可选的 statusReason 对象,该对象可用于提供有关执行的附加信息。如果您的设备提供此对象,则该对象的 reasonCode 字段是必需的,但 reasonDescription 字段是可选的。

  • 当您的设备使用 statusReason 对象时,reasonCode 必须使用该模式 [A-Z0-9_-]+,并且长度不超过 64 个字符。如果您提供 reasonDescription,请确保其长度不超过 1024 个字符。它可以使用除控制字符(如换行符)之外的任何字符。

  • 您的设备可以使用一个可选的 result 对象来提供关于命令执行结果的信息,例如远程函数调用的返回值。如果您提供 result,它必须要求至少一个条目。

  • result 字段中,您将条目指定为键值对。对于每个条目,您必须将数据类型信息指定为字符串、布尔值或二进制。字符串数据类型必须使用键 s,布尔数据类型使用键 b,二进制数据类型必须使用键 bin。您必须确保这些数据类型以小写形式提及。

  • 如果在运行 UpdateCommandExecution API 时遇到错误,您可以在 Amazon CloudWatch 的 AWSIoTLogsV2 日志组中查看该错误。有关启用日志记录和查看日志的信息,请参阅 配置 AWS IoT 日志记录

UpdateCommandExecution API 示例

以下代码显示一个示例,说明您的设备如何使用 UpdateCommandExecution API 报告执行状态、使用 statusReason 字段提供有关状态的附加信息,以及使用结果字段提供有关执行结果的信息,例如本例中的汽车电池百分比。

{ "status": "IN_PROGRESS", "statusReason": { "reasonCode": "200", "reasonDescription": "Execution_in_progress" }, "result": { "car_battery": { "s": "car battery at 50 percent" } } }

检索命令执行

运行命令后,您可以从 AWS IoT 控制台并使用 AWS CLI 检索有关命令执行的信息。您可以获取以下信息。

注意

要检索最新的命令执行状态,您的设备必须使用 UpdateCommandExecution MQTT API 将状态信息发布到响应主题,如下所述。在设备发布到此主题之前,GetCommandExecution API 会将状态报告为 CREATEDTIMED_OUT

您创建的每个命令执行都将具有:

  • 执行 ID,它是命令执行的唯一标识符。

  • 代码执行输出的状态。当您在目标设备上运行命令时,命令执行进入 CREATED 状态。然后,它可以转换到其它命令执行状态,如下所述。

  • 命令执行的结果

  • 唯一的命令 ID 和已为其创建执行的目标设备。

  • 开始日期,显示命令执行的创建时间。

您可以使用以下任一方法从控制台检索命令执行。

  • 从命令中心页面

    转到 AWS IoT 控制台的命令中心页面并执行这些步骤。

    1. 选择您在其目标设备上创建了执行的命令。

    2. 在命令详细信息页面的命令历史选项卡上,您将看到您创建的执行。选择要检索信息的执行。

    3. 如果您的设备使用 UpdateCommandExecution API 提供了结果信息,您可以在本页的“结果”选项卡中找到此信息。

  • 从事物中心页面

    如果您在运行命令时选择了 AWS IoT 事物作为目标设备,您可以从事物中心页面查看执行详细信息。

    1. 转到 AWS IoT 控制台中的事物中心页面,并选择您为其创建了命令执行的事物。

    2. 在事物详细信息页面的命令历史上,您将看到您创建的执行。选择要检索信息的执行。

    3. 如果您的设备使用 UpdateCommandExecution API 提供了结果信息,您可以在本页的“结果”选项卡中找到此信息。

使用 GetCommandExecutionAWS IoT Core 控制面板 HTTP API 操作检索有关命令执行的信息。您必须已经使用 StartCommandExecution API 操作执行了此命令。

IAM 策略示例

在使用此 API 操作之前,请确保您的 IAM 策略授权您对设备执行此操作。以下示例显示一个 IAM 策略,允许用户执行 GetCommandExecution 操作。

在此示例中:

  • region 替换成您的 AWS 区域,例如 ap-south-1

  • account-id 替换成您的 AWS 账户 编号,例如 123456789012

  • command-id 替换成您的唯一 AWS IoT 命令标识符,例如 LockDoor

  • devices 替换成 thingclient,具体取决于您的设备是否已注册为 AWS IoT 事物,或指定为 MQTT 客户端。

  • device-id 替换成您的 AWS IoT thing-nameclient-id

{ "Effect": "Allow", "Action": [ "iot:GetCommandExecution" ], "Resource": [ "arn:aws:iot:region:account-id:command/command-id", "arn:aws:iot:region:account-id:devices/device-id" ] }

检索命令执行示例

以下示例显示您如何使用 start-command-execution AWS CLI 命令检索有关已执行命令的信息。以下示例显示如何检索有关已执行的、用于关闭方向盘模式的命令的信息。

在此示例中:

  • <execution-id> 替换成您要检索信息的命令执行的标识符。

  • <target-arn> 替换成您要执行命令的目标设备的 Amazon 资源编号(ARN)。您可以从 start-command-execution CLI 命令的响应中获取此信息。

  • 或者,如果您的设备使用 UpdateCommandExection API 提供了执行结果,您可以使用 GetCommandExecution API 指定是否在 GetCommandExecution API 的响应中包含命令执行结果。

aws iot get-command-execution --execution-id <execution-id> \ --target-arn <target-arn> \ --include-result

运行此命令会生成一个响应,其中包含有关命令执行的 ARN、执行状态、开始执行时间以及完成时间的信息。它还提供一个 statusReason 对象,其中包含有关状态的附加信息。有关不同状态和状态原因的更多信息,请参阅 命令执行状态

以下代码显示 API 请求的示例响应。

注意

执行响应中的 completedAt 字段对应于设备向云端报告终端状态的时间。对于 TIMED_OUT 状态,仅当设备报告超时时,才会设置此字段。当 TIMED_OUT 状态由云端设置时,TIMED_OUT 状态不会更新。有关超时行为的更多信息,请参阅 命令执行超时注意事项

{ "executionId": "07e4b780-7eca-4ffd-b772-b76358da5542", "commandArn": "arn:aws:iot:ap-south-1:123456789012:command/LockDoor", "targetArn": "arn:aws:iot:ap-south-1:123456789012:thing/myRegisteredThing", "status": "SUCCEEDED", "statusReason": { "reasonCode": "DEVICE_SUCCESSFULLY_EXECUTED", "reasonDescription": "SUCCESS" }, "result": { "sn": { "s": "ABC-001" }, "digital": { "b": true } }, "createdAt": "2024-03-23T00:50:10.095000-07:00", "completedAt": "2024-03-23T00:50:10.095000-07:00" }

使用 MQTT 测试客户端查看命令更新

您可以使用 MQTT 测试客户端查看使用命令功能时通过 MQTT 进行的消息交换。在您的设备与 AWS IoT 建立 MQTT 连接后,您可以创建命令、指定有效载荷,然后在设备上运行它。当您运行命令时,如果您的设备已订阅 MQTT 命令保留请求主题,它将看到发布到该主题的有效载荷消息。

然后,设备接收有效载荷指令并在物联网设备上执行指定的操作。然后,它使用 UpdateCommandExecution API 将命令执行结果和状态信息发布到 MQTT 命令保留响应主题。AWS IoT Device Management 监听响应主题上的更新,存储更新后的信息,并将日志发布到 AWS CloudTrail 和 Amazon CloudWatch。然后,您可以从控制台或使用 GetCommandExecution API 检索最新的命令执行信息。

以下步骤显示如何使用 MQTT 测试客户端观察消息。

  1. 在 AWS IoT 控制台中打开 MQTT 测试客户端

  2. 在“订阅”选项卡上,输入以下主题,然后选择“订阅”,其中 <thingId> 是您向 AWS IoT 注册的设备的事物名称。

    注意

    您可以从 AWS IoT 控制台的事物中心页面找到设备的事物名称,或者如果尚未将设备注册为事物,您可以在从连接设备页面连接到 AWS IoT 时注册设备。

    $aws/commands/things/<thingId>/executions/+/request
  3. (可选)在订阅选项卡上,您还可以输入以下主题并选择订阅

    $aws/commands/things/+/executions/+/response/accepted/json $aws/commands/things/+/executions/+/response/rejected/json
  4. 当您启动命令执行时,消息有效载荷将使用设备已订阅的请求主题 $aws/commands/things/<thingId>/executions/+/request 发送到设备。在 MQTT 测试客户端中,您应该看到包含设备处理命令指令的命令有效载荷。

  5. 设备开始执行命令后,它可以将状态更新发布到以下 MQTT 命令保留响应主题。

    $aws/commands/<devices>/<device-id>/executions/<executionId>/response/json

    例如,考虑一个您执行的命令,用于打开汽车的空调以将温度降低到期望值。以下 JSON 显示车辆发布到响应主题的示例消息,显示它未能执行该命令。

    { "deviceId": "My_Car", "executionId": "07e4b780-7eca-4ffd-b772-b76358da5542", "status": "FAILED", "statusReason": { "reasonCode": "CAR_LOW_ON_BATTERY", "reasonDescription": "Car battery is lower than 5 percent" } }

    在这种情况下,您可以给汽车电池充电,然后再次运行该命令。

列出您 AWS 账户 中的命令执行

运行命令后,您可以从 AWS IoT 控制台并使用 AWS CLI 检索有关命令执行的信息。您可以获取以下信息。

  • 执行 ID,它是命令执行的唯一标识符。

  • 代码执行输出的状态。当您在目标设备上运行命令时,命令执行进入 CREATED 状态。然后,它可以转换到其它命令执行状态,如下所述。

  • 唯一的命令 ID 和已为其创建执行的目标设备。

  • 开始日期,显示命令执行的创建时间。

您可以使用以下任一方法从控制台查看所有命令执行。

  • 从命令中心页面

    转到 AWS IoT 控制台的命令中心页面并执行这些步骤。

    1. 选择您在其目标设备上创建了执行的命令。

    2. 在命令详细信息页面中,转到命令历史选项卡,您将看到您创建的执行列表。

  • 从事物中心页面

    如果您在运行命令时选择了 AWS IoT 事物作为目标设备,并为单个设备创建了多个命令执行,您可以从事物中心页面查看该设备的执行。

    1. 转到 AWS IoT 控制台中的事物中心页面,并选择您为其创建了执行的事物。

    2. 在事物详细信息页面的命令历史选项卡上,您将看到为该设备创建的执行列表。

使用 ListCommandExecutionsAWS IoT Core 控制面板 HTTP API 操作列出您账户中的所有命令执行。

IAM 策略示例

在使用此 API 操作之前,请确保您的 IAM 策略授权您对设备执行此操作。以下示例显示一个 IAM 策略,允许用户执行 ListCommandExecutions 操作。

在此示例中:

  • region 替换成您的 AWS 区域,例如 ap-south-1

  • account-id 替换成您的 AWS 账户 编号,例如 123456789012

  • command-id 替换成您的唯一 AWS IoT 命令标识符,例如 LockDoor

{ "Effect": "Allow", "Action": "iot:ListCommandExecutions", "Resource": * }

列出命令执行示例

以下示例显示如何列出您 AWS 账户 中的命令执行。

运行命令时,您必须指定是否筛选列表,以仅显示使用 targetArn 为特定设备创建的命令执行,或使用 commandArn 为特定命令指定的执行。

在此示例中:

  • <target-arn> 与您要执行命令的目标设备的 Amazon 资源编号(ARN),例如 arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f

  • <target-arn> 与您要执行命令的目标设备的 Amazon 资源编号(ARN),例如 arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f

  • <after> 与您希望列出在此时间之后创建的执行的时间,例如 2024-11-01T03:00

aws iot list-command-executions \ --target-arn <target-arn> \ --started-time-filter '{after=<after>}' \ --sort-order "ASCENDING"

运行此命令会生成一个响应,其中包含您创建的命令执行列表,以及执行开始和完成的时间。它还提供状态信息,以及包含有关状态附加信息的 statusReason 对象。

{ "commandExecutions": [ { "commandArn": "arn:aws:iot:us-east-1:123456789012:command/TestMe002", "executionId": "b2b654ca-1a71-427f-9669-e74ae9d92d24", "targetArn": "arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f", "status": "TIMED_OUT", "createdAt": "2024-11-24T14:39:25.791000-08:00", "startedAt": "2024-11-24T14:39:25.791000-08:00" }, { "commandArn": "arn:aws:iot:us-east-1:123456789012:command/TestMe002", "executionId": "34bf015f-ef0f-4453-acd0-9cca2d42a48f", "targetArn": "arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f", "status": "IN_PROGRESS", "createdAt": "2024-11-24T14:05:36.021000-08:00", "startedAt": "2024-11-24T14:05:36.021000-08:00" } ] }

有关不同状态和状态原因的更多信息,请参阅 命令执行状态

删除命令执行

如果您不再想使用某个命令执行,可以将其从您的账户中永久删除。

注意
  • 只有当命令执行进入终端状态(例如 SUCCEEDEDFAILEDREJECTED)时,才能将其删除。

  • 此操作只能使用 AWS IoT Core API 或 AWS CLI 执行。控制台不提供此操作。

在使用此 API 操作之前,请确保您的 IAM 策略授权您的设备执行这些操作。以下显示一个授权您的设备执行该操作的示例策略。

在此示例中:

  • Region 替换成您的 AWS 区域,例如 ap-south-1

  • AccountID 替换成您的 AWS 账户 编号,例如 123456789012

  • CommandID 替换成您要删除其执行的命令的标识符。

  • devices 替换成 thingclient,具体取决于您的设备是否已注册为 AWS IoT 事物,或指定为 MQTT 客户端。

  • device-id 替换成您的 AWS IoT thing-nameclient-id

{ "Effect": "Allow", "Action": [ "iot:DeleteCommandExecution" ], "Resource": [ "arn:aws:iot:region:account-id:command/command-id", "arn:aws:iot:region:account-id:devices/device-id" ] }

以下示例显示您如何使用 delete-command AWS CLI 命令删除命令。根据您的应用程序,将 <execution-id> 替换为您要删除的命令执行的标识符,并将 <target-arn> 替换为您目标设备的 ARN。

aws iot delete-command-execution \ --execution-id <execution-id> \ --target-arn <target-arn>

如果 API 请求成功,则该命令执行会生成状态码 200。您可以使用 GetCommandExecution API 来验证该命令执行是否已不在您的账户中。