

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

# 高级命令工作流程
<a name="iot-remote-command-workflow"></a>

此工作流程显示设备如何与 AWS IoT Device Management 命令交互。所有 HTTP API 请求都使用 [Sigv4 凭据](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)进行签名。

![\[AWS IoT Device Management 设备命令高级工作流程概述。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/device-command-workflow.png)


**Topics**
+ [创建和管理命令](#command-create-command)
+ [为您的命令选择目标设备并订阅 MQTT 主题](#command-choose-target)
+ [为目标设备启动和监控命令执行](#command-command-executions)
+ [（可选）启用命令事件通知](#iot-remote-command-commands-notifications)

## 创建和管理命令
<a name="command-create-command"></a>

要为您的设备创建和管理命令，请执行以下步骤。

1. 

**创建命令资源**

   从[命令中心](https://console.aws.amazon.com/iot/home#/commandHub)或使用 [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCommand.html](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCommand.html)API 创建命令。

1. 

**指定有效载荷**

   提供任何格式的有效载荷。指定内容类型以确保设备解释正确。

   对于带有有效载荷模板的动态命令，将在运行时使用您提供的参数生成最终有效负载。模板仅支持 JSON 格式，但生成的负载可以作为 JSON 或 CBOR 发送。

1. 

**（可选）管理已创建的命令**

   创建后更新显示名称和描述。不再需要时将命令标记为已弃用，或者将其永久删除。要修改负载信息，请创建新命令。

## 为您的命令选择目标设备并订阅 MQTT 主题
<a name="command-choose-target"></a>

选择您的目标设备并配置 MQTT 主题以接收命令和发布响应。

1. 

**为您的命令选择目标设备**

   选择要接收和执行命令的目标设备。对于已注册的设备，使用事物名称，对未注册的设备使用客户端 ID。有关更多信息，请参阅 [目标设备注意事项](iot-remote-command-execution-start-monitor.md#iot-command-execution-target)。

1. 

**配置 AWS IoT 设备策略**

   配置 IAM 策略，授予接收执行和发布更新的权限。[IAM 策略示例](iot-remote-command-execution-start-monitor.md#iot-remote-command-execution-update-policy)有关策略示例，请参阅。

1. 

**建立 MQTT 连接**

   将设备连接到消息代理并订阅请求和响应主题。设备需要`iot:Connect`许可。使用 `DescribeEndpoint` API 或 `describe-endpoint` CLI 命令查找您的数据平面终端节点：

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

   运行此命令将返回账户特定的数据面板端点，如下所示。

   ```
   account-specific-prefix.iot.region.amazonaws.com
   ```

1. 

**订阅命令主题**

   订阅命令请求主题。当您开始执行时，消息代理会将有效负载发布到此主题。您的设备接收并处理该命令。

   （可选）订阅响应主题（`accepted`或`rejected`），以接收云服务接受还是拒绝设备响应的确认信息。

   在此示例中：
   + *`<device>`* 与 `thing` 或 `client`，具体取决于您目标设备是已注册为物联网事物，还是指定为 MQTT 客户端。
   + *`<DeviceID>`* 与您目标设备的唯一标识符。此 ID 可以是唯一的 MQTT 客户端 ID 或事物名称。
**注意**  
如果有效负载类型不是 JSON 或 CBOR，则命令请求主题中可能不存在该*<PayloadFormat>*字段。要获取有效负载格式，我们建议您使用 MQTT5 从 MQTT 消息标头中获取格式信息。有关更多信息，请参阅 [命令主题](reserved-topics.md#reserved-topics-commands)。

   ```
   $aws/commands/<devices>/<DeviceID>/executions/+/request/<PayloadFormat>
   $aws/commands/<devices>/<DeviceID>/executions/+/response/accepted/<PayloadFormat>
   $aws/commands/<devices>/<DeviceID>/executions/+/response/rejected/<PayloadFormat>
   ```

## 为目标设备启动和监控命令执行
<a name="command-command-executions"></a>

创建命令并指定命令的目标后，您可以通过执行以下步骤在目标设备上开始执行。

1. 

**在目标设备上启动命令执行**

   从 C [ommand Hub](https://console.aws.amazon.com/iot/home#/commandHub) 开始执行，或者将 `StartCommandExecution` API 与您的账户专用端点一起使用。`iot:Data-ATS`用于双堆栈 (IPv4/IPv6) 或 IPv4 仅`iot:Jobs`用于双堆栈。

   API 将负载发布到命令请求主题。
**注意**  
如果设备处于离线状态并使用 MQTT 持久会话，则命令将在消息代理处等待。当设备在超时之前重新连接时，它可以处理命令并发布结果。如果超时到期，则执行超时，有效负载将被丢弃。

1. 

**更新命令执行的结果**

   设备接收负载，处理命令，执行指定操作，并使用基于 `UpdateCommandExecution` MQTT 的 API 将结果发布到命令响应主题。如果订阅了已接受和已拒绝的主题，则设备会收到云服务接受还是拒绝响应的确认信息。

   根据您在请求主题中指定的内容，*<devices>*可以是事物或客户端，*<DeviceID>*可以是您的 AWS IoT 事物名称或 MQTT 客户端 ID。
**注意**  
在命令响应主题中，*<PayloadFormat>*只能是 JSON 或 CBOR。

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

1. 

**（可选）检索命令执行结果**

   从 AWS IoT 控制台或使用检索执行结果`GetCommandExecution`。设备必须将结果发布到命令响应主题以获取最新信息。查看其他详细信息，包括上次更新时间、结果和完成时间。

## （可选）启用命令事件通知
<a name="iot-remote-command-commands-notifications"></a>

订阅 Commands 事件，以便在执行状态发生变化时收到通知。有关命令执行事件的详细信息，包括事件消息格式和负载属性，请参阅[命令执行事件](command-events.md)。

1. 

**创建主题规则**

   订阅命令事件主题以获取状态变更通知。使用控制台或创建主题规则，将设备数据路由到其他 AWS IoT 服务 AWS Lambda，例如 Amazon SQS 和 AWS Step Functi AWS IoT ons。[创建 AWS IoT 规则](iot-create-rule.md)

   在此示例中，将 `<CommandID>` 替换为您要接收通知的命令的标识符，并将 `<CommandExecutionStatus>` 替换为命令执行的状态。

   ```
   $aws/events/commandExecution/<CommandID>/<CommandExecutionStatus>
   ```
**注意**  
要接收所有命令和命令执行状态的通知，您可以使用通配符并订阅以下主题。

   ```
   $aws/events/commandExecution/+/#
   ```

1. 

**接收和处理命令事件**

   Manage Commands 使用订阅的事件推送通知和构建应用程序。

以下代码显示了您将收到的命令事件通知的示例有效载荷。

```
{
    "executionId": "2bd65c51-4cfd-49e4-9310-d5cbfdbc8554",
    "status":"FAILED",
    "statusReason": {
         "reasonCode": "DEVICE_TOO_BUSY",
         "reasonDescription": ""
    },
    "eventType": "COMMAND_EXECUTION",
    "commandArn":"arn:aws:iot:us-east-1:123456789012:command/0b9d9ddf-e873-43a9-8e2c-9fe004a90086",
    "targetArn":"arn:aws:iot:us-east-1:123456789012:thing/5006c3fc-de96-4def-8427-7eee36c6f2bd",
    "timestamp":1717708862107
}
```