本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
创建和管理命令
使用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
无论负载类型如何,命令响应主题都使用json或cbor格式化。 <PayloadFormat>必须是json或cbor:
$aws/commands/<devices>/<DeviceID>/executions/<ExecutionId>/response/<PayloadFormat>
以下各节介绍了 Payload 格式注意事项和通过控制台创建命令。
静态命令有效载荷格式
有效载荷支持任何不超过 32 KB 的格式。指定 Payload 格式类型以实现安全、正确的设备解释。
使用格式指定 Payload type/subtype 格式类型(例如application/json或application/cbor)。默认值:application/octet-stream。有关支持的格式,请参阅常用 MIME 类型
动态命令有效载荷格式
PayloadTemplate 必须是有效的 JSON,至少有一个占位符,最多 32 KB。
对于AwsJsonSubstitution预处理器,Amazon IoT Device Management命令会根据预处理器配置以 JSON 或 CBOR 格式发送通知。
如何创建命令(控制台)
要从控制台创建命令,请转到 C ommand Hub
-
选择创建命令。
-
指定唯一的命令 ID。
-
(可选)指定显示名称、描述和标签。
-
上传包含设备操作的 Payload 文件。指定 Payload 格式类型以便正确解释设备。
-
(可选)对于带有占位符的 JSON 负载模板,参数会预先填充到行内表中以供编辑。
-
(可选)配置参数值类型(必填)、默认值和条件。
-
选择创建命令。
使用 CreateCommandAP create-commandI 或 CLI 命令创建命令。
命令有效载荷
提供静态负载或负载模板。静态负载采用 base64 编码。对于负载模板,最终的有效载荷在运行时使用参数值生成。设备处理负载并执行指定的操作。指定 Payload 内容类型以便正确接收设备。
注意
命令创建后无法修改有效负载。创建新命令来修改有效负载。
IAM 策略示例
在使用此 API 操作之前,请确保您的 IAM 策略授权您对设备执行此操作。以下示例显示一个 IAM 策略,允许用户执行 CreateCommand 操作。
在此示例中:
-
将
替换成您的 Amazon Web Services 区域,例如region。us-east-1 -
将
替换成您的 Amazon Web Services 账户 编号,例如account-id。123456789012 -
使用您的Amazon IoT命令 ID 的唯一标识符,例如command-id。如果您想发送多个命令,可以在 IAM 策略的资源部分指定这些命令。LockDoor
-
{ "Version":"2012-10-17", "Statement": { "Action": "iot:CreateCommand", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:command/command-id" } }
静态命令创建示例
以下示例说明如何创建静态命令。根据您的应用程序,进行以下替换:
-
将
替换为命令的唯一标识符。例如,要锁上房屋的门,您可以指定<command-id>。我们建议您使用 UUID。您也可以使用字母数字字符、“-”和“_”。LockDoor -
(可选)
和<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\ --description<display-name><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>。我们建议您使用 UUID。您也可以使用字母数字字符、“-”和“_”。Light_Power_Status -
(可选)
和<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-idLight_Power_Status\ --description"Turn a light ON or OFF"\ --namespace AWS-IoT \ --payload-template'{"powerStatus":"${aws:iot:commandexecution::parameter:powerStatus}"}'\ --preprocessorawsJsonSubstitution={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-commandAmazon CLI命令来检索有关命令资源的信息。您必须已经使用 CreateCommand API 请求或 create-command CLI 创建了命令。
IAM 策略示例
在使用此 API 操作之前,请确保您的 IAM 策略授权您对设备执行此操作。以下示例显示一个 IAM 策略,允许用户执行 GetCommand 操作。
在此示例中:
-
将
替换成您的 Amazon Web Services 区域,例如regionus-east-1。 -
将
替换成您的 Amazon Web Services 账户 编号,例如account-id。123456789023 -
使用您的Amazon IoT唯一命令标识符,例如command-id或LockDoor。如果您想检索多个命令,可以在 IAM 策略的资源部分指定这些命令。Light_Power_Status
-
{ "Version":"2012-10-17", "Statement": { "Action": "iot:GetCommand", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:command/command-id" } }
检索命令示例 (Amazon CLI)
以下示例说明如何使用检索命令的相关信息get-commandAmazon 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 操作。
在此示例中:
-
将
替换成您的 Amazon Web Services 区域,例如regionus-east-1。 -
将
替换成您的 Amazon Web Services 账户 编号,例如account-id。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
-
要更新现有命令资源,选择您要更新的命令,然后在操作下选择编辑。
-
指定您要使用的显示名称和描述,以及任何作为命令标签的名称-值对。
-
选择编辑以保存具有新设置的命令。
使用UpdateCommand控制平面 API 操作或更新命令资源。update-commandAmazon CLI使用此 API,您可以:
-
编辑您创建的命令的显示名称和描述。
-
弃用命令资源,或恢复已弃用的命令。
IAM 策略示例
在使用此 API 操作之前,请确保您的 IAM 策略授权您对设备执行此操作。以下示例显示一个 IAM 策略,允许用户执行 UpdateCommand 操作。
在此示例中:
-
将
替换成您的 Amazon Web Services 区域,例如regionus-east-1。 -
将
替换成您的 Amazon Web Services 账户 编号,例如account-id。123456789012 -
将
替换成您的 Amazon IoT 唯一命令标识符,例如command-id。如果您想检索多个命令,可以在 IAM 策略的资源部分指定这些命令。LockDoor
-
{ "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
-
选择要删除的命令,然后在操作下选择删除。
-
确认要删除该命令,然后选择删除。
该命令将被标记为待删除,并将在 12 小时后从您的账户中永久移除。
使用 DeleteCommand HTTP 控制平面 API 操作或delete-commandAmazon CLI命令删除命令资源。如果删除操作成功,您将看到 HTTP statusCode 状态码为 204 或 202,并且该命令将在最大超时持续时间 12 小时后自动从您的账户中删除。在状态码为 204 的情况下,表示该命令已被删除。
IAM 策略示例
在使用此 API 操作之前,请确保您的 IAM 策略授权您对设备执行此操作。以下示例显示一个 IAM 策略,允许用户执行 DeleteCommand 操作。
在此示例中:
-
将
替换成您的 Amazon Web Services 区域,例如regionus-east-1。 -
将
替换成您的 Amazon Web Services 账户 编号,例如account-id。123456789012 -
将
替换成您的 Amazon IoT 唯一命令标识符,例如command-id。如果您想检索多个命令,可以在 IAM 策略的资源部分指定这些命令。LockDoor
-
{ "Version":"2012-10-17", "Statement": { "Action": "iot:DeleteCommand", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:command/command-id" } }
删除命令示例 (Amazon CLI)
以下示例说明如何使用该命令删除delete-commandAmazon CLI命令。根据您的应用程序,将 替换为要删除的命令的标识符。<command-id>
aws iot delete-command --command-id<command-id>
如果 API 请求成功,则该命令会生成状态码 202 或 204。您可以使用 GetCommand API 来验证该命令是否已不在您的账户中。