创建和管理命令 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建和管理命令

使用 Amazon IoT Device Management 命令配置可重复使用的远程操作或向设备发送即时指令。通过 Amazon IoT 控制台或使用创建和管理命令 Amazon CLI。

创建命令资源

创建命令时提供以下信息:

  • 一般信息

    提供唯一的命令 ID,以便在目标设备上运行命令时识别该命令。(可选)指定用于管理的显示名称、描述和标签。

  • 有效载荷

    对于静态命令,请提供定义设备操作的负载。指定 Payload 格式类型以便正确解释设备。

    有关动态命令,请参阅 Payload 模板属性。

  • 有效载荷模板

    对于动态命令,请提供包含占位符和参数的 PayloadTemplate。(可选)提供defaultValue和条件。 Amazon IoT Device Management 命令会在运行时替换占位符。缺少的参数使用其默认值。所有值都必须满足定义的条件。

    支持以下区分大小写的占位符类型:

    • ${aws:iot:commandexecution::parameter:parameter1}— 名称parameter1为的参数值的占位符。

    • ${aws:iot:commandexecution::executionTimeoutSec}— 运行时提供的命令执行超时参数的占位符。

命令保留主题使用基于负载格式类型的格式。

  • 对于application/json我们的application/cbor内容类型,请使用此请求主题:

    $aws/commands/<devices>/<DeviceID>/executions/+/request/<PayloadFormat>
  • 对于其他内容类型或未指定格式,请使用此请求主题。有效负载格式显示在 MQTT 消息标头中。

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

无论负载类型如何,命令响应主题都使用jsoncbor格式化。 <PayloadFormat>必须是jsoncbor

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

以下各节介绍了 Payload 格式注意事项和通过控制台创建命令。

静态命令有效载荷格式

有效载荷支持任何不超过 32 KB 的格式。指定 Payload 格式类型以实现安全、正确的设备解释。

使用type/subtype格式(例如application/jsonapplication/cbor)指定负载格式类型。默认值:application/octet-stream。有关支持的格式,请参阅常用 MIME 类型

动态命令有效载荷格式

PayloadTemplate 必须是有效的 JSON,至少有一个占位符,最多 32 KB。

对于AwsJsonSubstitution预处理器, Amazon IoT Device Management 命令会根据预处理器配置以 JSON 或 CBOR 格式发送通知。

如何创建命令(控制台)

要从控制台创建命令,请转到 C ommand Hub 并按照以下步骤操作:

  1. 选择创建命令

  2. 指定唯一的命令 ID。

  3. (可选)指定显示名称、描述和标签。

  4. 上传包含设备操作的 Payload 文件。指定 Payload 格式类型以便正确解释设备。

  5. (可选)对于带有占位符的 JSON 负载模板,参数会预先填充到行内表中以供编辑。

  6. (可选)配置参数值类型(必填)、默认值和条件。

  7. 选择创建命令

使用 CreateCommandAP create-commandI 或 CLI 命令创建命令。

命令有效载荷

提供静态负载或负载模板。静态负载采用 base64 编码。对于负载模板,最终的有效载荷在运行时使用参数值生成。设备处理负载并执行指定的操作。指定 Payload 内容类型以便正确接收设备。

注意

命令创建后无法修改有效负载。创建新命令来修改有效负载。

IAM 策略示例

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

在此示例中:

  • region 替换成您的 Amazon Web Services 区域,例如 us-east-1

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

  • command-id使用您的 Amazon IoT 命令 ID 的唯一标识符,例如LockDoor。如果您想发送多个命令,可以在 IAM 策略的资源部分指定这些命令。

{ "Version":"2012-10-17", "Statement": { "Action": "iot:CreateCommand", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:command/command-id" } }

静态命令创建示例

以下示例显示了如何创建静态命令。根据您的应用程序,进行以下替换:

  • <command-id> 替换为命令的唯一标识符。例如,要锁上房屋的门,您可以指定LockDoor。我们建议您使用 UUID。您也可以使用字母数字字符、“-”和“_”。

  • (可选)<display-name><description>,这些是可选字段,您可以使用它们为命令提供友好名称和有意义的描述,例如 Lock the doors of my home

  • namespace,您可以使用它来指定命令的命名空间。它必须是 AWS-IoT。有关使用此功能的信息 Amazon IoT FleetWise,请参阅远程命令

  • payload 包含关于您要在运行命令时使用的有效载荷及其内容类型的信息。

aws iot create-command \ --command-id <command-id> \ --display-name <display-name> \ --description <description> \ --namespace AWS-IoT \ --payload '{"content":"eyAibWVzc2FnZSI6ICJIZWxsbyBJb1QiIH0=","contentType":"application/json"}'

运行此命令生成一个响应,其中包含命令的 ID 和 ARN(Amazon 资源名称)。例如,如果您在创建期间指定了 LockDoor 命令,以下显示运行命令的示例输出。

{ "commandId": "LockDoor", "commandArn": "arn:aws:iot:us-east-1:123456789012:command/LockDoor" }

动态命令创建示例

以下示例显示了如何创建动态命令。根据您的应用程序,进行以下替换:

  • <command-id> 替换为命令的唯一标识符。例如,要设置灯光电源状态,可以指定Light_Power_Status。我们建议您使用 UUID。您也可以使用字母数字字符、“-”和“_”。

  • (可选)<display-name><description>,这些是可选字段,您可以使用它们为命令提供友好名称和有意义的描述,例如 Turn a light ON or OFF

  • namespace,您可以使用它来指定命令的命名空间。它必须是 AWS-IoT。有关使用此功能的信息 Amazon IoT FleetWise,请参阅远程命令

  • payloadTemplate包含带有占位符的 JSON 格式的 playoad 模板。

  • preprocessor包含预处理器的配置,用于确定必须如何处理 PayloadTemplate。

  • mandatoryParameter包含与 PayloadTemplate 中占位符对应的参数、其类型、默认值和条件。

aws iot create-command \ --command-id Light_Power_Status \ --description "Turn a light ON or OFF" \ --namespace AWS-IoT \ --payload-template '{"powerStatus":"${aws:iot:commandexecution::parameter:powerStatus}"}' \ --preprocessor awsJsonSubstitution={outputFormat=JSON} \ --mandatory-parameters "name=powerStatus, defaultValue={S=OFF}, valueConditions=[{comparisonOperator=IN_SET, operand={strings=['ON','OFF']}}]"

运行此命令生成一个响应,其中包含命令的 ID 和 ARN(Amazon 资源名称)。例如,如果您在创建期间指定了 Light_Power_Status 命令,以下显示运行命令的示例输出。

{ "commandId": "Light_Power_Status", "commandArn": "arn:aws:iot:us-east-1:123456789012:command/Light_Power_Status" }

检索关于命令的信息

创建命令后,您可以从 Amazon IoT 控制台和使用 Amazon CLI检索关于它的信息。您可以获取以下信息。

  • 命令 ID、Amazon 资源名称(ARN)、您为命令指定的任何显示名称和描述。

  • 命令状态,指示命令是否可用于在目标设备上运行,或者是否已被弃用或正在删除。

  • 您提供的有效负载或负载模板。

  • 您提供的预处理器。

  • 您提供的必填参数。

  • 创建命令和上次更新命令的时间。

要从控制台检索命令,请转到控制台的 Amazon IoT C ommand Hub,然后选择您创建的命令以查看其详细信息。

除了命令详细信息外,您还可以看到命令历史,它提供关于命令在目标设备上执行的信息。在设备上运行此命令后,您可以在此选项卡上找到关于执行的信息。

使用 GetCommandHTTP 控制平面 API 操作或get-command Amazon CLI 命令来检索有关命令资源的信息。您必须已经使用 CreateCommand API 请求或 create-command CLI 创建了命令。

IAM 策略示例

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

在此示例中:

  • region 替换成您的 Amazon Web Services 区域,例如 us-east-1

  • account-id 替换成您的 Amazon Web Services 账户 编号,例如 123456789023

  • command-id使用您的 Amazon IoT 唯一命令标识符,例如LockDoorLight_Power_Status。如果您想检索多个命令,可以在 IAM 策略的资源部分指定这些命令。

{ "Version":"2012-10-17", "Statement": { "Action": "iot:GetCommand", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:command/command-id" } }

检索命令示例 (Amazon CLI)

以下示例说明如何使用检索命令的相关信息get-command Amazon CLI。根据您的应用程序,将 <command-id> 替换为您要检索信息的命令的标识符。您可以从 create-command CLI 的响应中获取此信息。

aws iot get-command --command-id <command-id>

运行此命令生成一个响应,其中包含关于命令、有效载荷以及它被创建和最后更新时间的信息。它还提供指示命令是否已被弃用或正在删除的信息。

例如,以下代码显示一个示例响应。

{ "commandId": "LockDoor", "commandArn": "arn:aws:iot:<region>:<account>:command/LockDoor", "namespace": "AWS-IoT", "payload":{ "content": "eyAibWVzc2FnZSI6ICJIZWxsbyBJb1QiIH0=", "contentType": "application/json" }, "createdAt": "2024-03-23T00:50:10.095000-07:00", "lastUpdatedAt": "2024-03-23T00:50:10.095000-07:00", "deprecated": false, "pendingDeletion": false }

列出你中的命令 Amazon Web Services 账户

创建命令后,您可以查看您在账户中创建的命令。在列表中,您可以找到关于以下信息:

  • 命令 ID,以及您为命令指定的任何显示名称。

  • 命令的 Amazon 资源名称(ARN)。

  • 命令状态,指示命令是否可用于在目标设备上运行,或者是否已被弃用。

    注意

    列表不显示正在从您的账户中删除的命令。如果命令待删除,您仍然可以使用它们的命令 ID 查看这些命令的详细信息。

  • 创建命令和上次更新命令的时间。

在 Amazon IoT 控制台中,您可以转到 Comm and Hub,找到您创建的命令列表及其详细信息。

要列出您创建的命令,请使用 ListCommands API 操作或 list-commands CLI。

IAM 策略示例

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

在此示例中:

  • region 替换成您的 Amazon Web Services 区域,例如 us-east-1

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

{ "Version":"2012-10-17", "Statement": { "Action": "iot:ListCommands", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:command/*" } }

列出您账户中的命令示例

以下命令说明如何列出您账户中的命令。

aws iot list-commands --namespace "AWS-IoT"

运行此命令会生成一个响应,其中包含您创建的命令列表、命令的创建时间以及最后更新时间。它还提供命令状态信息,指示命令是否已被弃用或可用于在目标设备上运行。有关不同状态和状态原因的更多信息,请参阅 命令执行状态

更新命令资源

创建命令后,您可以更新命令的显示名称和描述。

注意

命令的有效载荷无法更新。要更新此信息或使用修改后的有效载荷,您需要创建一个新命令。

要从控制台更新命令,请转到控制台的 Command Hub 并执行以下步骤。 Amazon IoT

  1. 要更新现有命令资源,选择您要更新的命令,然后在操作下选择编辑

  2. 指定您要使用的显示名称和描述,以及任何作为命令标签的名称-值对。

  3. 选择编辑以保存具有新设置的命令。

使用UpdateCommand控制平面 API 操作或更新命令资源。update-command Amazon CLI 使用此 API,您可以:

  • 编辑您创建的命令的显示名称和描述。

  • 弃用命令资源,或恢复已弃用的命令。

IAM 策略示例

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

在此示例中:

  • region 替换成您的 Amazon Web Services 区域,例如 us-east-1

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

  • command-id 替换成您的 Amazon IoT 唯一命令标识符,例如 LockDoor。如果您想检索多个命令,可以在 IAM 策略的资源部分指定这些命令。

{ "Version":"2012-10-17", "Statement": { "Action": "iot:UpdateCommand", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:command/command-id" } }

更新关于命令的信息示例 (Amazon CLI)

以下示例向您展示如何使用命令更新有关命令的信息。update-command Amazon CLI 有关如何使用此 API 弃用或恢复命令资源的信息,请参阅 更新命令资源(CLI)

该示例说明您如何更新命令的显示名称和描述。根据您的应用程序,将 <command-id> 替换为您要检索信息的命令的标识符。

aws iot update-command \ --command-id <command-id> --displayname <display-name> \ --description <description>

运行此命令会生成一个响应,其中包含关于命令的更新信息以及最后更新时间。以下代码显示一个示例请求和响应,用于更新关闭 AC 的命令的显示名称和描述。

aws iot update-command \ --command-id <LockDoor> \ --displayname <Secondary lock door> \ --description <Locks doors to my home>

运行此命令会生成以下响应。

{ "commandId": "LockDoor", "commandArn": "arn:aws:iot:us-east-1:123456789012:command/LockDoor", "displayName": "Secondary lock door", "description": "Locks doors to my home", "lastUpdatedAt": "2024-05-09T23:15:53.899000-07:00" }

弃用或恢复命令资源

创建命令后,如果您不再想继续使用该命令,可以将其标记为已弃用。当您弃用一个命令时,所有待处理的命令执行将继续在目标设备上运行,直到它们达到终端状态。一旦命令被弃用,如果您想使用它(例如向目标设备发送新的命令执行),您必须恢复它。

注意

您无法编辑已弃用的命令,或为其运行任何新的执行。要在设备上运行新命令,您必须恢复它,以便命令状态更改为“可用”。

有关弃用和恢复命令的更多信息及其注意事项,请参阅 弃用命令资源

删除命令资源

如果您不再想使用某个命令,可以将其从您的账户中永久删除。如果删除操作成功:

  • 如果命令已被弃用的持续时间超过 12 小时的最大超时时间,该命令将被立即删除。

  • 如果命令未被弃用,或已被弃用的持续时间短于最大超时时间,该命令将处于 pending deletion 状态。它将在最大超时时间 12 小时后自动从您的账户中移除。

注意

即使有任何待处理的命令执行,该命令也可能被删除。该命令将处于待删除状态,并将自动从您的账户中移除。

要从控制台删除命令,请转到控制台的 Command Hub 并执行以下步骤。 Amazon IoT

  1. 选择要删除的命令,然后在操作下选择删除

  2. 确认要删除该命令,然后选择删除

该命令将被标记为待删除,并将在 12 小时后从您的账户中永久移除。

使用 DeleteCommand HTTP 控制平面 API 操作或delete-command Amazon CLI 命令删除命令资源。如果删除操作成功,您将看到 HTTP statusCode 状态码为 204 或 202,并且该命令将在最大超时持续时间 12 小时后自动从您的账户中删除。在状态码为 204 的情况下,表示该命令已被删除。

IAM 策略示例

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

在此示例中:

  • region 替换成您的 Amazon Web Services 区域,例如 us-east-1

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

  • command-id 替换成您的 Amazon IoT 唯一命令标识符,例如 LockDoor。如果您想检索多个命令,可以在 IAM 策略的资源部分指定这些命令。

{ "Version":"2012-10-17", "Statement": { "Action": "iot:DeleteCommand", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:command/command-id" } }

删除命令示例 (Amazon CLI)

以下示例说明如何使用命令删除delete-command Amazon CLI 命令。根据您的应用程序,将 <command-id> 替换为要删除的命令的标识符。

aws iot delete-command --command-id <command-id>

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