

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

# 高階命令工作流程
<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_tw/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. 

**建立命令資源**

   從 Command [Hub 或使用 API 建立命令](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)

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 或 CLI `describe-endpoint` 命令尋找您的資料平面端點：

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

   執行此命令會傳回帳戶特定的資料平面端點，如下所示。

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

1. 

**訂閱命令主題**

   訂閱 命令請求主題。當您啟動執行時，訊息中介裝置會將承載發佈至此主題。您的裝置會接收並處理 命令。

   （選用） 訂閱回應主題 (`accepted` 或 `rejected`) 以接收雲端服務是否接受或拒絕裝置回應的確認。

   在此範例中，取代：
   + *`<device>`* ，`thing`或`client`取決於您要鎖定的裝置是否已註冊為 IoT 物件，或指定為 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. 

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

   從 [Command Hub](https://console.aws.amazon.com/iot/home#/commandHub) 或使用 `StartCommandExecution` API 搭配您帳戶特定的端點來啟動執行。`iot:Data-ATS` 用於雙堆疊 (IPv4/IPv6) 或僅用於 `iot:Jobs` IPv4。

   API 會將承載發佈至 命令請求主題。
**注意**  
如果裝置離線並使用 MQTT 持久性工作階段，則 Command 會等待訊息中介裝置。當裝置在逾時前重新連線時，可以處理 命令並發佈結果。如果逾時過期，則執行會逾時，並將捨棄承載。

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`。裝置必須將結果發佈至 Commands 回應主題，以取得最新資訊。檢視其他詳細資訊，包括上次更新時間、結果和完成時間。

## （選用） 啟用命令事件的通知
<a name="iot-remote-command-commands-notifications"></a>

訂閱 命令事件，以在執行狀態變更時收到通知。如需命令執行事件的詳細資訊，包括事件訊息格式和承載屬性，請參閱 [命令執行事件](command-events.md)。

1. 

**建立主題規則**

   訂閱 Commands 事件主題以取得狀態變更通知。使用 AWS IoT 主控台或 建立主題規則，將裝置資料路由到其他服務 AWS Lambda， AWS IoT 例如 Amazon SQS 和 AWS Step Functions[建立 AWS IoT 規則](iot-create-rule.md)。

   在此範例中，將 `<CommandID>`取代為您要接收通知之命令的識別符，並將 `<CommandExecutionStatus>`取代為命令執行的狀態。

   ```
   $aws/events/commandExecution/<CommandID>/<CommandExecutionStatus>
   ```
**注意**  
若要接收所有命令和命令執行狀態的通知，您可以使用萬用字元並訂閱下列主題。

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

1. 

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

   管理命令推送通知，並使用訂閱的事件建置應用程式。

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

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