

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

# Device Advisor
<a name="device-advisor"></a>

[Device Advisor](https://aws.amazon.com/iot-core/features/) 是一種以雲端為基礎的全受管測試功能，可在裝置軟體開發期間驗證 IoT 裝置。Device Advisor 提供預先建置的測試，可讓您在將裝置部署至生產環境之前 AWS IoT Core，用來驗證 IoT 裝置是否有可靠且安全的連線能力。Device Advisor 的預先建置測試可協助您針對最佳實務驗證您的裝置軟體，是否可以使用 [TLS](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html)、[MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html)、[Device Shadow](https://docs.aws.amazon.com//iot/latest/developerguide/iot-device-shadows.html)，以及 [IoT 任務](https://docs.aws.amazon.com//iot/latest/developerguide/iot-jobs.html)。您也可以下載已簽署的資格報告，提交給 AWS 合作夥伴網路，讓您的裝置符合 [AWS Partner Device Catalog](https://devices.amazonaws.com/) 的資格，無需將裝置送入其中並等待裝置進行測試。

**注意**  
us-east-1、us-west-2、ap-northeast-1 和 eu-west-1 區域中支援 Device Advisor。  
Device Advisor 支援使用 MQTT 和透過 WebSocket Secure (WSS) 的 MQTT 通訊協定發佈和訂閱訊息的裝置和用戶端。所有通訊協定皆支援 IPv4 和 IPv6。  
Device Advisor 支援 RSA 伺服器憑證。

任何已建置為連接到 的裝置 AWS IoT Core 都可以利用 Device Advisor。您可以從 [AWS IoT 主控台](https://us-east-1.console.aws.amazon.com/iot/home?region=us-east-1#/deviceadvisor/intro)或使用 AWS CLI 或 SDK 存取 Device Advisor。當您準備好測試裝置時，請向 註冊裝置， AWS IoT Core 並使用 Device Advisor 端點設定裝置軟體。然後選擇預先建置的測試、設定它們、在您裝置上執行這些測試，並取得測試結果以及詳細的日誌或資格報告。

Device Advisor 是 AWS 雲端中的測試端點。您可以測試裝置，方法為將它們設定為連接至 Device Advisor 提供的測試端點。將裝置設定為連線至測試端點後，您可以造訪 Device Advisor 的主控台，或使用 AWS SDK 選擇您想要在裝置上執行的測試。Device Advisor 接著會管理測試的完整生命週期，包括佈建資源、排程測試程序、管理狀態機器、記錄裝置行為、記錄結果，以及以測試報告的形式提供最終結果。

**TLS 通訊協定**

Transport Layer Security (TLS) 通訊協定用來加密通過不安全網路 (例如網際網路) 的機密資料。TLS 通訊協定的前身是 Secure Sockets Layer (SSL) 通訊協定。

Device Advisor 支援下列 TLS 通訊協定：
+ TLS 1.3 (建議)
+ TLS 1.2

**通訊協定、連接埠映射和身分驗證**

裝置通訊協定是由裝置或用戶端用來使用裝置端點連線至訊息代理程式。下表列出 Device Advisor 端點支援的通訊協定，以及它們使用的身分驗證方法和連接埠。


**通訊協定、身分驗證和連接埠對應**  

| 通訊協定 | 支援的操作 | 身分驗證 | 站點 | ALPN 通訊協定名稱 | 
| --- | --- | --- | --- | --- | 
| MQTT over WebSocket | 發佈、訂閱 | Signature 第 4 版 | 443 | N/A | 
| MQTT | 發佈、訂閱 | X.509 用戶端憑證 | 8883 | `x-amzn-mqtt-ca` | 
| MQTT | 發佈、訂閱 | X.509 用戶端憑證 | 443 | N/A | 

**Topics**
+ [設定](device-advisor-setting-up.md)
+ [在主控台中開始使用 Device Advisor](da-console-guide.md)
+ [Device Advisor 工作流程](device-advisor-workflow.md)
+ [Device Advisor 詳細主控台工作流程](device-advisor-console-tutorial.md)
+ [長時間測試主控台工作流程](device-advisor-long-duration-console-tutorial.md)
+ [Device Advisor VPC 端點 (AWS PrivateLink)](device-advisor-vpc-endpoint.md)
+ [Device Advisor 測試案例](device-advisor-tests.md)

# 設定
<a name="device-advisor-setting-up"></a>

第一次使用 Device Advisor 之前，請先完成以下任務：

## 建立 IoT 物件
<a name="da-create-thing-certificate"></a>

首先，建立 IoT 物件並將憑證連接至該物件。如需如何建立物件的教學課程，請參閱[建立物件](https://docs.aws.amazon.com/iot/latest/developerguide/create-iot-resources.html#create-aws-thing)。

## 建立要用作裝置角色的 IAM 角色
<a name="da-iam-role"></a>

**注意**  
您可以使用 Device Advisor 主控台快速建立裝置角色。若要了解如何使用 Device Advisor 主控台設定裝置角色，請參閱[在主控台中開始使用 Device Advisor](https://docs.aws.amazon.com/iot/latest/developerguide/da-console-guide.html)。

1. 前往 [AWS Identity and Access Management 主控台](https://console.aws.amazon.com/iam/home?region=us-west-2#/home)，並登入 AWS 帳戶 您用於 Device Advisor 測試的 。

1. 在左側導覽窗格上，選擇 **Policies** (政策)。

1. 選擇 **Create policy (建立政策)**。

1. 在 **Create policy** (建立政策) 下，執行下列操作：

   1. 針對 **Service** (服務)，選擇 **IoT**。

   1. 在**動作**下，執行下列其中一個動作：
      + (建議) 根據連接至您在上一節中建立之 IoT 物件或憑證的政策選取動作。
      + 在**篩選動作**方塊中搜尋下列動作，並選取它們：
        + `Connect`
        + `Publish`
        + `Subscribe`
        + `Receive`
        + `RetainPublish`

   1. 在**資源**下，限制用戶端、主題和主題資源。限制這些資源是安全最佳實務。若要限制資源，請執行下列動作：

      1. 選擇 **Specify client resource ARN for the Connect action** (指定 Connect 動作的用戶端資源 ARN)。

      1. 選擇**新增 ARN**，然後執行下列任一動作：
**注意**  
此 *clientId* 是您裝置用來與 Device Advisor 互動的 MQTT 用戶端 ID。
         + 在視覺化 ARN 編輯器中指定**區域**、**accountID** 和 **clientID**。
         + 手動輸入您想要透過其執行測試案例之 IoT 主題的 Amazon Resource Name (ARN)。

      1. 選擇**新增**。

      1. 選擇**指定 Receive 動作和另外 1 個動作的主題資源 ARN**。

      1. 選擇**新增 ARN**，然後執行下列任一動作：
**注意**  
*主題名稱*是您裝置將訊息發佈至其中的 MQTT 主題。
         + 在視覺化 ARN 編輯器中指定**區域**、**accountID** 和**主題名稱**。
         + 手動輸入您想要透過其執行測試案例之 IoT 主題的 ARN。

      1. 選擇 **Add (新增)**。

      1. 選擇**指定 Subscribe 動作的 topicFilter 資源 ARN**。

      1. 選擇**新增 ARN**，然後執行下列任一動作：
**注意**  
*主題名稱*是您裝置訂閱的 MQTT 主題。
         + 在視覺化 ARN 編輯器中指定**區域**、**accountID** 和**主題名稱**。
         + 手動輸入您想要透過其執行測試案例之 IoT 主題的 ARN。

      1. 選擇**新增**。

1. 選擇下**一步：標籤**。

1. 選擇下**一步：檢閱**。

1. 在**檢閱政策**下，針對您的政策輸入一個**名稱**。

1. 選擇**建立政策**。

1. 在左側導覽窗格上，選擇 **Roles** (角色)。

1. 選擇**建立角色**。

1. 在**選取信任的實體**下，選擇**自訂信任政策**。

1. 在**自訂信任政策**方塊中輸入下列信任政策。建議您新增全域條件內容金鑰 `[aws:SourceArn](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)` 和 `[aws:SourceAccount](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)` 至政策，保護自己免受混淆代理人問題的困擾。
**重要**  
您的 `aws:SourceArn` 必須與 `format: arn:aws:iotdeviceadvisor:region:account-id:*.` 相符。請確認 `region` 與您的  AWS IoT  區域符合，且 `account-id` 與您的客戶帳戶 ID 相符。如需詳細資訊，請參閱[預防跨服務混淆代理人](https://docs.aws.amazon.com/iot/latest/developerguide/security-best-practices.html#cross-service-confused-deputy-prevention-DA)。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowAwsIoTCoreDeviceAdvisor",
               "Effect": "Allow",
               "Principal": {
                   "Service": "iotdeviceadvisor.amazonaws.com"
           },
               "Action": "sts:AssumeRole",
               "Condition": {
                   "StringEquals": {
                       "aws:SourceAccount": "123456789012"
               },
                   "ArnLike": {
                       "aws:SourceArn": "arn:aws:iotdeviceadvisor:*:123456789012:suitedefinition/*"
               }
           }
           }
       ]
   }
   ```

1. 選擇**下一步**。

1. 選擇您在步驟 4 所建立的政策。

1. (選用) 在**設定許可界限**下，選擇**使用許可界限來控制角色許可上限**，然後選取您已建立的政策。

1. 選擇**下一步**。

1. 輸入 **Role name** (角色名稱) 和 **Role description** (角色描述)。

1. 選擇 **Create Role** (建立角色)。

## 為要使用 Device Advisor 的 IAM 使用者建立自訂受管政策
<a name="da-managed-policy"></a>

1. 導覽至 IAM 主控台，網址為 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。若出現提示，請輸入 AWS 憑證以進行登入。

1. 在左側導覽窗格中選擇 **Policies** (政策)。

1. 選擇 **Create Policy** (建立政策)，然後選擇 **JSON** 標籤。

1. 新增必要的許可以使用 Device Advisor。政策文件可在[安全最佳實務](https://docs.aws.amazon.com/iot/latest/developerguide/security-best-practices.html#device-advisor-perms)主題中找到。

1. 選擇**檢閱政策**。

1. 輸入 **Name (名稱)** 和 **Description (描述)**。

1. 選擇 **Create Policy** (建立政策)。

## 建立要使用 Device Advisor 的 IAM 使用者
<a name="da-iam-user"></a>

**注意**  
我們建議您建立要在執行 Device Advisor 測試時使用的 IAM 使用者。從管理員使用者執行 Device Advisor 測試可能會造成安全風險，因此不建議此操作。

1. 導覽至位於 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台；若出現提示，請輸入 AWS 憑證以進行登入。

1. 在左側導覽窗格中，選擇 **Users** (使用者)。

1. 選擇 **Add User** (新增使用者)。

1. 輸入 **User name** (使用者名稱)。

1. 如果使用者想要與 AWS 外部互動，則需要程式設計存取 AWS 管理主控台。授予程式設計存取權的方式取決於正在存取的使用者類型 AWS。

   若要授予使用者程式設計存取權，請選擇下列其中一個選項。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/device-advisor-setting-up.html)

1. 選擇**下一步：許可**。

1. 若要提供存取權，請新增權限至您的使用者、群組或角色：
   + 中的使用者和群組 AWS IAM Identity Center：

     建立權限合集。請按照《*AWS IAM Identity Center 使用者指南*》中的[建立權限合集](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)說明進行操作。
   + 透過身分提供者在 IAM 中管理的使用者：

     建立聯合身分的角色。遵循《*IAM 使用者指南*》的[為第三方身分提供者 (聯合) 建立角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)中的指示。
   + IAM 使用者：
     + 建立您的使用者可擔任的角色。請按照《*IAM 使用者指南*》的[為 IAM 使用者建立角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)中的指示。
     + (不建議) 將政策直接附加至使用者，或將使用者新增至使用者群組。請遵循《*IAM 使用者指南*》的[新增許可到使用者 (主控台)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console) 中的指示。

1. 在搜尋方塊中，輸入您已建立之客戶管理政策的名稱。然後，選取**政策名稱**的核取方塊。

1. 選擇下**一步：標籤**。

1. 選擇 **Next:Review (下一步：檢閱)**。

1. 選擇 **Create user** (建立使用者)。

1. 選擇**關閉**。

Device Advisor 需要代表您存取您的 AWS 資源 （物件、憑證和端點）。您的 IAM 使用者必須擁有必要的許可。如果您將必要的許可政策連接到 IAM 使用者，Device Advisor 也會將記錄發佈到 Amazon CloudWatch。

## 設定您的裝置
<a name="da-configure-device"></a>

Device Advisor 會使用伺服器名稱指示 (SNI) TLS 延伸來套用 TLS 組態。在裝置連線並傳遞與 Device Advisor 測試端點相同的伺服器名稱時，它們必須使用此延伸。

當測試處於 `Running` 狀態時，Device Advisor 允許 TLS 連線。它會在每次測試執行的前後拒絕 TLS 連線。基於這個原因，我們建議您使用裝置連線重試機制，以取得 Device Advisor 的全自動化測試體驗。您可以執行測試套件，其中包含多個測試案例，例如 TLS 連線、MQTT 連線和 MQTT 發佈。如果您執行多個測試案例，我們建議您的裝置每五秒嘗試連線到我們的測試端點。然後，您可以使多個測試案例依序自動執行。

**注意**  
若要準備好您的裝置軟體進行測試，我們建議您使用可以連線至 AWS IoT Core的 SDK。然後，您應該使用為 AWS 帳戶提供的 Device Advisor 測試端點來更新 SDK。

Device Advisor 支援兩種類型的端點：帳戶層級和裝置層級端點。選擇最適合您使用案例的端點。若要針對不同裝置同時執行多個測試套件，請使用裝置層級端點。

請執行下列命令來取得裝置層級端點：

若為使用 X.509 用戶端憑證的 MQTT 客戶：

```
aws iotdeviceadvisor get-endpoint --thing-arn your-thing-arn
```

或

```
aws iotdeviceadvisor get-endpoint --certificate-arn your-certificate-arn
```

若為使用簽章第 4 版的 MQTT over WebSocket 客戶：

```
aws iotdeviceadvisor get-endpoint --device-role-arn your-device-role-arn --authentication-method SignatureVersion4
```

若要一次執行一個測試套件，請選擇 Account-level endpoint (帳戶層級端點)。請執行下列命令來取得帳戶層級端點：

```
aws iotdeviceadvisor get-endpoint
```

# 在主控台中開始使用 Device Advisor
<a name="da-console-guide"></a>

本教學課程可協助您在 主控台 AWS IoT Core Device Advisor 上開始使用 。Device Advisor 提供必要測試和已簽署的資格報告等功能。您可以使用這些測試和報告，來限定並列出 [AWS Partner Device Catalog](https://devices.amazonaws.com/) 中的裝置，如 [AWS IoT Core 資格計畫](https://aws.amazon.com/partners/dqp/)所詳述。

如需使用 Device Advisor 的詳細資訊，請參閱 [Device Advisor 工作流程](device-advisor-workflow.md) 和 [Device Advisor 詳細主控台工作流程](device-advisor-console-tutorial.md)。

若要完成此教學課程，請遵循 [設定](device-advisor-setting-up.md) 中概述的步驟。

**注意**  
下列支援 Device Advisor AWS 區域：  
美國東部 (維吉尼亞北部)
美國西部 (奧勒岡)
亞太地區 (東京)
歐洲 (愛爾蘭)

**開始使用**

1. 在 [AWS IoT 主控台](https://console.aws.amazon.com//iot)導覽窗格的**測試**下，選擇 **Device Advisor**。然後，選擇主控台上的**開始演練**按鈕。  
![\[Device Advisor 是 IoT 裝置的完整受管測試功能，可驗證與 的安全互動 AWS IoT Core、識別軟體問題，以及取得測試結果。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-gs.png)

1. **開始使用 Device Advisor** 頁面概述建立測試套件和針對您裝置執行測試所需的步驟。您也可以在這裡針對您的帳戶尋找 Device Advisor 測試端點。您必須在用於測試的裝置上設定韌體或軟體，才能連線到此測試端點。

   若要完成本教學課程，請先[建立物件和憑證](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-setting-up.html#da-create-thing-certificate)。在您檢閱**運作方式**下的資訊之後，請選擇**下一步**。  
![\[測試 IoT 裝置連線的步驟：選取通訊協定、建立測試套件、設定裝置設定。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-gs1.png)

1.  在**步驟 1：選取通訊協定**中，從列出的選項中選取通訊協定。然後選擇**下一步**。  
![\[Device Advisor 介面顯示選擇通訊協定的選項 (MQTT 3.1.1、透過 WebSocket 的 MQTT 3.1.1、MQTT 5、透過 WebSocket 的 MQTT 5)，用於測試 IoT 裝置。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-protocol.png)

1. 在 **Step 2** (步驟 2) 中，您可以建立和設定自訂測試套件。一個自訂測試套件必須至少具有一個測試群組，而且每個測試群組必須至少具有一個測試案例。我們已新增 **MQTT Connect** 測試案例，供您開始使用。

   選擇 **Test suite properties** (測試套件屬性)。  
![\[Device Advisors 中的「建立測試套件」畫面，使用者可以在其中建立和設定測試群組和案例，以使用 MQTT 通訊協定測試 IoT 裝置。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-test-suite-create.png)

   當您建立測試套件時，請提供測試套件屬性。您可以設定以下套件層級屬性：
   + **Test suite name** (測試套件名稱)：輸入測試套件名稱。
   + **逾時** (選用)：目前測試套件中每個測試案例的逾時 (以秒為單位)。如果您未指定逾時值，則系統會使用預設值。
   + **Tags** (標籤) (選用)：將標籤新增至測試套件。

   完成後，請選擇 **Update properties** (更新屬性)。  
![\[更新測試套件屬性的表單，包括名稱、逾時和新增標籤的能力。包含「更新屬性」按鈕。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-test-suite-properties.png)

1. (選用) 若要更新測試套件群組組態，請選擇測試群組名稱旁邊的**編輯**按鈕。
   + **Name** (名稱)：輸入測試套件群組的自訂名稱。
   + **逾時** (選用)：目前測試套件中每個測試案例的逾時 (以秒為單位)。如果您未指定逾時值，則系統會使用預設值。

   完成時，請選擇**完成**以繼續。  
![\[會顯示名為「測試群組 1」的測試群組，其中包含設定逾時和新增更多測試群組的選項。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-test-suite-config.png)

1. (選用) 若要更新測試案例的測試案例組態，請選擇測試案例名稱旁邊的**編輯**按鈕。
   + **Name** (名稱)：輸入測試套件群組的自訂名稱。
   + **逾時** (選用)：所選測試案例的逾時 (以秒為單位)。如果您未指定逾時值，則系統會使用預設值。

   完成時，請選擇**完成**以繼續。  
![\[「建立測試套件」界面，顯示設定測試套件、測試群組和個別測試案例以測試 IoT 裝置的選項。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-test-case-config.png)

1. (選用) 若要將更多測試群組新增至測試套件，請選擇**新增測試群組**，然後遵循步驟 5 中的指示。

1. (選用) 若要新增更多測試案例，請將**測試案例**區段中的測試案例拖曳至到您的任何測試群組。  
![\[「建立測試套件」界面，使用者可以在其中設定測試群組和測試案例，以測試 IoT 裝置的 MQTT 通訊協定。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-drag.png)

1. 您可以變更測試群組和測試案例的順序。若要進行變更，請在清單中將列出的測試案例向上或向下拖曳。Device Advisor 會依照您列出測試的順序執行這些測試。

   在設定了您的測試套件之後，請選擇 **Next** (下一步)。

1. 在**步驟 3** 中，選取要使用 Device Advisor 測試的 AWS IoT 物件或憑證。如果沒有任何現有物件或憑證，請參閱[設定](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-setting-up.html)。  
![\[組態選項包括選取通訊協定、建立測試套件、設定裝置設定，以及檢閱測試執行和結果。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-device-settings.png)

1. 您可以設定 Device Advisor 用來代表測試裝置執行 AWS IoT MQTT 動作的裝置角色。僅針對 **MQTT Connect** 測試案例，才會自動選取 **Connect** 動作。這是因為裝置角色需要此許可才能執行測試套件。對於其他測試案例，系統會選取對應的動作。

   提供每個選取動作的資源值。例如，對於 **Connect** 動作，請提供裝置用來連線至 Device Advisor 端點的用戶端 ID。您可以使用逗號分隔值提供多個值，並以萬用字元 (\$1) 作為這些值的字首。例如，若要對以 `MyTopic` 為開頭的任何主題提供發佈許可，請輸入 **MyTopic\$1** 作為資源值。  
![\[Device Advisor 介面可讓您選取裝置角色，並定義連線、發佈、訂閱和管理 MQTT 主題和用戶端 IDs許可。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-device-role.png)

   若要從[設定](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-setting-up.html)使用先前建立的裝置角色，請選擇**選取現有角色**。然後在**選取角色**下選擇您的裝置角色。  
![\[用於選取裝置角色的 Web 表單界面，具有建立新角色或選取名為「DeviceAdvisorServiceRole」之現有角色的選項。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-select-device-role.png)

   使用提供的兩個選項之一來設定裝置角色，然後選擇**下一步**。

1. 在**測試端點**區段中，選取最適合使用案例的端點。若要使用相同的 同時執行多個測試套件 AWS 帳戶，請選取**裝置層級端點**。若要一次執行一個測試套件，請選取**帳戶層級端點**。  
![\[選取帳戶層級或裝置層級端點以供測試的選項，並提供端點 URL 和下一步按鈕。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-endpoint.png)

1. **步驟 4** 顯示所選測試裝置、測試端點、測試套件，以及所設定之測試裝置角色的概觀。若要對區段進行變更，請為要編輯的區段選擇**編輯**按鈕。一旦確認了您的測試組態，請選擇**執行**來建立測試套件並執行您的測試。
**注意**  
如需最佳結果，您可以在開始執行測試套件之前，將選取的測試裝置連線至 Device Advisor 測試端點。我們建議您為裝置建置一個機制，每隔五秒嘗試連接到我們的測試端點，最多持續一到兩分鐘。  
![\[裝置組態主控台，顯示裝置角色詳細資訊、測試端點，以及取消、返回或執行的選項。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-device-review.png)  
![\[裝置組態主控台，顯示裝置角色詳細資訊、測試端點，以及取消、返回或執行的選項。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-device-review-contd.png)

1. 在導覽窗格的**測試**下，選擇 **Device Advisor**，然後選擇**測試執行和結果**。選取測試套件執行，以檢視其執行詳細資訊和記錄。  
![\[表示裝置 "MyThing" 正在進行 MQTT 3.1.1 測試的測試套件界面。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-console-runs-results.png)

1. 若要存取套件執行的 Amazon CloudWatch Logs：
   + 選擇 **Test suite log** (測試套件記錄)，以檢視測試套件執行的 CloudWatch 記錄。
   + 選擇任何測試案例的 **Test case log** (測試案例記錄)，以檢視測試案例特定的 CloudWatch 記錄。

1. 根據您的測試結果，[疑難排解](https://docs.aws.amazon.com/iot/latest/developerguide/iot_troubleshooting.html#device-advisor-troubleshooting)您的裝置，直到所有測試都通過。

# Device Advisor 工作流程
<a name="device-advisor-workflow"></a>

本教學課程說明如何建立自訂測試套件，以及針對您要在主控台中測試的裝置執行測試。在測試完成之後，您可以檢視測試結果和詳細記錄。

## 先決條件
<a name="device-advisor-workflow-prereqs"></a>

開始本教學課程之前，請先完成[設定](device-advisor-setting-up.md)中概述的步驟。

## 建立測試套件定義
<a name="device-advisor-workflow-create-suite-definition"></a>

首先，[安裝 AWS SDK](https://docs.aws.amazon.com/iot/latest/developerguide/iot-connect-service.html#iot-service-sdks)。

### `rootGroup` 語法
<a name="rootGroup"></a>

根群組是 JSON 字串，指定哪些測試案例包含在您的測試套件中。它也會針對這些測試案例指定任何必要的組態。使用根群組根據您的需求建構和排序您的測試套件。測試套件的階層如下：

```
test suite → test group(s) → test case(s)
```

一個測試套件必須至少具有一個測試群組，而且每個測試群組必須至少具有一個測試案例。Device Advisor 會依您定義測試群組和測試案例的順序執行測試。

每個根群組都遵循這個基本結構：

```
{
    "configuration": {  // for all tests in the test suite
        "": ""
    }
    "tests": [{
        "name": ""
        "configuration": {  // for all sub-groups in this test group 
            "": ""
        },
        "tests": [{
            "name": ""
            "configuration": {  // for all test cases in this test group 
                "": ""
            },
            "test": {
                "id": ""  
                "version": ""
            }
        }]
    }]
}
```



在根群組中，您可以使用 `name`、`configuration`，以及群組包含的 `tests` 來定義測試套件。`tests` 群組包含個別測試的定義。您可以使用 `name`、`configuration`，以及針對該測試定義測試案例的 `test` 區塊來定義每個測試。最後，每個測試案例都是使用 `id` 和 `version` 定義的。

如需如何為每個測試案例 (`test` 區塊) 使用 `"id"` 和 `"version"` 欄位的相關資訊，請參閱 [Device Advisor 測試案例](device-advisor-tests.md)。該節還包含可用 `configuration` 設定的相關資訊。

下列區塊是根群組組態的範例。此組態指定 *MQTT Connect Happy Case* 和 *MQTT Connect Exponential Backoff Retries* 測試案例，以及組態欄位的描述。

```
{
    "configuration": {},  // Suite-level configuration
    "tests": [            // Group definitions should be provided here
      {
        "name": "My_MQTT_Connect_Group",  // Group definition name
        "configuration": {}               // Group definition-level configuration,
        "tests": [                        // Test case definitions should be provided here
        {
            "name": "My_MQTT_Connect_Happy_Case",  // Test case definition name
            "configuration": {
                "EXECUTION_TIMEOUT": 300        // Test case definition-level configuration, in seconds
            }, 
            "test": {
                "id": "MQTT_Connect",              // test case id
                "version": "0.0.0"                 // test case version
            }
        },
        {
            "name": "My_MQTT_Connect_Jitter_Backoff_Retries",  // Test case definition name
            "configuration": {
                "EXECUTION_TIMEOUT": 600                 // Test case definition-level configuration,  in seconds
            },
            "test": {
                "id": "MQTT_Connect_Jitter_Backoff_Retries",  // test case id
                "version": "0.0.0"                                 // test case version
            }
        }]
    }]
}
```

您必須在建立測試套件定義時提供根群組組態。儲存回應物件中傳回的 `suiteDefinitionId`。您可以使用此 ID 擷取測試套件定義資訊，以及執行測試套件。

以下是一個 Java 開發套件範例：

```
response = iotDeviceAdvisorClient.createSuiteDefinition(
        CreateSuiteDefinitionRequest.builder()
            .suiteDefinitionConfiguration(SuiteDefinitionConfiguration.builder()
                .suiteDefinitionName("your-suite-definition-name")
                .devices(
                    DeviceUnderTest.builder()
                        .thingArn("your-test-device-thing-arn")
                        .certificateArn("your-test-device-certificate-arn")
                        .deviceRoleArn("your-device-role-arn") //if using SigV4 for MQTT over WebSocket
                        .build()
                )
                .rootGroup("your-root-group-configuration")
                .devicePermissionRoleArn("your-device-permission-role-arn")
                .protocol("MqttV3_1_1 || MqttV5 || MqttV3_1_1_OverWebSocket || MqttV5_OverWebSocket")
                .build()
            )
            .build()
)
```

## 取得測試套件定義
<a name="device-advisor-workflow-describe-suite-run"></a>

在建立您的測試套件定義之後，您會在 `CreateSuiteDefinition` API 操作的回應物件中收到 `suiteDefinitionId`。

當此操作傳回 `suiteDefinitionId` 時，您可能會在每個群組內看到新的 `id` 欄位，以及在根群組內看到測試案例定義。您可以使用這些 ID 來執行測試套件定義的子集。

Java 開發套件範例：

```
response = iotDeviceAdvisorClient.GetSuiteDefinition(
    GetSuiteDefinitionRequest.builder()
        .suiteDefinitionId("your-suite-definition-id")
        .build()
)
```

## 取得測試端點
<a name="device-advisor-workflow-get-test-endpoint"></a>

使用 `GetEndpoint` API 操作取得裝置所使用的測試端點。選取最適合您測試的端點。若要同時執行多個測試套件，請透過提供 `thing ARN`、`certificate ARN` 或 `device role ARN` 來使用裝置層級端點。若要執行單一測試套件，請不提供引數給 GetEndpoint 操作，以選擇帳戶層級端點。

開發套件範例：

```
response = iotDeviceAdvisorClient.getEndpoint(GetEndpointRequest.builder()
.certificateArn("your-test-device-certificate-arn")
.thingArn("your-test-device-thing-arn")
.deviceRoleArn("your-device-role-arn") //if using SigV4 for MQTT over WebSocket                
.build())
```

## 啟動測試套件執行
<a name="device-advisor-workflow-start-suite-run"></a>

在建立了測試套件定義，並將測試裝置設定為連線至 Device Advisor 測試端點之後，請使用 `StartSuiteRun` API 執行您的測試套件。

對於 MQTT 客戶，請使用 `certificateArn` 或 `thingArn` 執行測試套件。當設定這兩者時，如果憑證屬於物件，則會使用此憑證。

對於 MQTT over WebSocket 客戶，請使用 `deviceRoleArn` 來執行測試套件。如果指定的角色與測試套件定義中指定的角色不同，則指定的角色會覆寫定義的角色。

對於 `.parallelRun()`，如果使用裝置層級端點，來使用一個 AWS 帳戶平行執行多個測試套件，請使用 `true`。

開發套件範例：

```
response = iotDeviceAdvisorClient.startSuiteRun(StartSuiteRunRequest.builder()
.suiteDefinitionId("your-suite-definition-id")
.suiteRunConfiguration(SuiteRunConfiguration.builder()
    .primaryDevice(DeviceUnderTest.builder()
        .certificateArn("your-test-device-certificate-arn")
        .thingArn("your-test-device-thing-arn")
        .deviceRoleArn("your-device-role-arn") //if using SigV4 for MQTT over WebSocket               
        .build())
    .parallelRun(true | false)    
    .build())
.build())
```

從回應儲存 `suiteRunId`。您將使用此資訊來擷取此測試套件執行的結果。

## 取得測試套件執行
<a name="device-advisor-workflow-describe-suite"></a>

在您開始測試套件執行之後，您可以使用 `GetSuiteRun` API 來檢查其進度及結果。

開發套件範例：

```
// Using the SDK, call the GetSuiteRun API.

response = iotDeviceAdvisorClient.GetSuiteRun(
GetSuiteRunRequest.builder()
    .suiteDefinitionId("your-suite-definition-id")
    .suiteRunId("your-suite-run-id")
.build())
```

## 停止測試套件執行
<a name="device-advisor-workflow-stop-suite-run"></a>

若要停止仍在進行的測試套件執行，您可以呼叫 `StopSuiteRun` API 操作。在您呼叫 `StopSuiteRun` API 操作之後，服務將會啟動清除程序。當服務執行清除程序時，測試套件執行狀態會更新為 `Stopping`。清除程序需要幾分鐘的時間來完成。一旦此程序完成，測試套件執行狀態就會更新為 `Stopped`。在測試執行完全停止之後，您可以啟動另一個測試套件執行。您可以使用 `GetSuiteRun` API 操作定期檢查套件執行狀態，如上節所示。

開發套件範例：

```
// Using the SDK, call the StopSuiteRun API.

response = iotDeviceAdvisorClient.StopSuiteRun(
StopSuiteRun.builder()
    .suiteDefinitionId("your-suite-definition-id")
    .suiteRunId("your-suite-run-id")
.build())
```

## 取得成功資格測試套件執行的資格報告
<a name="device-advisor-workflow-qualification-report"></a>

如果執行成功完成的資格測試套件，則可以使用 `GetSuiteRunReport` API 操作擷取資格報告。您可以使用此資格報告，搭配 AWS IoT Core 資格計畫限定您的裝置。若要判斷您的測試套件是否為資格測試套件，請檢查 `intendedForQualification` 參數是否設定為 `true`。在呼叫 `GetSuiteRunReport` API 操作之後，您可以從傳回的 URL 下載報告，最長可達 90 秒。如果上次呼叫 `GetSuiteRunReport` API 操作的經歷時間超過 90 秒，請再次呼叫該操作來擷取新的有效 URL。

開發套件範例：

```
// Using the SDK, call the getSuiteRunReport API. 

response = iotDeviceAdvisorClient.getSuiteRunReport( 
    GetSuiteRunReportRequest.builder() 
        .suiteDefinitionId("your-suite-definition-id")
        .suiteRunId("your-suite-run-id")
        .build()
)
```

# Device Advisor 詳細主控台工作流程
<a name="device-advisor-console-tutorial"></a>

在此教學課程中，您已建立自訂測試套件，並針對您要在主控台中測試的裝置執行測試。在測試完成之後，您可以檢視測試結果和詳細記錄。

**Topics**
+ [先決條件](#da-detailed-prereqs)
+ [建立測試套件定義](#device-advisor-console-create-suite)
+ [啟動測試套件執行](#device-advisor-console-run-test-suite)
+ [停止測試套件執行 (選用)](#device-advisor-stop-test-run)
+ [檢視測試套件執行詳細資訊和記錄](#device-advisor-console-view-logs)
+ [下載 AWS IoT 資格報告](#device-advisor-console-qualification-report)

## 先決條件
<a name="da-detailed-prereqs"></a>

為完成此教學課程，您需要[建立物件和憑證](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-setting-up.html#da-create-thing-certificate)。

## 建立測試套件定義
<a name="device-advisor-console-create-suite"></a>

建立測試套件套件，以便您可以為裝置執行它並執行驗證。

1. 在 [AWS IoT 主控台](https://console.aws.amazon.com//iot)的導覽窗格中，展開 **Test** (測試)、**Device Advisor**，然後選擇 **Test suites** (測試套件)。  
![\[Device Advisor 界面具有為合格裝置建立測試套件、執行長時間測試和自訂測試套件的選項。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-testsuite.png)

   選擇 **Create Test Suite** (建立測試套件)。

1. 擇一選取 `Use the AWS Qualification test suite` 或者 `Create a new test suite`。

   對於通訊協定，請選擇 **MQTT 3.1.1** 或 **MQTT 5**。  
![\[「建立測試套件」搭配選項，以選擇測試套件類型 (AWS IoT Core 資格、長持續時間或自訂） 和通訊協定 (MQTT 3.1.1 或 MQTT 5)。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-create-test-suite.png)

   選取 `Use the AWS Qualification test suite`以符合資格並將您的裝置列出至 AWS 合作夥伴裝置目錄。透過選擇此選項，根據 AWS IoT Core 資格計劃限定您裝置所需的測試案例是預先選取的。無法新增或移除測試群組和測試案例。不過，您仍然需要設定測試套件屬性。

   選取 `Create a new test suite` 來建立和設定自訂測試套件。我們建議您從這個選項開始進行初始測試和疑難排解。一個自訂測試套件必須至少具有一個測試群組，而且每個測試群組必須至少具有一個測試案例。基於本教學課程的目的，我們將選取此選項並選擇 **Next** (下一步)。  
![\[設定測試套件頁面，顯示建立測試套件的步驟，其中包含測試群組和測試 IoT 裝置的案例。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-configure-test-suite.png)

1. 選擇 **Test suite properties** (測試套件屬性)。必須在建立測試套件時建立測試套件屬性。  
![\[「設定測試套件」界面，顯示建立測試群組和新增測試案例以測試 IoT 裝置功能的選項。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-test-suite-properties.png)

   在 **Test suite properties** (測試套件屬性) 下，請填寫下列資訊：
   + **Test suite name** (測試套件名稱)：您可以使用自訂名稱建立套件。
   + **Timeout** (逾時) (選用)：目前測試套件中每個測試案例的逾時 (以秒為單位)。如果您未指定逾時值，則系統會使用預設值。
   + **Tags** (標籤) (選用)：將標籤新增至測試套件。  
![\[視窗標題為「測試套件屬性」，顯示欄位以指定 Device Advisor 示範套件的測試套件名稱、逾時和自訂標籤。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-test-suite-properties-1.png)

   完成後，請選擇 **Update properties** (更新屬性)。

1. 若要修改群組層級組態，請在 `Test group 1` 下，選擇 **Edit** (編輯)。接著，輸入 **Name** (名稱)，為群組提供自訂名稱。

   您也可以選擇性地在選取的測試群組下輸入 **Timeout** (逾時) 值 (以秒為單位)。如果您未指定逾時值，則系統會使用預設值。  
![\[用於建立測試群組和案例以驗證 IoT 裝置功能的「設定測試套件」界面。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-edit-test-group.png)

   選擇 **Done (完成)**。

1. 將其中一個可用的測試案例從 **Test cases** (測試案例) 拖曳至測試群組。  
![\[在 Device Advisor 中建立測試套件的組態界面，可選擇新增測試群組和測試 IoT 裝置的測試案例。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-configure-test-suite-step5.png)

1. 若要為新增至測試群組的測試案例修改測試案例層級組態，請選擇 **Edit** (編輯)。接著，輸入 **Name** (名稱)，為群組提供自訂名稱。

   您也可以選擇性地在選取的測試群組下輸入 **Timeout** (逾時) 值 (以秒為單位)。如果您未指定逾時值，則系統會使用預設值。  
![\[使用選項來測試套件組態界面，以設定測試群組、測試案例、逾時設定和測試套件執行的起點。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-edit-test-case.png)

   選擇 **Done (完成)**。
**注意**  
若要將更多測試群組新增至測試套件，請選擇 **Add test group** (新增測試群組)。依照上述步驟建立和設定更多測試群組，或將更多測試案例新增至一或多個測試群組。選擇測試案例並將其拖曳至所需位置，即可將測試群組和測試案例重新排序。Device Advisor 會依您定義測試群組和測試案例的順序執行測試。

1. 選擇**下一步**。

1. 在**步驟 3** 中，設定 Device Advisor 將用來代表測試裝置執行 AWS IoT MQTT 動作的裝置角色。

   如果僅在 **Step 2** (步驟 2) 中選取 **MQTT Connect** 測試案例，系統會自動檢查 **Connect** (連接) 動作，因為裝置角色需要該許可才能執行此測試套件。如果選取了其他測試案例，系統會檢查相應的必要動作。確保已為每個動作提供資源值。例如，對於 **Connect** (連接) 動作，請提供裝置在連接至 Device Advisor 端點所用的用戶端 ID。可以使用逗號分隔值的方式提供多個值，也可以使用萬用字元 (\$1) 字元來提供字首值。若要提供以 `MyTopic` 為開頭的主題發佈許可，則可提供 `MyTopic*` 作為資源值。  
![\[Device Advisor 中用於建立測試套件的「選取裝置角色」步驟，包含建立新角色或選取現有角色的選項，以及指定角色名稱、許可和資源詳細資訊的欄位。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-connect-role.png)

   如果先前已建立裝置角色，而且希望使用該角色，請選擇 **Select an existing role** (選取現有角色)，然後在 **Select role** (選取角色) 下選擇裝置角色。  
![\[選取 Device Advisor 測試裝置角色的頁面，其中包含建立新角色或選取現有角色的選項。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-existing-role.png)

   使用提供的兩個選項之一來設定裝置角色，然後選擇 **Next** (下一步)。

1. 在 **Step 4** (步驟 4)，請確保每個步驟中提供的組態正確無誤。若要編輯針對特定步驟提供的組態，請選擇 **Edit** (編輯) 來取得相應的步驟。

   確認組態之後，請選擇 **Create test suite** (建立測試套件)。

   應該成功建立測試套件，並且您將被重新導向到 **Test suites** (測試套件) 頁面，在這裡您可以檢視所有已建立的測試套件。

   如果建立測試套件失敗，請確保已根據先前的指示，設定測試套件、測試群組、測試案例和裝置角色。

## 啟動測試套件執行
<a name="device-advisor-console-run-test-suite"></a>

1. 在 [AWS IoT 主控台](https://console.aws.amazon.com//iot)的導覽窗格中，展開 **Test** (測試)、**Device Advisor**，然後選擇 **Test suites** (測試套件)。

1. 選擇您要檢視哪個測試套件的詳細資訊。  
![\[主控台顯示 2021 年 5 月 11 日建立的名為「裝置建議程式示範套件」的單一測試套件。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-test-suites.png)

   測試套件詳細資訊頁面會顯示與測試套件相關的所有資訊。

1. 選擇 **Actions** (動作)，然後 **Run test suite** (執行測試套件)。  
![\[顯示「執行測試套件」按鈕的示範套件頁面，以及顯示先前未執行測試套件的空活動日誌。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-run-test-suites.png)

1. 在**執行組態**下，您將需要選取要使用 Device Advisor 測試的 AWS IoT 物件或憑證。如果您沒有任何現有的實物或憑證，請先[建立 AWS IoT Core 資源](device-advisor-setting-up.md)。

   在 **Test endpoint** (測試端點) 區段中，選取最適合案例的端點。如果您計劃在未來使用相同的 AWS 帳戶同時執行多個測試套件，請選取**裝置層級端點**。如果打算一次只執行一個測試套件，請選取 **Account-level endpoint** (帳戶層級端點)。

   使用選取的 Device Advisor 測試端點來設定測試裝置。

   選取物件或憑證並選擇 Device Advisor 端點後，請選擇 **Run test** (執行測試)。  
![\[在 上執行測試套件的組態 AWS IoT Core，可讓您選取測試裝置 （物件或憑證）、選擇測試端點 （帳戶層級或裝置層級），以及選擇性新增標籤。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-choose-thing-certificate.png)

1. 選擇頂端橫幅上的 **Go to results** (前往結果)，以檢視測試執行詳細資訊。  
![\[名為「Device Advisor 示範套件」且狀態為「待處理」的自訂測試套件詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-test-run-results.png)

## 停止測試套件執行 (選用)
<a name="device-advisor-stop-test-run"></a>

1. 在 [AWS IoT 主控台](https://console.aws.amazon.com//iot)的導覽窗格中，展開 **Test** (測試)、**Device Advisor**，然後選擇 **Test runs and results** (測試執行和結果)。

1. 選擇您要停止的進行中測試套件。  
![\[測試結果會在 Device Advisor 主控台上執行。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-test-suite-to-stop.PNG)

1. 選擇 **Actions** (動作)，然後 **Stop test suite** (停止測試套件)。  
![\[測試結果會在 Device Advisor 主控台上執行。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-stop-test-suite.PNG)

1. 此清除程序需要幾分鐘的時間來完成。當清除程序執行時，測試執行狀態將為 `STOPPING`。等待清除程序完成，且測試套件狀態變更為 `STOPPED` 狀態，再開始新的套件執行。  
![\[停止的測試結果會在 Device Advisor 主控台上執行。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-stopped-test-suite.PNG)

## 檢視測試套件執行詳細資訊和記錄
<a name="device-advisor-console-view-logs"></a>

1. 在 [AWS IoT 主控台](https://console.aws.amazon.com//iot)的導覽窗格中，展開 **Test** (測試)、**Device Advisor**，然後選擇 **Test runs and results** (測試執行和結果)。

   此頁面顯示：
   + IoT 物件的數目
   + IoT 憑證的數目
   + 目前執行的測試套件數目
   + 所有已建立的測試套件執行

1. 選擇您要檢視哪個測試套件的執行詳細資訊和記錄。  
![\[測試執行和結果區段，顯示目前進行中名為「Device Advisor 示範套件」的測試套件詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-test-suite-run.png)

   執行摘要頁面會顯示目前測試套件執行的狀態。此頁面每隔 10 秒自動重新整理一次。我們建議您為裝置建置一個機制，每隔五秒嘗試連接到我們的測試端點，持續一到兩分鐘。然後，您可以採取自動方式依序執行多個測試用例。  
![\[測試案例日誌顯示成功的 MQTT Connect 測試，未顯示系統訊息。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-run-summary.png)

1. 若要存取測試套件執行的 CloudWatch 記錄，請選擇 **Test suite log** (測試套件記錄)。

   若要存取任何測試案例的 CloudWatch 記錄，請選擇 **Test case log** (測試案例記錄)。

1. 根據您的測試結果，[疑難排解](https://docs.aws.amazon.com/iot/latest/developerguide/iot_troubleshooting.html#device-advisor-troubleshooting)您的裝置，直到所有測試都通過。

## 下載 AWS IoT 資格報告
<a name="device-advisor-console-qualification-report"></a>

如果您在建立**測試套件時選擇使用 AWS IoT 資格**測試套件選項，並且能夠執行資格測試套件，則可以在測試執行摘要頁面中選擇下載資格**報告來下載資格**報告。

![\[資格計劃測試結果，顯示 MQTT、TLS 和其他元件的通過測試。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/da-qualification-report.png)


# 長時間測試主控台工作流程
<a name="device-advisor-long-duration-console-tutorial"></a>

本教學課程可協助您使用主控台對 Device Advisor 進行長時間測試。若要完成教學課程，請遵循 [設定](device-advisor-setting-up.md) 中的步驟。

1.  在 [AWS IoT 主控台](https://console.aws.amazon.com/iot)的導覽窗格中，展開 **Test** (測試)、**Device Advisor**，然後選擇 **Test suites** (測試套件)。在頁面上，選取 **Create long duration test suite** (建立長時間測試套件)。  
![\[Device Advisor 主控台的建立長期測試套件區段。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/create-ld-ts.png)

1.  在 **Create test suite** (建立測試套件) 頁面，選取 **Long duration test suite** (長時間測試套件)，然後選擇**Next** (下一步)。

   對於通訊協定，請選擇 **MQTT 3.1.1** 或 **MQTT 5**。  
![\[Device Advisor 主控台的建立測試套件步驟。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/choose-ld-ts.png)

1. 在 **Configure test suite** (設定測試套件) 頁面上，執行以下操作：

   1. 更新 **Test suite name** (測試套件名稱) 欄位。

   1. 更新 **Test group name** (測試群組名稱) 欄位。

   1. 選擇裝置可以執行的 **Device operations** (裝置操作)。此步驟將會選擇要執行的測試。

   1. 選取 **Settings** (設定) 選項。  
![\[Device Advisor 主控台的建立測試套件步驟。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/configure-ld-ts.png)

1. (選擇性) 輸入 Device Advisor 等待基本測試完成所需的時間上限。選取**儲存**。  
![\[Device Advisor 主控台之「基本測試」的「逾時選用」方塊。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/timeout-ld-ts.png)

1.  在 **Advanced tests** (進階測試) 和 **Additional settings** (其他設定) 區段中執行下列動作。

   1. 選取或取消選取您要在此測試中執行的 **Advanced tests** (進階測試)。

   1. **Edit** (編輯) 測試組態（如果適用）。

   1. 在 **Additional settings** (其他設定) 區段下設定 **Additional execution time** (其他執行時間)。

   1. 選擇 **Next** (下一步)，並進行下一個步驟。  
![\[Device Advisor 介面，可讓您在 IoT 裝置上設定和執行測試。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/additional-ld-ts.png)

1.  在此步驟中選擇 **Create a new role** (建立新角色) 或 **Select an existing role** (選取現有角色)。如需詳細資訊，請參閱 [建立要用作裝置角色的 IAM 角色](device-advisor-setting-up.md#da-iam-role)。  
![\[您可以在其中建立新角色的裝置角色步驟，或為要測試的裝置選取現有角色。此角色會授予 Device Advisor 代表測試裝置執行連線、發佈和訂閱等 MQTT 動作的許可。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/devicerole-ld-ts.png)

1.  檢閱所有在此步驟之前建立的組態，然後選取 **Create test suite** (建立測試套件)。  
![\[「檢閱」頁面，您可以在其中檢閱 Device Advisor 組態的所有詳細資訊。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/finalconfigure1-ld-ts.png)  
![\[您可以在其中檢視 Device Advisor 所有詳細資訊的組態頁面。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/finalconfigure2-ld-ts.png)

1.  建立的測試套件位於 **Test suites** (測試套件) 區段下。選取套件以檢視詳細資訊。  
![\[已在 Device Advisor 中成功建立名為「長時間示範」的新測試套件。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/finalts-ld-ts.png)

1.  要執行建立的測試套件，請選取 **Actions** (動作)，然後選擇 **Run test suite** (執行測試套件)。  
![\[Device Advisor 介面中名為「長時間示範」之新測試套件的動作下拉式功能表。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/runts-ld-ts.png)

1.  在 **Run configuration** (執行組態) 頁面選擇組態選項。

   1. 選取要執行測試的 **Things** (物件) 或 **Certificate** (憑證)。

   1. 選取 **Account-level endpoint** (帳戶層級端點) 或 **Device-level endpoint** (裝置層級端點)。

   1. 選擇 **Test (測試)** 以執行測試。  
![\[Device Advisor 介面中的執行組態頁面。此頁面顯示選取測試裝置、物件、測試端點和標籤。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/runconfiguration-ld-ts.png)

1.  要查看測試套件執行的結果，請選擇左側導航窗格中的 **Test runs and results** (測試執行和結果)。選擇已執行的測試套件，以檢視結果的詳細資訊。  
![\[測試執行和結果頁面上的「長時間示範」測試案例。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/results-ld-ts.png)

1.  上一個步驟會顯示測試摘要頁面。所有關於測試執行的詳細資訊都會顯示在此頁面中。當主控台提示您開始進行裝置連線時，請將您的裝置連線至提供的端點。測試的進度會顯示在此頁面。  
![\[您建立的「長時間示範」測試的摘要頁面。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/summary-ld-ts.png)

1.  長時間測試會在側邊面板列出額外的 **Test log summary** (測試日誌摘要)，以近乎即時的速度顯示所有發生於裝置與代理程式之間的重要事件。要查看更深入的詳細日誌，請按一下 **Test case log** (測試案例日誌)。  
![\[「長時間示範」測試頁面上的測試日誌摘要區段。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/log-ld-ts.png)

# Device Advisor VPC 端點 (AWS PrivateLink)
<a name="device-advisor-vpc-endpoint"></a>

您可以建立*介面 VPC 端點，在 VPC* 與 AWS IoT Core Device Advisor 測試端點 （資料平面） 之間建立私有連線。您可以在將 AWS IoT 裝置部署到生產環境 AWS IoT Core 之前，使用此端點來驗證裝置與 的可靠且安全連線。Device Advisor 的預先建置測試可協助依據最佳實務驗證您的裝置軟體對於 [TLS](https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html)、[MQTT](https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html)、[Device Shadow](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html) 和 [AWS IoT 工作](https://docs.aws.amazon.com/iot/latest/developerguide/iot-jobs.html) 的使用。

[AWS PrivateLink](https://aws.amazon.com/privatelink) 支援與 IoT 裝置搭配使用的介面端點。此服務可協助您在不使用網際網路閘道、NAT 裝置、VPC 連線或 Direct Connect 連接的情況下，以私有方式存取 AWS IoT Core Device Advisor 測試端點。您 VPC 中傳送 TCP 和 MQTT 封包的執行個體不需要公有 IP 地址，即可與 AWS IoT Core Device Advisor 測試端點通訊。VPC 與 AWS IoT Core Device Advisor 之間的流量不會離開 AWS 雲端。IoT 裝置與 Device Advisor 測試案例之間的任何 TLS 和 MQTT 通訊都會保留在您 AWS 帳戶的資源中。

每個介面端點都由子網路中的一個或多個[彈性網路介面](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)表示。

如需 VPC 端點的詳細資訊，請參閱《*Amazon VPC 使用者指南*》中的[界面 VPC 端點 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html)。

## AWS IoT Core Device Advisor VPC 端點的考量事項
<a name="vpc-considerations"></a>

設定界面 VPC 端點之前，請務必檢閱《*Amazon VPC 使用者指南*》中的[界面端點屬性和限制](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#vpce-interface-limitations)。繼續之前，請考慮以下項目：
+ AWS IoT Core Device Advisor 目前支援從您的 VPC 呼叫 Device Advisor 測試端點 （資料平面）。訊息代理程式使用資料平面通訊來傳送和接收資料。它藉由 TLS 和 MQTT 封包的協助做到這一點。將 AWS IoT 裝置 AWS IoT Core Device Advisor 連線至 Device Advisor 測試端點的 VPC 端點。此 VPC 端點不會使用[控制平面 API 動作](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iotdeviceadvisor/index.html)。若要建立或執行測試套件或其他控制平面 APIs，請透過公有網際網路使用 主控台、 AWS 開發套件或 AWS 命令列界面。
+ 下列 AWS 區域 支援 的 VPC 端點 AWS IoT Core Device Advisor：
  + 美國東部 (維吉尼亞北部)
  + 美國西部 (奧勒岡)
  + 亞太地區 (東京)
  + 歐洲 (愛爾蘭)
+  Device Advisor 支援具有 X.509 用戶端憑證和 RSA 伺服器的 MQTT。
+ 目前不支援 [VPC 端點政策](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)。
+ 如需如何[建立資源](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws) (連接 VPC 端點) 的指示，請檢查 VPC 端點的[必要條件](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#prerequisites-interface-endpoints)。您必須建立 VPC 和私有子網路，才能使用 AWS IoT Core Device Advisor VPC 端點。
+ 資源上有配額 AWS PrivateLink 。如需詳細資訊，請參閱 [AWS PrivateLink 配額](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-limits-endpoints.html)。
+ VPC 端點僅支援 IPv4 流量。

## 建立 的介面 VPC 端點 AWS IoT Core Device Advisor
<a name="vpc-interface"></a>

若要開始使用 VPC 端點，請[建立介面 VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)。接著，選取 AWS IoT Core Device Advisor 做為 AWS 服務。如果您使用的是 AWS CLI，請呼叫 [describe-vpc-endpoint-services](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpc-endpoint-services.html) 以確認 AWS IoT Core Device Advisor 存在於您 中的可用區域中 AWS 區域。確認連接到端點的安全群組允許 MQTT 和 TLS 流量進行 [TCP 協定通訊](https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html)。例如，在美國東部 (維吉尼亞北部) 區域，使用下列命令：

```
aws ec2 describe-vpc-endpoint-services --service-name com.amazonaws.us-east-1.deviceadvisor.iot
```

您可以使用 AWS IoT Core 下列服務名稱為 建立 VPC 端點：
+ com.amazonaws.*region*.deviceadvisor.iot

根據預設，端點的私有 DNS 為開啟。這可確保使用預設測試端點會保留在您的私有子網路中。若要取得您的帳戶或裝置層級端點，請使用 主控台 AWS CLI 或 AWS SDK。例如，如果您在公有子網路或公用網際網路上執行 [get-point](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iotdeviceadvisor/get-endpoint.html)，您可以取得端點並使用它來連線至 Device Advisor。如需詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[透過介面端點存取服務](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#access-service-though-endpoint)。

若要將 MQTT 用戶端連線至 VPC 端點介面， AWS PrivateLink 服務會在連接到 VPC 的私有託管區域中建立 DNS 記錄。這些 DNS 記錄會將 AWS IoT 裝置的要求導向至 VPC 端點。

## 透過 VPC AWS IoT Core Device Advisor 端點控制對 的存取
<a name="vpc-controlling-access"></a>

您可以使用 VPC [條件內容索引鍵](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)來限制裝置對 的存取， AWS IoT Core Device Advisor 並僅允許透過 VPC 端點存取。 AWS IoT Core 支援下列 VPC 相關內容索引鍵：
+  [SourceVpc](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcevpc) 
+  [SourceVpce](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcevpce) 
+  [VPCSourcelp](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-vpcsourceip) 

**注意**  
 AWS IoT Core Device Advisor 目前不支援 [ VPC 端點政策](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html#vpc-endpoint-policies)。

下列政策授予許可，以 AWS IoT Core Device Advisor 使用符合物件名稱的用戶端 ID 連線至 。它也會發佈至以物件名稱為前置詞的任何主題。該政策取決於連接到具有特定 VPC 端點 ID 的 VPC 端點的裝置。此政策會拒絕與公有 AWS IoT Core Device Advisor 測試端點的連線嘗試。

****  

```
{
"Version":"2012-10-17",		 	 	 
    "Statement": [
        {
"Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
            ],
            "Condition": {
"StringEquals": {
"aws:SourceVpce": "vpce-1a2b3c4d"
            }
        }
            
        },
        {
"Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.ThingName}/*"
            ]
        }
    ]
}
```

# Device Advisor 測試案例
<a name="device-advisor-tests"></a>

Device Advisor 提供六種類別的預先建置測試。
+ [TLS](device-advisor-tests-tls.md)
+ [MQTT](device-advisor-tests-mqtt.md)
+ [影子](device-advisor-tests-shadow.md)
+ [任務執行](device-advisor-tests-job-execution.md)
+ [許可和政策](device-advisor-tests-permissions-policies.md)
+ [長時間測試](device-advisor-tests-long-duration.md)

## Device Advisor 測試案例以符合 AWS Device Qualification Program 的資格。
<a name="qualifiying-test-cases"></a>

根據 [AWS 裝置資格計畫](https://aws.amazon.com/partners/programs/dqp/)，您的裝置必須通過下列測試才能符合資格。

**注意**  
這是資格測試修訂清單。
+ [TLS Connect](device-advisor-tests-tls.md#TLS_Connect) (TLS 連接) (「TLS 連接」)
+ [TLS Incorrect Subject Name Server Cert](device-advisor-tests-tls.md#TLS_Incorrect_Subject_Name) (TLS 不正確的主體名稱伺服器憑證) (「不正確的主體通用名稱 (CN) / 主體別名 (SAN)」)
+ [TLS Unsecure Server Cert](device-advisor-tests-tls.md#TLS_Unsecure_Server_Cert) (TLS 不安全的伺服器憑證) (「未由認可的 CA 簽署」)
+ [TLS 裝置支援 AWS IoT 加密套件](device-advisor-tests-tls.md#TLS_DeviceSupport_For_IOT) (「TLS 裝置支援 AWS IoT 建議的加密套件」)
+ [TLS 接收最大大小的片段](device-advisor-tests-tls.md#TLS_MaximumSize) (「TLS 接收最大大小的片段」)
+ [TLS 過期伺服器憑證](device-advisor-tests-tls.md#TLS_Expired_Server_Cert) (「過期伺服器憑證」)
+ [TLS 大型伺服器憑證](device-advisor-tests-tls.md#TLS_LargeServerCert) (「TLS 大型伺服器憑證」)
+ [MQTT Connect](device-advisor-tests-mqtt.md#MQTT_Connect) ("Device send CONNECT to AWS IoT Core (Happy case)")
+ [MQTT Subscribe](device-advisor-tests-mqtt.md#MQTT_Subscribe) (MQTT 訂閱) (「可訂閱 (Happy 案例)」)
+ [MQTT Publish](device-advisor-tests-mqtt.md#MQTT_Publish) (MQTT 發佈) (「QOS0 (Happy 案例)」)
+ [MQTT 連線抖動重試](device-advisor-tests-mqtt.md#MQTT_ConnectJitterBackoff) (「裝置在抖動退避的情況下重試連接：沒有 CONNACK 回應」）

# TLS
<a name="device-advisor-tests-tls"></a>

使用這些測試來判斷裝置與 之間的傳輸層安全通訊協定 (TLS) AWS IoT 是否安全。

**注意**  
Device Advisor 現在支援 TLS 1.3。

## Happy Path
<a name="happy-path"></a>

**TLS Connect**  <a name="TLS_Connect"></a>
驗證測試中的裝置是否可以完成 TLS 交握 AWS IoT。此測試不會驗證用戶端裝置的 MQTT 實作。  

**Example API 測試案例定義：**  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。為了獲得最佳結果，我們建議使用 2 分鐘的逾時值。

```
"tests":[
   {
      "name":"my_tls_connect_test",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"300",  //in seconds
      },
      "test":{
         "id":"TLS_Connect",
         "version":"0.0.0"
      }
   }
]
```

**Example 測試案例輸出：**  
+ **通過** — 測試下的裝置已完成 TLS 交握 AWS IoT。
+ **傳遞警告** — 測試下的裝置已完成 TLS 交握 AWS IoT，但有來自裝置或 的 TLS 警告訊息 AWS IoT。
+ **失敗** — 由於交握錯誤 AWS IoT ，測試中的裝置無法完成與 的 TLS 交握。

**TLS 接收最大大小的片段**  <a name="TLS_MaximumSize"></a>
此測試案例驗證您的裝置是否可以接收和處理 TLS 最大大小的片段。您的測試裝置必須訂閱 QoS 1 的預先設定主題，才能接收大型承載。您可以使用組態 `${payload}` 自訂承載。  

**Example API 測試案例定義：**  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。為了獲得最佳結果，我們建議使用 2 分鐘的逾時值。

```
"tests":[
   {
      "name":"TLS Receive Maximum Size Fragments",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"300",  //in seconds
         "PAYLOAD_FORMAT":"{"message":"${payload}"}", // A string with a placeholder ${payload}, or leave it empty to receive a plain string.
         "TRIGGER_TOPIC": "test_1" // A topic to which a device will subscribe, and to which a test case will publish a large payload.
      },
      "test":{
         "id":"TLS_Receive_Maximum_Size_Fragments",
         "version":"0.0.0"
      }
   }
]
```

## 密碼套件
<a name="cipher-suites"></a>

**TLS 裝置支援 AWS IoT 建議的密碼套件**  <a name="TLS_DeviceSupport_For_IOT"></a>
驗證來自待測裝置的 TLS 用戶端 Hello 訊息中的密碼套件是否包含建議的 [AWS IoT 密碼套件](transport-security.md)。它提供裝置支援的密碼套件的更多洞見。  

**Example API 測試案例定義：**  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。

```
"tests":[
   {
      "name":"my_tls_support_aws_iot_cipher_suites_test",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"300",  // in seconds
      },
      "test":{
         "id":"TLS_Support_AWS_IoT_Cipher_Suites",
         "version":"0.0.0"
      }
   }
]
```

**Example 測試案例輸出：**  
+ **通過** — 測試密碼套件下的裝置至少包含其中一個建議的 AWS IoT 密碼套件，且不包含任何不支援的密碼套件。
+ **通過但有警告** - 裝置密碼套件至少包含其中一個 AWS IoT 加密套件，但是：

  1. 它不包含任何建議的密碼套件

  1. 它包含 不支援的密碼套件 AWS IoT。

  我們建議您驗證任何不支援的密碼套件是否安全。
+ **失敗** — 測試加密套件下的裝置不包含任何 AWS IoT 支援的加密套件。

## 較大型的伺服器憑證
<a name="larger-size"></a>

**TLS 大型伺服器憑證**  <a name="TLS_LargeServerCert"></a>
接收和處理較大型伺服器憑證時，驗證您的裝置是否可以與 AWS IoT 完成 TLS 交握。此測試使用的伺服器憑證大小 （以位元組為單位） 大於目前在 **TLS Connect** 測試案例和 IoT Core 中使用的大小 20 在此測試案例中， AWS IoT 測試裝置的 TLS 緩衝空間 如果緩衝空間夠大，則 TLS 交握會完成而不會發生錯誤。此測試不會驗證裝置的 MQTT 實作。TLS 交握程序完成後，測試案例即會停止。  

**Example API 測試案例定義：**  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。為了獲得最佳結果，我們建議使用 2 分鐘的逾時值。如果此測試案例失敗，但 **TLS Connect** 測試案例通過，我們建議您增加裝置的 TLS 緩衝區空間限制。增加緩衝區空間限制，確保您的裝置可以在大小增加的情況下處理更大的伺服器憑證。

```
"tests":[
   {
      "name":"my_tls_large_size_server_cert_test",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"300",  // in seconds
      },
      "test":{
         "id":"TLS_Large_Size_Server_Cert",
         "version":"0.0.0"
      }
   }
]
```

**Example 測試案例輸出：**  
+ **通過**：待測裝置已完成與 AWS IoT的 TLS 交握。
+ **傳遞警告** — 待測裝置已完成 TLS 交握 AWS IoT，但有來自裝置或 的 TLS 警告訊息 AWS IoT。
+ **失敗** — 測試中的裝置無法完成 TLS 交握， AWS IoT 因為交握過程中發生錯誤。

## TLS 不安全伺服器憑證
<a name="unsecure-server"></a>

**未由認可的 CA 簽署**  <a name="TLS_Unsecure_Server_Cert"></a>
驗證若提供的伺服器憑證沒有來自 ATS CA 的有效簽章，待測裝置是否會關閉連線。裝置應該只會連接到提供有效憑證的端點。  

**Example API 測試案例定義：**  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。

```
"tests":[
   {
      "name":"my_tls_unsecure_server_cert_test",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"300",  //in seconds
      },
      "test":{
         "id":"TLS_Unsecure_Server_Cert",
         "version":"0.0.0"
      }
   }
]
```

**Example 測試案例輸出：**  
+ **通過**：待測裝置已關閉連線。
+ **失敗** — 測試下的裝置已完成 TLS 交握 AWS IoT。

**TLS 不正確的主體名稱伺服器憑證 / 不正確的主體通用名稱 (CN) / 主體別名 (SAN)**  <a name="TLS_Incorrect_Subject_Name"></a>
驗證若為網域名稱提供的伺服器憑證不同於所請求的伺服器憑證，測試下的裝置是否會關閉連線。  

**Example API 測試案例定義：**  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。

```
"tests":[
   {
      "name":"my_tls_incorrect_subject_name_cert_test",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"300",   // in seconds
      },
      "test":{
         "id":"TLS_Incorrect_Subject_Name_Server_Cert",
         "version":"0.0.0"
      }
   }
]
```

**Example 測試案例輸出：**  
+ **通過**：待測裝置已關閉連線。
+ **失敗** — 待測裝置已完成 TLS 交握 AWS IoT。

## TLS 過期伺服器憑證
<a name="expired-server"></a>

**過期的伺服器憑證**  <a name="TLS_Expired_Server_Cert"></a>
驗證如果所提供伺服器憑證已過期，測試下的裝置是否會關閉連線。  

**Example API 測試案例定義：**  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。

```
"tests":[
   {
      "name":"my_tls_expired_cert_test",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"300",  //in seconds
      },
      "test":{
         "id":"TLS_Expired_Server_Cert",
         "version":"0.0.0"
      }
   }
]
```

**Example 測試案例輸出：**  
+ **通過** — 待測裝置拒絕完成 TLS 交握 AWS IoT。裝置會在關閉連線前傳送 TLS 警示訊息。
+ **通過但有警告** - 待測裝置拒絶完成與 AWS IoT的 TLS 交握。不過，它不會在關閉連線之前傳送 TLS 警示訊息。
+ **失敗** — 測試中的裝置完成 TLS 交握 AWS IoT。

# MQTT
<a name="device-advisor-tests-mqtt"></a>

## CONNECT、DISCONNECT 和 RECONNECT
<a name="connect"></a>

**「裝置將 CONNECT 傳送至 AWS IoT Core (Happy case)」**  <a name="MQTT_Connect"></a>
驗證測試下的裝置是否傳送 CONNECT 請求。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。

```
"tests":[
   {
      "name":"my_mqtt_connect_test",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"300",   // in seconds
      },
      "test":{
         "id":"MQTT_Connect",
         "version":"0.0.0"
      }
   }
]
```

**「裝置可將 PUBACK 傳回到 QOS1 的任意主題」**  
此測試案例將檢查裝置 （用戶端） 在訂閱 QoS1 主題之後，如果收到來自代理程式的發佈訊息，是否可以傳回 PUBACK 訊息。  
此測試案例的承載內容和承載大小是可設定的。如果已設定承載大小，Device Advisor 會覆寫承載內容的值，並將預先定義的承載傳送至具有所需大小的裝置。承載大小是介於 0 到 128 之間的值，且不能超過 128 KB。 AWS IoT Core 會拒絕發佈和連接大於 128 KB 的請求，如 [AWS IoT Core 訊息代理程式和通訊協定限制和配額](https://docs.aws.amazon.com/general/latest/gr/iot-core.html#message-broker-limits)頁面所示。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。`PAYLOAD_SIZE` 可以設定為介於 0 到 128 KB 之間的值。定義承載大小會覆寫承載內容，因為 Device Advisor 會將具有指定大小的預先定義承載傳送回裝置。

```
"tests":[                            
{
        "name":"my_mqtt_client_puback_qos1",
        "configuration": {
            // optional:"TRIGGER_TOPIC": "myTopic",
            "EXECUTION_TIMEOUT":"300", // in seconds
            "PAYLOAD_FOR_PUBLISH_VALIDATION":"custom payload",
            "PAYLOAD_SIZE":"100" // in kilobytes
        },
        "test": {
            "id": "MQTT_Client_Puback_QoS1",
            "version": "0.0.0"
        }
    }
]
```

**「裝置在抖動退避的情況下重試連接：沒有 CONNACK 回應」**  <a name="MQTT_ConnectJitterBackoff"></a>
驗證測試下的裝置在與代理程式重新連線至少五次時，是否使用適當的抖動退避。代理程式記錄測試下裝置的 CONNECT 請求的時間戳記、執行封包驗證、暫停而不傳送 CONNACK 到測試下的裝置，以及等待測試下的裝置重新傳送請求。允許第六次連線嘗試通過，並允許 CONNACK 回流到測試下的裝置。  
再次執行上述程序。此測試案例需要裝置總共連接至少 12 次。收集的時間戳記用來驗證測試下的裝置是否使用抖動退避。如果待測裝置具有嚴格的指數退避延遲，則此測試案例會通過但有警告。  
建議對待測裝置實作[指數退避和抖動](https://aws.amazon.com/blogs//architecture/exponential-backoff-and-jitter/)機制，以通過此測試案例。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 4 分鐘。

```
"tests":[
   {
      "name":"my_mqtt_jitter_backoff_retries_test",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"300",    // in seconds
      },
      "test":{
         "id":"MQTT_Connect_Jitter_Backoff_Retries",
         "version":"0.0.0"
      }
   }
]
```

**「裝置在指數退避的情況下重試連接：沒有 CONNACK 回應」**  
驗證測試下的裝置在與代理程式重新連線至少五次時，是否使用適當的指數退避。代理程式記錄測試下裝置的 CONNECT 請求的時間戳記、執行封包驗證、暫停而不傳送 CONNACK 到用戶端裝置，以及等待測試下的裝置重新傳送請求。收集的時間戳記用來驗證待測裝置是否使用指數退避。  
建議對待測裝置實作[指數退避和抖動](https://aws.amazon.com/blogs//architecture/exponential-backoff-and-jitter/)機制，以通過此測試案例。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 4 分鐘。

```
"tests":[
   {
      "name":"my_mqtt_exponential_backoff_retries_test",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"600",  // in seconds
      },
      "test":{
         "id":"MQTT_Connect_Exponential_Backoff_Retries",
         "version":"0.0.0"
      }
   }
]
```

**「裝置在抖動退避的情況下重新連線：在伺服器中斷連線後」**  
驗證待測裝置在與伺服器中斷連線後重新連接時，是否使用必要的抖動和退避。Device Advisor 將裝置與伺服器的連線中斷至少五次，並觀察裝置在 MQTT 重新連線時的行為。Device Advisor 記錄待測裝置的 CONNECT 請求的時間戳記、執行封包驗證、暫停而不將 CONNACK 傳送到用戶端裝置，以及等待待測裝置重新傳送請求。收集的時間戳記用來驗證在重新連接時，待測裝置是否使用抖動和退避。如果待測裝置具有嚴格的指數退避，或未實作適當的抖動退避機制，則此測試案例會通過但有警告。如果待測裝置已實作線性退避或常數退避機制，則測試會失敗。  
若要通過這個測試案例，建議對待測裝置實作[指數退避和抖動](https://aws.amazon.com/blogs//architecture/exponential-backoff-and-jitter/)機制。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 4 分鐘。  
可以透過指定 `RECONNECTION_ATTEMPTS` 來變更驗證退避的重新連線嘗試次數。號碼必須為介於 5 到 10 之間的數字。預設值為 5。

```
"tests":[
   {
      "name":"my_mqtt_reconnect_backoff_retries_on_server_disconnect",
      "configuration":{
         // optional:
         "EXECUTION_TIMEOUT":"300",  // in seconds
         "RECONNECTION_ATTEMPTS": 5
      },
      "test":{
         "id":"MQTT_Reconnect_Backoff_Retries_On_Server_Disconnect",
         "version":"0.0.0"
      }
   }
]
```

**「裝置在抖動退避的情況下重新連線 - 連線不穩定」**  
驗證待測裝置在連線不穩定時，是否使用必要的抖動和退避。Device Advisor 會在 5 次成功連線後中斷裝置與伺服器的連線，並觀察裝置在 MQTT 重新連線時的行為。Device Advisor 會記錄待測裝置的 CONNECT 請求的時間戳記、執行封包驗證、傳送回 CONNACK、中斷連線、記錄中斷連線的時間戳記，以及等待待測裝置重新傳送請求。收集的時間戳記用來驗證在成功但不穩定的連線後重新連線時，待測裝置是否使用抖動和退避。如果待測裝置具有嚴格的指數退避，或未實作適當的抖動退避機制，則此測試案例會通過但有警告。如果待測裝置已實作線性退避或常數退避機制，則測試會失敗。  
若要通過這個測試案例，建議對待測裝置實作[指數退避和抖動](https://aws.amazon.com/blogs//architecture/exponential-backoff-and-jitter/)機制。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 4 分鐘。  
可以透過指定 `RECONNECTION_ATTEMPTS` 來變更驗證退避的重新連線嘗試次數。號碼必須為介於 5 到 10 之間的數字。預設值為 5。

```
"tests":[
   {
      "name":"my_mqtt_reconnect_backoff_retries_on_unstable_connection",
      "configuration":{
         // optional:
         "EXECUTION_TIMEOUT":"300",  // in seconds
         "RECONNECTION_ATTEMPTS": 5
      },
      "test":{
         "id":"MQTT_Reconnect_Backoff_Retries_On_Unstable_Connection",
         "version":"0.0.0"
      }
   }
]
```

## 發布
<a name="publish"></a>

**「QOS0 (Happy 案例)」**  <a name="MQTT_Publish"></a>
驗證測試中的裝置是否使用 QoS0 或 QoS1 發佈訊息。您也可以在測試設定中設定主題值和承載，來驗證訊息和承載的主題。  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。

```
"tests":[
   {
      "name":"my_mqtt_publish_test",
      "configuration":{
         // optional:
         "EXECUTION_TIMEOUT":"300",  // in seconds
         "TOPIC_FOR_PUBLISH_VALIDATION": "my_TOPIC_FOR_PUBLISH_VALIDATION",
         "PAYLOAD_FOR_PUBLISH_VALIDATION": "my_PAYLOAD_FOR_PUBLISH_VALIDATION",
      },
      "test":{
         "id":"MQTT_Publish",
         "version":"0.0.0"
      }
   }
]
```

**「QOS1 發佈重試：沒有 PUBACK」**  
驗證若代理程式未傳送 PUBACK，測試下的裝置是否重新發佈與 QOS1 一起傳送的訊息。您也可以在測試設定中指定此主題，來驗證訊息的主題。用戶端裝置在重新發佈訊息之前不得中斷連線。此測試也會驗證重新發佈的訊息是否具有與原始訊息相同的封包識別符。測試執行期間，如果裝置失去連線並重新連接，則測試案例將重置而不會故障，並且裝置必須再次執行測試案例步驟。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。建議至少 4 分鐘。

```
"tests":[
   {
      "name":"my_mqtt_publish_retry_test",
      "configuration":{
         // optional:
         "EXECUTION_TIMEOUT":"300",  // in seconds
         "TOPIC_FOR_PUBLISH_VALIDATION": "my_TOPIC_FOR_PUBLISH_VALIDATION",
         "PAYLOAD_FOR_PUBLISH_VALIDATION": "my_PAYLOAD_FOR_PUBLISH_VALIDATION",
      },
      "test":{
         "id":"MQTT_Publish_Retry_No_Puback",
         "version":"0.0.0"
      }
   }
]
```

**「發佈保留的訊息」**  
驗證受測裝置是否會發佈 `retainFlag` 設定為 true 的訊息。您可以在測試設定中設定主題值和承載，來驗證訊息和承載的主題。如果在 PUBLISH 封包中傳送的 `retainFlag` 未設定為 true，測試案例將會失敗。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。若要執行此測試案例，請在 [device role](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-setting-up.html#da-iam-role) (裝置角色) 中新增 `iot:RetainPublish` 動作。

```
"tests":[
   {
      "name":"my_mqtt_publish_retained_messages_test",
      "configuration":{
         // optional:
         "EXECUTION_TIMEOUT":"300",  // in seconds
         "TOPIC_FOR_PUBLISH_RETAINED_VALIDATION": "my_TOPIC_FOR_PUBLISH_RETAINED_VALIDATION",
         "PAYLOAD_FOR_PUBLISH_RETAINED_VALIDATION": "my_PAYLOAD_FOR_PUBLISH_RETAINED_VALIDATION",
      },
      "test":{
         "id":"MQTT_Publish_Retained_Messages",
         "version":"0.0.0"
      }
   }
]
```

**「以使用者屬性進行發佈」**  
驗證受測裝置是否發佈含有正確使用者屬性的訊息。您可以在測試設定中設定名稱/值對來驗證使用者屬性。如果未提供使用者屬性或不相符，測試案例將會失敗。  
*API 測試案例定義：*  
這是僅限 MQTT5 的測試案例。  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。

```
"tests":[
   {
      "name":"my_mqtt_user_property_test",
      "test":{
        "USER_PROPERTIES": [
            {"name": "name1", "value":"value1"},
            {"name": "name2", "value":"value2"}
        ],
        "EXECUTION_TIMEOUT":"300",  // in seconds
      },
      "test":{
         "id":"MQTT_Publish_User_Property",
         "version":"0.0.0"
      }
   }
]
```

## 訂閱
<a name="subscribe"></a>

**「可以訂閱 (Happy 案例)」**  <a name="MQTT_Subscribe"></a>
驗證測試下的裝置是否訂閱 MQTT 主題。您也可以在測試設定中指定此主題，來驗證測試下裝置所訂閱的主題。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。

```
"tests":[
   {
      "name":"my_mqtt_subscribe_test",
      "configuration":{
         // optional:
         "EXECUTION_TIMEOUT":"300",  // in seconds
         "TOPIC_LIST_FOR_SUBSCRIPTION_VALIDATION":["my_TOPIC_FOR_PUBLISH_VALIDATION_a","my_TOPIC_FOR_PUBLISH_VALIDATION_b"]
      },
      "test":{
         "id":"MQTT_Subscribe",
         "version":"0.0.0"
      }
   }
]
```

**「訂閱重試：沒有 SUBACK」**  
驗證測試下的裝置是否重試失敗的 MQTT 主題訂閱。伺服器接著會等待，而且不會傳送 SUBACK。如果用戶端裝置沒有重試訂閱，測試會失敗。用戶端裝置必須使用相同的封包 ID 重試失敗的訂閱。您也可以在測試設定中指定此主題，來驗證測試下裝置所訂閱的主題。測試執行期間，如果裝置失去連線並重新連接，則測試案例將重置而不會故障，並且裝置必須再次執行測試案例步驟。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 4 分鐘。

```
"tests":[
   {
      "name":"my_mqtt_subscribe_retry_test",
      "configuration":{
         "EXECUTION_TIMEOUT":"300",  // in seconds
         // optional:
         "TOPIC_LIST_FOR_SUBSCRIPTION_VALIDATION":["myTOPIC_FOR_PUBLISH_VALIDATION_a","my_TOPIC_FOR_PUBLISH_VALIDATION_b"]
      },
      "test":{
         "id":"MQTT_Subscribe_Retry_No_Suback",
         "version":"0.0.0"
      }
   }
]
```

## Keep-Alive
<a name="keep-alive"></a>

**「Mqtt No Ack PingResp」**  
這個測試案例會驗證，如果待測裝置在未收到 Ping 回應時是否會中斷連線。在此測試案例中，Device Advisor 會封鎖從 傳送的回應， AWS IoT Core 以進行發佈、訂閱和 ping 請求。其也會驗證待測裝置是否中斷與 MQTT 的連線。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。建議使用的逾時值大於 `keepAliveTime` 值的 1.5 倍。  
 此測試的最大值`keepAliveTime`不得超過 230 秒。

```
"tests":[
    {
       "name":"Mqtt No Ack PingResp",
       "configuration": 
          //optional:
          "EXECUTION_TIMEOUT":"306",   // in seconds
       },
       "test":{
          "id":"MQTT_No_Ack_PingResp",
          "version":"0.0.0"
       }
    }
]
```

## 持久性工作階段
<a name="persistent-session"></a>

**「持久性階段作業 (Happy 案例)」**  
此測試案例會驗證裝置與持久性階段作業中斷連結時的行為。此測試案例會檢查裝置是否可以重新連接、恢復其觸發程序主題訂閱而不需明確重新訂閱、接收儲存於主題中的訊息，以及在持久性階段作業期間如預期運作。當此測試案例通過時，表示用戶端裝置能夠以預期的方式與 AWS IoT Core 代理程式維持持久性工作階段。如需 AWS IoT 持久性工作階段的詳細資訊，請參閱[使用 MQTT 持久性工作階段](https://docs.aws.amazon.com/iot/latest/developerguide/mqtt.html#mqtt-persistent-sessions)。  
在此測試案例中，用戶端裝置應在乾淨的階段作業旗標設為 false 下與 AWS IoT Core 連結，並且訂閱主題篩選條件。成功訂閱後，裝置將由 AWS IoT Core Device Advisor 中斷連線。當裝置處於中斷連結的狀態時，QoS 1 訊息承載將儲存在該主題中。Device Advisor 將允許用戶端裝置與測試端點重新連結。此時由於有持久性工作階段，用戶端裝置應恢復其主題訂閱，而不需傳送任何額外的訂閱封包，並從代理程式接收 QoS 1 訊息。重新連結後，如果用戶端裝置傳送額外的 SUBSCRIBE 封包，再次重新訂閱其觸發程序主題，和/或如果用戶端並未收到來自觸發程序主題的儲存訊息，測試案例將會失敗。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為至少 4 分鐘。第一次連線時，用戶端裝置需要明確訂閱之前沒有訂閱的 `TRIGGER_TOPIC`。若要通過測試案例，用戶端裝置必須使用 QoS 1 成功訂閱 `TRIGGER_TOPIC`。重新連結後，用戶端裝置應了解有作用中的持久性工作階段；因此應接受觸發程序主題傳送的已儲存訊息，並針對該特定訊息傳回 PUBACK。

```
"tests":[
   {
      "name":"my_mqtt_persistent_session_happy_case",
      "configuration":{
         //required:
         "TRIGGER_TOPIC": "myTrigger/topic",
         // optional:
         // if Payload not provided, a string will be stored in the trigger topic to be sent back to the client device
         "PAYLOAD": "The message which should be received from AWS IoT Broker after re-connecting to a persistent session from the specified trigger topic.",            
         "EXECUTION_TIMEOUT":"300" // in seconds
      },
      "test":{
         "id":"MQTT_Persistent_Session_Happy_Case",
         "version":"0.0.0"
      }
   }
]
```

**「持久性工作階段到期 - 工作階段到期」**  
此測試案例有助於在已中斷連線的裝置重新連線到過期的持久性工作階段時，驗證裝置行為。工作階段過期後，我們希望裝置透過明確傳送新的 SUBSCRIBE 封包來重新訂閱之前訂閱的主題。  
在第一次連線期間，我們預期測試裝置會與 AWS IoT 代理程式連線，因為其`CleanSession`旗標設為 false 以啟動持久性工作階段。然後，裝置應訂閱觸發程序主題。然後，在成功訂閱和啟動持久性工作階段後， AWS IoT Core Device Advisor 會中斷裝置連線。中斷連線後， AWS IoT Core Device Advisor 會允許測試裝置重新連線至測試端點。此時，當測試裝置傳送另一個 CONNECT 封包時， AWS IoT Core Device Advisor 會傳回 CONNACK 封包，指出持久性工作階段已過期。測試裝置需要正確解譯此封包，並且在持久性工作階段終止時，應再次重新訂閱相同的觸發程序主題。如果測試裝置未重新訂閱其主題觸發程序，則測試案例失敗。為了通過測試，裝置需要了解持久性工作階段已經結束，並在第二次連線對同一個觸發程序主題回傳一個新的 SUBSCRIBE 封包。  
如果此測試案例對於某測試裝置通過，表示該裝置能在持久性工作階段過期時以預期的方式處理重新連線。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為至少 4 分鐘。測試裝置需要明確訂閱之前沒有訂閱的 `TRIGGER_TOPIC`。要通過測試案例，測試裝置必須在 `CleanSession` 旗標設為 false 下傳送 CONNECT 封包，並成功訂閱具有 QoS 1 的觸發程序主題。成功連線後， AWS IoT Core Device Advisor 會中斷裝置連線。中斷連線後， AWS IoT Core Device Advisor 允許裝置重新連線，且裝置預期會重新訂閱相同的 ，`TRIGGER_TOPIC`因為 AWS IoT Core Device Advisor 會終止持久性工作階段。

```
"tests":[
   {
      "name":"my_expired_persistent_session_test",
      "configuration":{
         //required:
         "TRIGGER_TOPIC": "myTrigger/topic",
         // optional:       
         "EXECUTION_TIMEOUT":"300" // in seconds
      },
      "test":{
         "id":"MQTT_Expired_Persistent_Session",
         "version":"0.0.0"
      }
   }
]
```

# 影子
<a name="device-advisor-tests-shadow"></a>

使用這些測試來驗證待測裝置是否正確使用 AWS IoT Device Shadow 服務。如需詳細資訊，請參閱 [AWS IoT Device Shadow 服務](iot-device-shadows.md)。如果這些測試案例是在您的測試套件中設定，則在啟動套件執行時需要提供一個物件。

目前不支援 **MQTT over WebSocket**。

## 發布
<a name="publish"></a>

***「裝置在連接後發佈狀態 (Happy 案例)」***  
驗證裝置是否可以在連線至 後發佈其狀態 AWS IoT Core  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。

```
"tests":[
   {
      "name":"my_shadow_publish_reported_state",
      "configuration": {
         // optional:
         "EXECUTION_TIMEOUT":"300", // in seconds
         "SHADOW_NAME": "SHADOW_NAME",
         "REPORTED_STATE": {
            "STATE_ATTRIBUTE": "STATE_VALUE"
         }
      },
      "test":{
         "id":"Shadow_Publish_Reported_State",
         "version":"0.0.0"
      }
   }
]
```
可以提供 `REPORTED_STATE`，以在您的裝置連接之後，對其確切的影子狀態進行額外驗證。根據預設，此測試案例會驗證您的裝置發佈狀態。  
如果未提供 `SHADOW_NAME`，則測試案例會依預設尋找發佈至未具名 (傳統) 影子類型之主題字首的訊息。如果您的裝置使用具名影子類型，請提供影子名稱。如需詳細資訊，請參閱[在裝置中使用影子](https://docs.aws.amazon.com/iot/latest/developerguide/device-shadow-comms-device.html)。

## 更新
<a name="update"></a>

***「裝置將回報狀態更新為所需狀態 (Happy 案例)」***  
驗證您的裝置是否讀取所有收到的更新訊息，並同步處理裝置的狀態以符合所需的狀態屬性。您的裝置應該在同步處理之後發佈其最新回報狀態。如果您的裝置在執行測試之前已有現有影子，請確定針對測試案例設定的所需狀態，以及現有回報狀態並未符合。您可以識別 Device Advisor 所傳送的影子更新訊息，方法為查看影子文件中的 **ClientToken** 欄位，因為它將是 `DeviceAdvisorShadowTestCaseSetup`。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 2 分鐘。

```
"tests":[
   {
      "name":"my_shadow_update_reported_state",
      "configuration": {
         "DESIRED_STATE": {
            "STATE_ATTRIBUTE": "STATE_VALUE"
         },
         // optional:
         "EXECUTION_TIMEOUT":"300", // in seconds
         "SHADOW_NAME": "SHADOW_NAME"
      },
      "test":{
         "id":"Shadow_Update_Reported_State",
         "version":"0.0.0"
      }
   }
]
```
`DESIRED_STATE` 應該至少有一個屬性和相關聯的值。  
如果未提供 `SHADOW_NAME`，則測試案例會依預設尋找發佈至未具名 (傳統) 影子類型之主題字首的訊息。如果您的裝置使用具名影子類型，請提供影子名稱。如需詳細資訊，請參閱[在裝置中使用影子](https://docs.aws.amazon.com/iot/latest/developerguide/device-shadow-comms-device.html)。

# 任務執行
<a name="device-advisor-tests-job-execution"></a>

**「裝置可以完成任務執行」**  
 此測試案例可協助您驗證裝置是否可以使用 AWS IoT 任務接收更新，並發佈成功更新的狀態。如需 AWS IoT 任務的詳細資訊，請參閱 [ 任務](https://docs.aws.amazon.com//iot/latest/developerguide/iot-jobs.html)。  
 若要成功執行此測試案例，您需要授予[裝置角色](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-setting-up.html#da-iam-role) 兩個預留 AWS 主題。若要訂閱作業活動相關的訊息，請使用 **notify** 和 **notify-next** 主題。您的裝置角色必須將 PUBLISH 動作授予下列主題：  
+ \$1aws/things/**thingName**/jobs/**jobId**/get
+ \$1aws/things/**thingName**/jobs/**jobId**/update
建議您將 SUBSCRIBE 和 RECEIVE 動作授予下列主題：  
+ \$1aws/things/**thingName**/jobs/get/accepted
+ \$1aws/things/**thingName**/jobs/**jobId**/get/rejected
+ \$1aws/things/**thingName**/jobs/**jobId**/update/accepted
+ \$1aws/things/**thingName**/jobs/**jobId**/update/rejected
建議您將 SUBSCRIBE 動作授予下列主題：  
+ \$1aws/things/**thingName**/jobs/notify-next
如需有關這些保留主題的詳細資訊，請參閱[AWS IoT Job](https://docs.aws.amazon.com/iot/latest/developerguide/reserved-topics.html#reserved-topics-job) 的保留主題。  
目前不支援 **MQTT over WebSocket**。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 5 分鐘。我們建議的逾時值為 3 分鐘。根據提供 AWS IoT 的任務文件或來源，調整逾時值 （例如，如果任務需要很長時間才能執行，請定義測試案例的較長逾時值）。若要執行測試，需要有效的 AWS IoT 任務文件或現有的任務 ID。 AWS IoT 任務文件可以 JSON 文件或 S3 連結的形式提供。如果提供 Job 文件，則可選擇性提供作業 ID。如果提供任務 ID，Device Advisor 將在代表您建立 AWS IoT 任務時使用該 ID。如果未提供 Job 文件，您可以提供與執行測試案例位於相同區域的現有 ID。在此情況下，Device Advisor 將在執行測試案例時使用該 AWS IoT 任務。

```
"tests": [
   {
      "name":"my_job_execution",
      "configuration": {
         // optional:
         // Test case will create a job task by using either JOB_DOCUMENT or JOB_DOCUMENT_SOURCE.
         // If you manage the job task on your own, leave it empty and provide the JOB_JOBID (self-managed job task).
         // JOB_DOCUMENT is a JSON formatted string
         "JOB_DOCUMENT": "{
            \"operation\":\"reboot\",
            \"files\" : {
               \"fileName\" : \"install.py\",
               \"url\" : \"${aws:iot:s3-presigned-url:https://s3.amazonaws.com/bucket-name/key}\"
            }
         }",
         // JOB_DOCUMENT_SOURCE is an S3 link to the job document. It will be used only if JOB_DOCUMENT is not provided.
         "JOB_DOCUMENT_SOURCE": "https://s3.amazonaws.com/bucket-name/key",
         // JOB_JOBID is mandatory, only if neither document nor document source is provided. (Test case needs to know the self-managed job task id).
         "JOB_JOBID": "String",
         // JOB_PRESIGN_ROLE_ARN is used for the presign Url, which will replace the placeholder in the JOB_DOCUMENT field
         "JOB_PRESIGN_ROLE_ARN": "String",
         // Presigned Url expiration time. It must be between 60 and 3600 seconds, with the default value being 3600.
         "JOB_PRESIGN_EXPIRES_IN_SEC": "Long"   
         "EXECUTION_TIMEOUT": "300", // in seconds         
      },
      "test": {
         "id": "Job_Execution",
         "version": "0.0.0"
      }
   }
]
```
如需建立和使用任務文件的詳細資訊，請參閱[任務文件](https://docs.aws.amazon.com//iot/latest/developerguide/iot-jobs.html)。

# 許可和政策
<a name="device-advisor-tests-permissions-policies"></a>

您可以使用這些測試，來判斷與裝置憑證相連的政策是否遵循標準最佳實務。

目前不支援 **MQTT over WebSocket**。

**「裝置憑證連接政策不包含萬用字元」**  
 驗證與裝置相關聯的許可政策是否遵循最佳實務，且未授與裝置超過所需的許可。  
*API 測試案例定義：*  
`EXECUTION_TIMEOUT` 的預設值為 1 分鐘。建議設定至少 30 秒的逾時時間。

```
"tests":[
   {
        "name":"my_security_device_policies",
        "configuration": {
            // optional:
            "EXECUTION_TIMEOUT":"60"    // in seconds
        },
        "test": {
            "id": "Security_Device_Policies",
            "version": "0.0.0"
        }
    }
]
```

# 長時間測試
<a name="device-advisor-tests-long-duration"></a>

長時間測試是一款新型測試套件，可監測裝置在長時間運作期間的行為。相較於執行著重於裝置特定行為的個別測試，長時間測試會檢查裝置在其使用壽命內各種實際案例中的行為。Device Advisor 會以最有效率的順序來協調測試。該測試會產生結果和日誌，其中包括一份摘要日誌，詳載有關裝置效能的實用指標。

## MQTT 長時間測試案例
<a name="long-duration-test-case"></a>

在 MQTT 長時間測試案例中，起初會以 MQTT Connect、訂閱、發佈和重新連線等簡易案例的情境來觀察裝置行為。然後，在多種複雜的故障情境下觀察裝置，例如 MQTT 重新連線輪詢、長時間伺服器中斷連線以及間歇性連線。

## MQTT 長時間測試案例執行流程
<a name="long-duration-test-case-execution-flow"></a>

MQTT 長時間測試案例的執行分為三個階段：

![\[顯示基本測試執行、進階測試執行和其他執行時間的「MQTT 長期測試執行」。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/mqtt-execution-flow.png)


### 基本測試執行
<a name="basic-tests-execution"></a>

此階段的測試案例會以並行方式執行簡易測試。測試將驗證裝置是否依據在組態中所做的選擇進行操作。

根據所選操作，一組基本測試可以包括以下內容：

#### CONNECT
<a name="basic-tests-execution-connect"></a>

此案例會驗證裝置是否能夠與代理程式成功建立連線。

![\[基本連線流程，其中包含傳送 CONNECT 訊息的裝置，而 Broker 會以成功的傳回碼回應 CONNACK 訊息。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/basic-connect.png)


#### 發佈
<a name="basic-tests-execution-publish"></a>

此案例會驗證裝置是否成功針對代理程式進行發佈。

##### QoS 0
<a name="publish-qos0"></a>

此測試案例會驗證裝置在以 QoS 0 發佈期間是否成功將 `PUBLISH` 訊息傳送至代理程式。測試不會等待裝置接收關於 `PUBACK` 的訊息。

![\[PUBLISH QoS 0 流程，其中包含傳送 QoS 0 層級之 PUBLISH 訊息的裝置。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/Qos0.png)


##### QoS 1
<a name="publish-qos1"></a>

在此測試案例中，裝置預計將向具有 QoS 1 的代理程式傳送兩條 `PUBLISH` 訊息。在第一條 `PUBLISH` 訊息之後，代理程式會等待最多 15 秒，然後再回應。裝置必須在 15 秒的時段中重新嘗試具有相同封包識別碼的原始 `PUBLISH` 訊息。在此情況下，代理程式會以 `PUBACK` 訊息回應，且測試會進行驗證。如果裝置沒有重試 `PUBLISH`，則原始 `PUBACK` 會傳送到裝置，並將測試標記為**附帶警告的通過**，同時提供系統訊息。測試執行期間，如果裝置失去連線並重新連接，則測試案例將重置而不會故障，並且裝置必須再次執行測試案例步驟。

![\[PUBLISH QoS 1 流程，其中包含傳送 QoS 1 層級的 PUBLISH 訊息的裝置，以及與代理程式的多個互動。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/Qos1.png)


#### 訂閱
<a name="basic-tests-execution-subscribe"></a>

此案例會驗證裝置是否成功針對代理程式進行訂閱。

##### QoS 0
<a name="subscribe-qos0"></a>

此測試案例會驗證裝置在以 QoS 0 訂閱期間是否成功將 `SUBSCRIBE` 訊息傳送至代理程式。測試不會等待裝置收到 SUBACK 訊息。

![\[SUBSCRIBE QoS 0 流程，其中包含傳送 QoS 0 層級之 SUBSCRIBE 訊息的裝置，以及以 SUBACK 訊息和成功 QoS 上限 0 程式碼回應的代理程式。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/subscribe-Qos0.png)


##### QoS 1
<a name="subscribe-qos1"></a>

在此測試案例中，裝置預計將向具有 QoS 1 的代理程式傳送兩條 `SUBSCRIBE` 訊息。在第一條 `SUBSCRIBE` 訊息之後，代理程式會等待最多 15 秒，然後再回應。裝置必須在 15 秒的時段中重新嘗試具有相同封包識別碼的原始 `SUBSCRIBE` 訊息。在此情況下，代理程式會以 `SUBACK` 訊息回應，且測試會進行驗證。如果裝置沒有重試 `SUBSCRIBE`，則原始 `SUBACK` 會傳送到裝置，並將測試標記為**附帶警告的通過**，同時提供系統訊息。測試執行期間，如果裝置失去連線並重新連接，則測試案例將重置而不會故障，並且裝置必須再次執行測試案例步驟。

![\[SUBSCRIBE QoS 1 流程，其中包含傳送具有 QoS 1 層級之 SUBSCRIBE 訊息的裝置，以及與代理程式的多個互動。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/subscribe-Qos1.png)


#### 重新連線
<a name="basic-tests-execution-reconnect"></a>

此案例會驗證裝置在從成功的連線中斷之後，是否成功與代理程式重新連線。如果先前已在測試套件期間連線多次，則 Device Advisor 不會中斷裝置連線。相反，它會將測試標記為**通過**。

![\[DUT 與代理程式之間的 RECONNECT 流程。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/reconnect.png)


### 進階測試執行
<a name="advanced-tests-execution"></a>

此階段的測試案例會以序列方式執行較複雜的測試，以驗證裝置是否遵循最佳實務。這些進階測試可供選擇，若無需要可以選擇不執行。根據案例需求，每項進階測試都各有專屬的逾期值。

#### RETURN PUBACK ON QoS 1 SUBSCRIPTION
<a name="advanced-tests-execution-return-puback"></a>

**注意**  
只有當您的裝置能夠執行 QoS 1 訂閱時，才可選取此案例。

此案例會驗證在裝置訂閱主題並收到來自代理人的 `PUBLISH` 訊息之後，是否會傳回 `PUBACK` 訊息。

![\[DUT 與代理程式之間的 RETURN PUBACK ON QoS 1 SUBSCTIPTION 流程。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/return-puback.png)


#### RECEIVE LARGE PAYLOAD
<a name="advanced-tests-execution-receive-large-payload"></a>

**注意**  
只有當您的裝置能夠執行 QoS 1 訂閱時，才可選取此案例。

此案例會驗證裝置在收到具有大型承載的 QoS 1 主題的代理程式發出的 `PUBLISH` 訊息後，是否會以 `PUBACK` 訊息進行回應。可以使用 `LONG_PAYLOAD_FORMAT` 選項設定預期承載的格式。

![\[DUT 與代理程式之間的接收大型 PAYLOAD 流程。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/large-payload.png)


#### 持久性工作階段
<a name="advanced-tests-execution-persistent-session"></a>

**注意**  
只有當您的裝置能夠執行 QoS 1 訂閱且可以維持持久性工作階段時，才可選取此案例。

此案例會驗證維持持久性工作階段時的裝置行為。測試會驗證是否滿足下列條件：
+ 裝置連線至具有作用中 QoS 1 訂閱且已啟用持久性工作階段的代理程式。
+ 裝置在工作階段期間成功中斷與代理程式的連線。
+ 裝置會重新連線至代理程式，並繼續訂閱其觸發主題，而不會明確重新訂閱這些主題。
+ 裝置成功接收代理程式為其訂閱主題所儲存的訊息，並如預期執行。

 如需 AWS IoT 持久性工作階段的詳細資訊，請參閱[使用 MQTT 持久性工作階段](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html#mqtt-persistent-sessions)。

![\[DUT 和代理程式之間的 PERSISTENT SESSION 流程。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/persistent-session.png)


#### Keep-Alive
<a name="advanced-tests-execution-keep-alive"></a>

此案例會驗證裝置在未收到代理程式的 Ping 回應後是否能成功中斷連線。必須為連線設定有效的保持連線計時器。在此測試中，代理程式會封鎖所有針對 `PUBLISH`、`SUBSCRIBE` 和 `PINGREQ` 訊息而傳送的回應。其也會驗證待測裝置是否中斷與 MQTT 的連線。

![\[DUT 與代理程式之間的 KEEP ALIVE 流程。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/keep-alive.png)


#### INTERMITTENT CONNECTIVITY
<a name="advanced-tests-execution-intermittent-connectivity"></a>

此案例會驗證代理程式在隨機間隔內與裝置中斷連線之後，裝置是否可以恢復與代理程式的連線。

![\[DUT 與代理程式之間的 INTERMITTENT CONNECTIVITY 流程。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/intermittent.png)


#### RECONNECT BACKOFF
<a name="advanced-tests-execution-reconnect-backoff"></a>

此案例會驗證代理程式多次中斷連線後，裝置是否會實作退避機制。Device Advisor 會將退避類型報告為指數、抖動、線性或常數。您可以使用 `BACKOFF_CONNECTION_ATTEMPTS` 選項來設定退避嘗試次數。預設值為 5。可以設定介於 5 到 10 之間的值。

若要通過此測試，建議對受測裝置實作[指數退避和抖動](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)機制。

![\[DUT 和代理程式之間的 RECONNECT BACKOFF 流程。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/reconnect-backoff.png)


#### 長時間伺服器中斷連線
<a name="advanced-tests-execution-longserver-disconnect"></a>

此案例會驗證在代理程式長時間 (最多 120 分鐘) 中斷與裝置的連線之後，裝置是否可以成功重新連線。可以使用 `LONG_SERVER_DISCONNECT_TIME` 選項來設定伺服器中斷連線的時間。預設值為 120 分鐘。此值可以設定的範圍介於 30 至 120 分鐘。

![\[DUT 與代理程式之間的 LONG SERVER DISCONNECT 流程。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/longserver-disconnect.png)


### 額外執行時間
<a name="additional-execution-time"></a>

額外執行時間是指測試從完成上述所有測試之後到結束測試案例之前所等待的時間。客戶可使用此額外時段來監控裝置並記錄裝置與代理程式的所有通訊。可以使用 `ADDITIONAL_EXECUTION_TIME` 選項來設定額外執行時間。此選項依預設為 0 分鐘，可設定的範圍介於 0 到 120 分鐘。

## MQTT 長時間測試組態選項
<a name="long-duration-test-case-config-options"></a>

為 MQTT 長時間測試提供的所有組態選項均非強制性。下列選項可供使用：

**操作**  
裝置執行的操作清單，例如 `CONNECT`、`PUBLISH` 和 `SUBSCRIBE`。測試案例會依據指定的操作來執行情境案例。系統會將未指定的操作假設為有效。  

```
{                                
"OPERATIONS": ["PUBLISH", "SUBSCRIBE"]
//by default the test assumes device can CONNECT   
}
```

**案例**  
根據所選操作，測試案例會執行情境案例來驗證裝置行為。案例有兩種類型：  
+ **基本案例**屬於簡易測試，用於驗證裝置是否可以執行在組態中選擇的操作。這些條件會根據組態中指定的操作預先選取。組態中不再需要輸入。
+ **進階案例**是對裝置執行較複雜的情境案例，以驗證裝置在真實世界條件下是否遵循最佳實務。這些選項均非強制性質，可以作為案例陣列傳遞給測試套件的組態輸入項。

```
{                                
    "SCENARIOS": [      // list of advanced scenarios
                "PUBACK_QOS_1",
                "RECEIVE_LARGE_PAYLOAD",
                "PERSISTENT_SESSION",
                "KEEP_ALIVE",
                "INTERMITTENT_CONNECTIVITY",
                "RECONNECT_BACK_OFF",
                "LONG_SERVER_DISCONNECT"
    ]  
}
```

**BASIC\$1TESTS\$1EXECUTION\$1TIME\$1OUT:**  
測試案例等待所有基本測試完成的時間上限。預設值為 60 分鐘。此值可以設定的範圍介於 30 至 120 分鐘。

**LONG\$1SERVER\$1DISCONNECT\$1TIME:**  
在「長時間伺服器中斷連線」測試期間，測試案例中斷並恢復與裝置連線所花費的時間。預設值為 60 分鐘。此值可以設定的範圍介於 30 至 120 分鐘。

**ADDITIONAL\$1EXECUTION\$1TIME:**  
若設定此選項，系統會在完成所有測試後提供一個時段，用以監控裝置與代理程式之間的事件。預設值為 0 分鐘。此值可以設定的範圍介於 0 至 120 分鐘。

**BACKOFF\$1CONNECTION\$1ATTEMPTS:**  
此選項可設定測試案例中斷與裝置連線的次數。重新連線退避測試會使用此功能。預設值為 5 次嘗試。此值可以設定的範圍介於 5 至 10 分鐘。

**LONG\$1PAYLOAD\$1FORMAT:**  
當測試案例發佈到裝置訂閱的 QoS 1 主題時，裝置所期望的訊息承載格式。

**API 測試案例定義：**

```
{                                
"tests":[
   {
      "name":"my_mqtt_long_duration_test",
      "configuration": {
         // optional
         "OPERATIONS": ["PUBLISH", "SUBSCRIBE"], 
         "SCENARIOS": [      
            "LONG_SERVER_DISCONNECT", 
            "RECONNECT_BACK_OFF",
            "KEEP_ALIVE",
            "RECEIVE_LARGE_PAYLOAD",
            "INTERMITTENT_CONNECTIVITY",
            "PERSISTENT_SESSION",   
         ],
         "BASIC_TESTS_EXECUTION_TIMEOUT": 60, // in minutes (60 minutes by default)
         "LONG_SERVER_DISCONNECT_TIME": 60,   // in minutes (120 minutes by default)
         "ADDITIONAL_EXECUTION_TIME": 60,     // in minutes (0 minutes by default)
         "BACKOFF_CONNECTION_ATTEMPTS": "5",
         "LONG_PAYLOAD_FORMAT":"{"message":"${payload}"}"
      },
      "test":{
         "id":"MQTT_Long_Duration",
         "version":"0.0.0"
      }
   }
 ]      
}
```

## MQTT 長時間測試案例摘要日誌
<a name="long-duration-test-case-summary-log"></a>

MQTT 長時間測試案例的執行時間較常規測試案例更長。會提供個別摘要日誌，其中列出執行期間的裝置連線、發佈和訂閱等重要事件。詳細資訊包括已測試的項目、未測試的項目以及失敗的項目。測試功能會在日誌結尾列出測試案例執行期間所發生全部事件的摘要。其中包含：
+ *在裝置上設定的保持連線計時器。*
+ *裝置上設定的持久性工作階段旗標。*
+ *裝置在測試執行期間的連線次數。*
+ *裝置重新連線退避類型 (若已通過重新連線退避測試的驗證)。*
+ *在測試案例執行期間作為裝置發佈目標的主題。*
+ *裝置在測試案例執行期間訂閱的主題。 *