

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

# 车辆和指挥系统
<a name="remote-command-vehicles"></a>

**重要**  
目前对某些 AWS 物联网 FleetWise 功能的访问受到限制。有关更多信息，请参阅 [AWS AWS 物联网中的区域和功能可用性 FleetWise](fleetwise-regions.md)。  
您全权负责以安全且符合适用法律的方式部署命令。

要使用命令功能：

1. 首先，创建一个命令资源。（可选）指定包含执行命令所需信息的参数。

1. 指定将接收命令并执行指定操作的目标车辆。

1. 现在，您可以在目标设备上运行该命令，检查命令执行详细信息以检索状态，并使用 CloudWatch 日志进一步解决任何问题。

以下各节向您展示了车辆和命令之间的工作流程。

**Topics**
+ [工作流程概述](#remote-command-vehicles-overview)
+ [车辆工作流程](#iot-remote-command-devices-workflow)
+ [命令工作流程](#iot-remote-command-commands-workflow)
+ [（可选）命令通知](#remote-command-notifications)

## 工作流程概述
<a name="remote-command-vehicles-overview"></a>

以下步骤概述了车辆和命令之间的命令工作流程。当您使用任何命令 HTTP API 操作时，请求使用 Sigv4 凭证进行签名。

**注意**  
除了 `StartCommandExecution` API 操作之外，所有通过 HTTP 协议执行的操作都使用控制平面端点。

1. 

**建立 MQTT 连接并订阅命令主题**

   要为命令工作流程做准备，设备必须与`iot:Data-ATS`终端节点建立 MQTT 连接，并订阅上述命令请求主题。或者，您的设备也可以订阅已接受和拒绝的命令响应主题。

1. 

**创建车辆模型和命令资源**

   现在，您可以使用和`CreateCommand`控制平面 API 操作创建载具`CreateVehicle`和命令资源。命令资源包含在车辆上执行命令时要应用的配置。

1. 

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

   使用带有账户特定`iot:Jobs`端点`StartCommandExecution`的数据平面 API 在车辆上开始执行命令。API 会向命令请求主题发布一条 protobuf 编码的有效负载消息。

1. 

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

   车辆处理收到的命令和有效载荷，然后使用 `UpdateCommandExecution` API 将命令执行结果发布到响应主题。如果您的车辆订阅了命令已接受和拒绝的响应主题，它将收到一条消息，指示云服务接受还是拒绝了响应。

1. 

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

   要检索命令执行的结果，您可以使用`GetCommandExecution`控制平面 API 操作。在您的车辆向响应主题发布命令执行结果后，此 API 将返回更新的信息。

1. 

**（可选）订阅和管理命令事件**

   要接收命令执行状态更新的通知，您可以订阅命令事件主题。然后，您可以使用`CreateTopicRule`控制平面 API 将命令事件数据路由到其他应用程序，例如 AWS Lambda 函数或 Amazon SQS，并在此基础上构建应用程序。

## 车辆工作流程
<a name="iot-remote-command-devices-workflow"></a>

以下步骤详细描述了使用命令功能时的车辆工作流程。

**注意**  
本节中描述的操作使用 MQTT 协议。

1. 

**建立 MQTT 连接**

   要让您的车辆做好使用命令功能的准备，它必须先连接到 AWS IoT Core 消息代理。必须允许您的车辆执行`iot:Connect`操作才能连接到消息代理 AWS IoT Core 并与消息代理建立 MQTT 连接。要查找您的数据平面终端节点 AWS 账户，请使用 `DescribeEndpoint` API 或 `describe-endpoint` CLI 命令，如下所示。

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

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

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

1. 

**订阅命令请求主题**

   建立连接后，您的设备即可订阅 AWS IoT 命令 MQTT 请求主题。当您创建命令并在目标设备上开始执行命令时，消息代理将向请求主题发布一条 protobuf 编码的有效载荷消息。然后，您的设备可以接收有效载荷消息并处理命令。在此示例中，*`<DeviceID>`*替换为目标车辆的唯一标识符。此 ID 可以是您车辆的唯一标识符或事物名称
**注意**  
发送到设备的有效载荷消息必须使用 protobuf 格式。

   ```
   $aws/commands/things/<DeviceID>/executions/+/request/protobuf
   ```

1. 

**（可选）订阅命令响应主题**

   或者，您可以订阅这些命令响应主题，以接收一条消息，指示云服务是接受还是拒绝了来自设备的响应。
**注意**  
您的车辆可以选择订阅`/accepted`和`/rejected`回复主题。即使您的车辆没有明确订阅这些主题，它们也会自动收到这些回复消息。

   ```
   $aws/commands/things/<DeviceID>/executions/<ExecutionId>/response/protobuf/accepted
   $aws/commands/things/<DeviceID>/executions/<ExecutionId>/response/protobuf/rejected
   ```

1. 

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

   然后，目标车辆会处理该命令。然后，它使用 `UpdateCommandExecution` API 将执行结果发布到以下 MQTT 响应主题。
**注意**  
对于给定的车辆和命令执行，*<DeviceID>*必须与设备订阅的请求主题中的相应字段相匹配。

   ```
   $aws/commands/things/<DeviceID>/executions/<ExecutionId>/response/protobuf
   ```

   该 `UpdateCommandExecution` API 是基于 MQTT 的数据平面 API 操作，已通过 TLS 进行身份验证。
   + 如果云服务成功处理了命令执行结果，则会向 MQTT 接受的主题发布一条消息。接受的主题使用以下格式。

     ```
     $aws/commands/things/<DeviceID>/executions/<ExecutionId>/response/protobuf/accepted
     ```
   + 如果云服务未能处理命令执行结果，则会向 MQTT 被拒绝的主题发布响应。被拒绝的主题使用以下格式。

     ```
     $aws/commands/things/<DeviceID>/executions/<ExecutionId>/response/protobuf/rejected
     ```

   有关此 API 的更多信息和示例，请参阅[更新命令执行结果](send-monitor-remote-command-cli.md#update-remote-command-execution-cli)。

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

以下步骤详细描述了命令的工作流程。

**注意**  
本节中描述的操作使用 HTTP 协议。

1. 

**注册您的车辆**

   现在，您已经准备好使用命令功能的车辆，您可以通过注册车辆然后创建将发送给车辆的命令来准备应用程序。要注册车辆，请使用[https://docs.aws.amazon.com/iot-fleetwise/latest/APIReference/API_CreateVehicle.html](https://docs.aws.amazon.com/iot-fleetwise/latest/APIReference/API_CreateVehicle.html)控制平面 API 操作创建车辆模型（模型清单）的实例。有关更多信息和示例，请参阅[创建车辆](https://docs.aws.amazon.com/iot-fleetwise/latest/developerguide/create-vehicle.html)。

1. 

**创建命令**

   使用 [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCommand.html](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCommand.html)HTTP 控制平面 API 操作对适用于您目标车辆的命令进行建模。指定执行命令时要使用的任何参数和默认值，并确保它使用`AWS-IoT-FleetWise`命名空间。有关使用此 API 的更多信息和示例，请参阅[创建命令资源](create-manage-remote-command-cli.md#create-remote-command-cli)。

1. 

**开始执行命令**

   现在，您可以使用[https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_StartCommandExecution.html](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_StartCommandExecution.html)数据平面 API 操作在车辆上执行您创建的命令。 AWS IoT Device Management 获取命令和命令参数，并验证传入的请求。然后，它使用所需参数调 AWS IoT FleetWise 用 API 来生成车辆特定的有效载荷。然后， AWS IoT Device Management 通过 MQTT 将有效负载发送到您的设备订阅的命令请求主题。有关使用此 API 的更多信息和示例，请参阅[发送命令 (AWS CLI)](send-monitor-remote-command-cli.md#send-remote-command-cli)。

   ```
   $aws/commands/things/<DeviceID>/executions/+/request/protobuf
   ```
**注意**  
如果从云端发送命令时设备处于离线状态，并且正在使用 MQTT 持久会话，则该命令将在消息代理处等待。如果设备在超时持续时间之前恢复联机，并且已订阅命令请求主题，则设备可以处理命令并将结果发布到响应主题。如果设备在超时持续时间之前没有恢复联机，则命令执行将超时，有效载荷消息将过期。

1. 

**检索命令执行情况**

   在设备上执行命令后，使用[https://docs.aws.amazon.com/iot/latest/apireference/API_GetCommandExecution.html](https://docs.aws.amazon.com/iot/latest/apireference/API_GetCommandExecution.html)控制平面 API 操作来检索和监控命令执行的结果。您还可以使用 API 获取有关执行数据的其他信息，例如上次更新时间、执行完成时间以及指定的参数。
**注意**  
要检索最新的状态信息，设备必须已将命令执行结果发布到响应主题。

   有关使用此 API 的更多信息和示例，请参阅[获取命令执行](send-monitor-remote-command-cli.md#get-remote-command-execution-cli)。

## （可选）命令通知
<a name="remote-command-notifications"></a>

您可以订阅命令事件，以便在命令执行状态更改时接收通知。以下步骤显示如何订阅命令事件，然后处理它们。

1. 

**创建主题规则**

   您可以订阅命令事件主题，并在命令执行状态更改时接收通知。您还可以创建主题规则，将车辆处理的数据路由到其他应用程序，例如 AWS Lambda 函数。您可以使用控制台或 AWS IoT [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateTopicRule.html) AWS IoT Core 控制平面 API 操作创建主题规则。有关更多信息，请参阅[创建和 AWS IoT 规则](https://docs.aws.amazon.com/iot/latest/developerguide/iot-create-rule.html)。

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

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

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

1. 

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

   如果您在上一步中创建了订阅命令事件的主题规则，则可以管理收到的命令推送通知。您也可以选择使用您创建的主题规则在其上构建应用程序，例如使用 Amazon SQS、Amazon SNS 或 St AWS ep Functions。 AWS Lambda

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

```
{
    "executionId": "2bd65c51-4cfd-49e4-9310-d5cbfdbc8554",
    "status":"FAILED",
    "statusReason": {
         "reasonCode": "4",
         "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
}
```