

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 車輛和命令
<a name="remote-command-vehicles"></a>

**重要**  
某些 AWS IoT FleetWise 功能的存取目前受到鎖定。如需詳細資訊，請參閱[AWS AWS IoT 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. 

**在目標裝置上啟動命令執行**

   使用`StartCommandExecution`資料平面 API 搭配您的帳戶特定`iot:Jobs`端點，在車輛上啟動命令執行。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. 

**命令請求主題的 Susbcribe**

   建立連線之後，您的裝置就可以訂閱 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 是透過 TLS 驗證的 MQTT 進行的資料平面 API 操作。
   + 如果雲端服務成功處理命令執行結果，則會將訊息發佈至 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. 

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

   如果您在上一個步驟中建立了主題規則來訂閱命令事件，則可以管理您收到的命令推播通知。您也可以選擇性地在其上建置應用程式，例如使用您建立的主題規則搭配 AWS Lambda、Amazon SQS、Amazon SNS 或 AWS Step Functions。

下列程式碼顯示您將收到的命令事件通知的範例承載。

```
{
    "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
}
```