

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

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

[Device Advisor](https://aws.amazon.com/iot-core/features/) 是一种基于云的完全托管式测试功能，用于在设备软件开发过程中验证物联网设备。Device Advisor 提供预先构建的测试，在将设备部署到生产环境之前 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) 和物联网[Jobs](https://docs.aws.amazon.com//iot/latest/developerguide/iot-jobs.html)。您还可以下载已签名的资格报告，以提交 AWS 合作伙伴网络，让您的设备符合 [AWS 合作伙伴设备目录](https://devices.amazonaws.com/)的要求，而无需将您的设备发送到其中，更无需等待它进行测试。

**注意**  
Device Advisor 在 us-east-1、us-west-2、ap-northeast-1、eu-west-1 区域中获得支持。  
设备顾问支持使用 MQTT 和 MQTT over S WebSocket ecure (WSS) 协议发布和订阅消息的设备和客户端。所有协议都支持 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 访问设备顾问。准备好测试您的设备时，请在设备顾问端点注册设备 AWS IoT Core 并配置设备软件。然后选择预构建的测试，加以配置，在您的设备上运行测试，随之获取测试结果以及详细的日志或资格报告。

设备顾问是 AWS 云端的测试端点。若要测试设备，您可以配置设备使其连接到 Device Advisor 提供的测试端点。将设备配置为连接到测试端点后，您可以访问设备顾问的控制台或使用 AWS 软件开发工具包选择要在设备上运行的测试。然后，Device Advisor 会管理测试的整个生命周期，包括资源调配、测试过程调度、管理状态机、记录设备行为、记录结果并以测试报告的形式提供最终结果。

**TLS 协议**

传输层安全性协议（TLS）用于加密互联网等不安全的网络上的机密数据。TLS 协议是安全套接字层（SSL）协议的后继协议。

Device Advisor 支持以下 TLS 协议：
+ TLS 1.3（建议）
+ TLS 1.2

**协议、端口映射和身份验证**

设备或客户端使用设备通信协议通过设备端点连接到消息代理。下表列出了 Device Advisor 端点支持的协议以及使用的身份验证方法和端口。


**协议、身份验证和端口映射**  

| 协议 | 支持的操作 | 身份验证 | 端口： | ALPN 协议名称 | 
| --- | --- | --- | --- | --- | 
| MQTT 结束了 WebSocket | 发布、订阅 | Signature Version 4 | 443 | 不适用 | 
| MQTT | 发布、订阅 | X.509 客户端证书 | 8883 | `x-amzn-mqtt-ca` | 
| MQTT | 发布、订阅 | X.509 客户端证书 | 443 | 不适用 | 

**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 之前，请完成以下任务：

## 创建物联网事物
<a name="da-create-thing-certificate"></a>

首先，创建一个物联网事物并为该事物附加证书。有关如何创建事物的教程，请参阅[创建事物对象](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 账户 您用于设备顾问测试的。

1. 在左侧导航窗格中，选择 **Policies**（策略）。

1. 选择**创建策略**。

1. 在 **Create Policy**（创建策略）下，执行以下操作。

   1. 对于**服务**，请选择 **IoT**。

   1. 在**操作**下，执行以下操作之一：
      + （建议）根据您在上一节中创建的物联网事物或证书所附的策略选择操作。
      + 在**筛选操作**框中搜索以下操作并选择它们：
        + `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 编辑器中指定**区域**、**账户 ID** 和**客户端 ID**。
         + 手动输入要用来运行测试用例的物联网主题的 Amazon 资源名称 (ARNs)。

      1. 选择**添加**。

      1. 选择**为接收及另一个操作指定主题资源 ARN**。

      1. 选择**添加 ARN**，然后执行以下任一操作：
**注意**  
*主题名称*是设备向其发布消息的 MQTT 主题。
         + 在可视化 ARN 编辑器中指定**区域**、**账户 ID** 和**主题名称**。
         + 手动输入要用来运行测试用例的 IoT 主题。 ARNs 

      1. 选择**添加**。

      1. 选择**为订阅操作指定主题筛选条件资源 ARN**。

      1. 选择**添加 ARN**，然后执行以下任一操作：
**注意**  
*主题名称*是您的设备订阅的 MQTT 主题。
         + 在可视化 ARN 编辑器中指定**区域**、**账户 ID** 和**主题名称**。
         + 手动输入要用来运行测试用例的 IoT 主题。 ARNs 

      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. 选择**创建角色**。

## 为 IAM 用户创建自定义托管策略来使用设备顾问
<a name="da-managed-policy"></a>

1. 导航到 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 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. 输入**名称**和**描述**。

1. 选择**创建策略**。

## 创建 IAM 用户来使用 Device Advisor。
<a name="da-iam-user"></a>

**注意**  
我们建议您创建一个要在运行 Device Advisor 测试时使用的 IAM 用户。由管理员用户运行 Device Advisor 测试可能会带来安全风险，因此建议不要这样做。

1. 导航到 IAM 控制台，[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)如果出现提示，请输入您的 AWS 证书进行登录。

1. 在左侧导航窗格中，选择 **Users**（用户）。

1. 选择**添加用户**。

1. 输入**用户名称**。

1. 如果用户想在 AWS 外部进行交互，则需要编程访问权限 AWS 管理控制台。授予编程访问权限的方式取决于正在访问的用户类型 AWS。

   要向用户授予编程式访问权限，请选择以下选项之一。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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 用户必须具有必要的权限。 CloudWatch 如果您向 IAM 用户附加必要的权限策略，设备顾问还将向 Amazon 发布日志。

## 配置您的设备
<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 以上 WebSocket 客户：

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

要一次运行一个测试套件，请选择账户级端点。运行以下命令获取账户级别端点：

```
aws iotdeviceadvisor get-endpoint
```

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

本教程可帮助您开始使用 AWS IoT Core Device Advisor 控制台。Device Advisor 提供了一些特征，如必需的测试和签名的资格报告等。您可以使用这些测试和报告来确定设备的资格并在 [AWS 合作伙伴设备目录](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) 中概述的步骤。

**注意**  
以下各项支持设备顾问 AWS 区域：  
美国东部（弗吉尼亚州北部）
美国西部（俄勒冈）
亚太地区（东京）
欧洲地区（爱尔兰）

**开始使用**

1. 在 [AWS IoT 控制台的](https://console.aws.amazon.com//iot)导航窗格中的**测试**下，选择 **Device Advisor**。然后，选择控制台上的**开始演练**按钮。  
![\[Device Advisor 是一项针对物联网设备的完全托管测试功能，用于验证与物联网设备的安全交互 AWS IoT Core、识别软件问题并获取测试结果。\]](http://docs.aws.amazon.com/zh_cn/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)。查看**工作原理**下的信息后，选择**下一步**。  
![\[测试物联网设备连接的步骤：选择协议、创建测试套件、配置设备设置。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-gs1.png)

1.  在**步骤 1：选择协议**中，从列出的选项中选择协议。然后选择**下一步**。  
![\[设备顾问界面显示了选择用于测试物联网设备的通信协议（MQTT 3.1.1、MQTT 3.1.1 以上 WebSocket、MQTT 5、MQTT 5 以上） WebSocket的选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-protocol.png)

1. 在 **Step 2**（步骤 2）中，您可以创建和配置自定义测试套件。自定义测试套件必须拥有至少一个测试组，并且每个测试组必须拥有至少一个测试用例。我们为您添加了 **MQTT Connect** 测试使用案例，以便您能开始操作。

   选择**测试套件属性**。  
![\[Device Advisor 中的“创建测试套件”屏幕，用户可以在其中创建和配置测试组和测试案例，以使用 MQTT 协议测试物联网设备。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-test-suite-create.png)

   创建测试套件时需提供测试套件属性。您可以配置如下套件级属性：
   + **测试套件名称**：输入测试套件的名称。
   + **超时**（可选）：当前测试套件中每个测试用例的超时（以秒为单位）。如果您未指定超时值，则将使用默认值。
   + **标签**（可选）：向测试套件添加标签。

   完成后，选择 **Update properties**（更新属性）。  
![\[用于更新测试套件属性的表单，包括名称、超时和添加标签的功能。包含“更新属性”按钮。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-test-suite-properties.png)

1. （可选）要更新测试套件组配置，请选择测试组名称旁的**编辑**按钮。
   + **名称**：输入测试套件组的自定义名称。
   + **超时**（可选）：当前测试套件中每个测试用例的超时（以秒为单位）。如果您未指定超时值，则将使用默认值。

   完成后，选择**完成**以继续。  
![\[显示一个名为“Test group 1”的测试组，其中包含配置超时和添加更多测试组的选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-test-suite-config.png)

1. （可选）要更新测试用例的测试用例配置，请选择测试用例名称旁边的**编辑**按钮。
   + **名称**：输入测试套件组的自定义名称。
   + **超时**（可选）：所选测试使用案例的超时（以秒为单位）。如果您未指定超时值，则将使用默认值。

   完成后，选择**完成**以继续。  
![\[“创建测试套件”界面，显示了配置测试套件、测试组以及各个测试案例以测试物联网设备的选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-test-case-config.png)

1. （可选）要向测试套件添加更多测试组，请选择**添加测试组**，然后按照步骤 5 中的说明进行操作。

1. （可选）要添加更多测试使用案例，请将**测试使用案例**部分中的测试使用案例拖到您的任何测试组中。  
![\[“创建测试套件”界面，用户可以在其中创建和配置测试组和测试案例，以使用 MQTT 协议测试物联网设备。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-drag.png)

1. 您可以更改测试组和测试使用案例的顺序。要进行更改，请在列表中向上或向下拖动列出的测试使用案例。Device Advisor 按照您列出的测试顺序运行测试。

   配置测试套件后，选择 **Next**（下一步）。

1. 在**步骤 3** 中，选择要使用设备顾问进行测试 AWS IoT 的事物或证书。如果您没有任何现有的事物或证书，请参阅[设置](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-setting-up.html)。  
![\[配置选项，其中包括选择协议、创建测试套件、配置设备设置以及查看测试运行和结果。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-device-settings.png)

1. 您可以配置设备角色，设备顾问使用该角色代表您的测试设备执行 AWS IoT MQTT 操作。仅对于 **MQTT 连接**测试使用案例，自动选择**连接**操作。这是因为设备角色需要此权限才能运行测试套件。对于其它测试使用案例，将选择相应的操作。

   为每个选定的操作提供资源值。例如，对于**连接**操作，提供客户端 ID，您的设备使用该 ID 连接到 Device Advisor 端点。您可以使用逗号分隔的值提供多个值，并使用通配符（\$1）作为值的前缀。例如，要为任何以 `MyTopic` 开头的主题提供发布权限，请输入 **MyTopic\$1** 作为资源值。  
![\[设备顾问界面，您可以在其中选择设备角色并定义连接、发布、订阅和管理 MQTT 主题和客户端的权限。 IDs\]](http://docs.aws.amazon.com/zh_cn/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_cn/iot/latest/developerguide/images/da-console-select-device-role.png)

   使用提供的两个选项之一配置设备角色，然后选择**下一步**。

1. 在**测试端点**部分中，选择最适合您的使用案例的端点。要使用相同的测试套件同时运行多个测试套件 AWS 账户，请选择**设备级端点**。要一次运行一个测试套件，请选择**账户级端点**。  
![\[为测试选择账户级端点或设备级端点的选项，提供了端点 URL 和“下一步”按钮。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-endpoint.png)

1. **步骤 4** 显示了所配置的所选测试设备、测试端点、测试套件和测试设备角色的概览。要对某个部分进行更改，请对于要编辑的部分选择**编辑**按钮。确认测试配置后，选择**运行**以创建测试套件并运行测试。
**注意**  
为了获得最佳结果，您可以在启动套件运行之前，将选定的测试设备连接到 Device Advisor 测试端点。我们建议您为设备建立一个机制，以便每五秒尝试连接到测试端点一次，最多持续一到两分钟。  
![\[设备配置控制台，显示了设备角色详细信息、测试端点以及取消、返回或运行选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-device-review.png)  
![\[设备配置控制台，显示了设备角色详细信息、测试端点以及取消、返回或运行选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-device-review-contd.png)

1. 在导航窗格的**测试**下的，选择 **Device Advisor**，然后选择**测试运行和结果**。选择测试套件运行以查看其运行详细信息和日志。  
![\[表示正在对设备 “” MyThing 进行 MQTT 3.1.1 测试的测试套件接口。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-console-runs-results.png)

1. 要访问该套件的 Amazon CloudWatch 日志，请运行：
   + 选择 “**测试套件** CloudWatch 日志” 以查看测试套件运行的日志。
   + 为任何**测试用例选择测试用例日志**，以查看特定于测试用例的 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 SDK 示例：

```
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` 字段，并在根组中看到测试使用案例定义。您可以使用它们 IDs 来运行测试套件定义的子集。

Java SDK 示例：

```
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 操作提供任何参数来选择账户级端点。

SDK 示例：

```
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 而不是 WebSocket 客户，请使用`deviceRoleArn`来运行测试套件。如果指定的角色与在测试套件定义中指定的角色不同，则指定的角色将覆盖定义的角色。

对于 `.parallelRun()`，如果通过一个 AWS 账户使用设备级端点并行运行多个测试套件，则使用 `true`。

SDK 示例：

```
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 检查其进度及结果。

SDK 示例：

```
// 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 操作定期检查套件运行状态，如上一节所示。

SDK 示例：

```
// 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 秒，请再次调用该 API 操作以检索新的有效 URL。

SDK 示例：

```
// 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_cn/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_cn/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**（下一步）。  
![\[“配置测试套件”页面，其中显示了创建测试套件以及测试组和测试案例以测试物联网设备的步骤。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-configure-test-suite.png)

1. 选择**测试套件属性**。创建测试套件时，您必须创建测试套件属性。  
![\[“配置测试套件”界面，其中显示了创建测试组及添加测试案例以测试物联网设备功能的选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-test-suite-properties.png)

   在 **Test suite properties**（测试套件属性）项下，请填写以下内容：
   + **Test suite name**（测试套件名称）：您可以使用自定义名称创建套件。
   + **超时**（可选）：当前测试套件中每个测试使用案例的超时时间（以秒为单位）。如果您未指定超时值，则将使用默认值。
   + **标签**（可选）：向测试套件添加标签。  
![\[名为“测试套件属性”的窗口，显示了用于为 Device Advisor 演示套件指定测试套件名称、超时和自定义标签的字段。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-test-suite-properties-1.png)

   完成后，选择 **Update properties**（更新属性）。

1. 要修改组级别配置，请在 `Test group 1` 下，选择 **Edit**（编辑）。然后，输入**名称**为组指定一个自定义名称。

   或者，您也可以在所选的测试组下输入**超时**值（以秒为单位）。如果您未指定超时值，则将使用默认值。  
![\[“配置测试套件”界面，用于创建测试组和测试案例来验证物联网设备功能。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-edit-test-group.png)

   选择**完成**。

1. 从**测试使用案例**中拖动一个可用的测试使用案例加入测试组。  
![\[Device Advisor 中用于创建测试套件的配置界面，其中提供了添加测试组和测试案例以测试物联网设备的选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-configure-test-suite-step5.png)

1. 要修改您添加到测试组的测试使用案例级别配置，请选择**编辑**。然后，输入**名称**为组指定一个自定义名称。

   或者，您也可以在所选的测试组下输入**超时**值（以秒为单位）。如果您未指定超时值，则将使用默认值。  
![\[测试套件配置界面，其中提供了配置测试组、测试案例、超时设置和起点以执行测试套件的选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-edit-test-case.png)

   选择**完成**。
**注意**  
要向测试套件添加更多测试组，请选择 **Add test group**（添加测试组）。按照上述步骤创建和配置更多的测试组，或将更多测试使用案例添加到一个或多个测试组。可以通过选择并拖动测试使用案例到目标位置来重新排序测试组和测试使用案例。Device Advisor 将按照定义的测试组和测试用例顺序运行测试。

1. 选择**下一步**。

1. 在**步骤 3** 中，配置设备顾问将使用该角色代表您的测试设备执行 AWS IoT MQTT 操作。

   如果您仅在**步骤 2**中选择 **MQTT 连接**测试使用案例，将自动检查**连接**操作，因为运行此测试套件需要对设备角色具有该权限。如果您选择了其他测试使用案例，将检查相应的所需操作。确保提供了每个操作的资源值。例如，对于**连接**操作，提供设备将连接到 Device Advisor 端点的客户端 id。您可以通过使用逗号分隔值来提供多个值，也可以使用通配符 (\$1) 字符提供前缀值。例如，为任何 `MyTopic` 开头的主题提供发布权限，您可以将“`MyTopic*`”作为资源值。  
![\[Device Advisor 中用于创建测试套件的“选择设备角色”步骤，其中提供了创建新角色或选择现有角色的选项，以及用于指定角色名称、权限和资源详细信息的字段。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-connect-role.png)

   如果您之前已经创建了设备角色，您希望使用该角色，请选择 **Select an existing role**（选择现有角色）然后在 **Select role**（选择角色）下面选择您的设备角色。  
![\[用于为 Device Advisor 测试选择设备角色的页面，其中提供了创建新角色或选择现有角色的选项。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-existing-role.png)

   使用提供的两个选项之一配置设备角色，然后选择 **Next**（下一步）。

1. 在**步骤 4**中，请确保每个步骤中提供的配置准确无误。要编辑为特定步骤提供的配置，请选择 **Edit**（编辑）用于相应的步骤。

   验证配置后，选择 **Create test suite**（创建测试套件）。

   测试套件应能成功创建，并且您将被重定向到 **Test suite**（测试套件）页面，您可以在其中查看已创建的所有测试套件。

   如果测试套件创建失败，请确保已按照之前的说明配置测试套件、测试组、测试使用案例和设备角色。

## 启动测试套件运行
<a name="device-advisor-console-run-test-suite"></a>

1. 在 [AWS IoT 控制台](https://console.aws.amazon.com//iot)的导航窗格中，展开**测试**、**Device Advisor**，然后选择**测试套件**。

1. 选择要查看其测试套件详细信息的测试套件。  
![\[显示名为“Device advisor demo suite”的单个测试套件，创建时间是 2021 年 5 月 11 日。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-test-suites.png)

   测试套件详细信息页面将显示与测试套件相关的所有信息。

1. 选择 **Actions**（操作），然后选择 **Run test suite**（运行测试套件）。  
![\[演示套件页面，其中有一个“运行测试套件”按钮，以及显示之前没有运行过测试套件的空活动日志。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-run-test-suites.png)

1. 在 “**运行配置**” 下，您需要选择要使用设备顾问进行测试 AWS IoT 的事物或证书。如果您没有任何现有内容或证书，请先[创建 AWS IoT Core 资源](device-advisor-setting-up.md)。

   在**测试端点**中，选择最适合您使用案例的端点。如果您计划将来使用同一个 AWS 账户同时运行多个测试套件，请选择**设备级端点**。否则，如果您计划一次只运行一个测试套件，请选择**账户级别端点**。

   使用选定的 Device Advisor 的测试端点配置测试设备。

   选择事物或证书以及 Device Advisor 端点后，选择**运行测试**。  
![\[在上运行测试套件的配置 AWS IoT Core，允许您选择测试设备（东西或证书），选择测试端点（账户级别或设备级别），还可以选择添加标签。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-choose-thing-certificate.png)

1. 选择顶部广告条的 **Go to result**（转到结果），以查看测试运行详细信息。  
![\[状态为“待处理”、名为“Device Advisor demo suite”的自定义测试套件的详细信息。\]](http://docs.aws.amazon.com/zh_cn/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 run and results**（测试运行和结果）。

1. 选择要停止的正在进行的测试套件。  
![\[Device Advisor 控制台上测试运行的结果。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-test-suite-to-stop.PNG)

1. 选择 **Actions**（操作），然后选择 **Stop test suite**（停止测试套件）。  
![\[Device Advisor 控制台上测试运行的结果。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-stop-test-suite.PNG)

1. 此清理过程可能需要几分钟才能完成。清理程序运行时，测试运行状态将为 `STOPPING`。等待清理程序完成，并等待测试套件状态更改为 `STOPPED` 状态，然后再开始运行新套件。  
![\[Device Advisor 控制台上测试运行的停止结果。\]](http://docs.aws.amazon.com/zh_cn/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 run and results**（测试运行和结果）。

   本页面将显示：
   + IoT 事物的数量
   + IoT 证书的数量
   + 当前运行的测试套件数
   + 所有已创建的测试套件运行

1. 选择要查看其运行详细信息和日志的测试套件。  
![\[测试运行和结果部分，其中显示了当前正在进行的名为“Device Advisor demo suite”的测试套件的详细信息。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-test-suite-run.png)

   运行摘要页面显示当前测试套件运行的状态。此页面每 10 秒自动刷新一次。我们建议您为设备建立一个机制，以便每五秒便尝试一次连接到测试端点，每次持续一到两分钟。然后，您能够以自动的方式按顺序运行多个测试使用案例。  
![\[测试案例日志，显示了未出现任何系统消息的成功 MQTT Connect 测试。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/da-run-summary.png)

1. 要访问测试套件运行的 CloudWatch 日志，请选择**测试套件日志**。

   要访问任何测试用例的 CloudWatch 日志，请选择**测试用例日志**。

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_cn/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_cn/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_cn/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_cn/iot/latest/developerguide/images/configure-ld-ts.png)

1. （可选）输入 Device Advisor 必须等待基本测试完成的最长时间。选择 **Save**（保存）。  
![\[Device Advisor 控制台“基本测试”的“超时 - 可选”框。\]](http://docs.aws.amazon.com/zh_cn/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 界面，其中您可以在物联网设备上配置和运行测试。\]](http://docs.aws.amazon.com/zh_cn/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_cn/iot/latest/developerguide/images/devicerole-ld-ts.png)

1.  查看在此步骤之前创建的所有配置，然后选择 **Create test suite**（创建测试套件）。  
![\[“查看”页面，您可以在其中查看 Device Advisor 配置的所有详细信息。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/finalconfigure1-ld-ts.png)  
![\[配置页面，您可以在其中查看 Device Advisor 的所有详细信息。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/finalconfigure2-ld-ts.png)

1.  创建的测试套件位于 **Test suites**（测试套件）部分下。选择此套件以查看详细信息。  
![\[已在 Device Advisor 中成功创建一个名为“Long Duration Demo”的新测试套件。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/finalts-ld-ts.png)

1.  要运行创建的测试套件，请选择 **Actions**（操作），然后选择 **Run test suite**（运行测试套件）。  
![\[Device Advisor 界面中名为“Long Duration Demo”的新测试套件的“操作”下拉菜单。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/runts-ld-ts.png)

1.  在 **Run configuration**（运行配置）页面中选择配置选项。

   1. 选择要运行测试的 **Things**（事物）或 **Certificate**（证书）。

   1. 选择 **Account-level endpoint**（账户级端点）或 **Device-level endpoint**（设备级端点）。

   1. 选择 **Run test**（运行测试）以运行此测试。  
![\[Device Advisor 界面中的“运行配置”页面。该页面显示了“选择测试设备”、“事物”、“测试端点”和“标签”。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/runconfiguration-ld-ts.png)

1.  要查看测试套件的运行结果，请在左侧导航窗格中选择 **Test runs and results**（测试运行和结果）。选择运行的测试套件以查看结果的详细信息。  
![\[“测试运行和结果”页面上的“Long Duration Demo”测试案例。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/results-ld-ts.png)

1.  上一步将打开“test summary”（测试摘要）页面。测试运行的所有详细信息都显示在此页面中。当控制台提示启动设备连接时，将您的设备连接到提供的端点。在此页面上可以看到测试的进度。  
![\[您创建的“Long Duration Demo”测试的摘要页面。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/summary-ld-ts.png)

1.  长时间测试在侧面板上提供了额外的 **Test log summary**（测试日志摘要），该摘要几乎实时显示设备和代理之间发生的所有重要事件。要查看更深入的详细日志，请单击**测试使用案例日志**。  
![\[“Long Duration Demo”测试页面上的“测试日志摘要”部分。\]](http://docs.aws.amazon.com/zh_cn/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)、[设备影子](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html)和 [AWS IoT Jobs](https://docs.aws.amazon.com/iot/latest/developerguide/iot-jobs.html)。

[AWS PrivateLink](https://aws.amazon.com/privatelink)为物联网设备使用的接口端点提供动力。此服务可帮助您以私有方式访问 AWS IoT Core Device Advisor 测试端点，而无需互联网网关、NAT 设备、VPN 连接或 Direct Connect 连接。您的 VPC 中发送 TCP 和 MQTT 数据包的实例不需要公有 IP 地址即可与 AWS IoT Core Device Advisor 测试终端节点通信。您的 VPC 和 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 调用设备顾问测试端点（数据平面）。消息代理使用数据面板通信发送和接收数据。这是在 TLS 和 MQTT 数据包的帮助下实现的。用于 AWS IoT Core Device Advisor 将您的 AWS IoT 设备连接到设备顾问测试端点的 VPC 终端节点。此 VPC 端点不使用[控制面板 API 操作](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iotdeviceadvisor/index.html)。要创建或运行测试套件或其他控制平面 APIs，请通过公共互联网使用控制台、 AWS SDK 或 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)。
+ 查看 VPC 端点[先决条件](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#prerequisites-interface-endpoints)，了解有关如何[创建连接 VPC 端点的资源](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)的说明。您必须创建 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 IoT Core Device Advisor 的是 AWS CLI，请[describe-vpc-endpoint-services](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpc-endpoint-services.html)致电确认您的可用区中是否存在 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
```

您可以使用以下服务名称创建 VPC 终端节点： AWS IoT Core 
+ com.amazonaws.*region*.deviceadvisor.iot

默认情况下，对于此端点开启私有 DNS。这确保默认测试端点的使用保持在您的私有子网内。要获取您的账户或设备级终端节点，请使用控制台 AWS CLI 或 S AWS DK。例如，如果您在公有子网或公共互联网上运行 [get-endpoint](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 端点。

## 控制 AWS IoT Core Device Advisor 通过 VPC 终端节点的访问
<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)

## 符合设备资格认证计划的 AWS 设备顾问测试用例。
<a name="qualifiying-test-cases"></a>

根据 [AWS 设备资格认证计划](https://aws.amazon.com/partners/programs/dqp/)，您的设备必须通过以下测试才符合资格。

**注意**  
这是一份经修订的资格认证测试列表。
+ [TLS 连接](device-advisor-tests-tls.md#TLS_Connect)（“TLS 连接”）
+ [TLS 不正确的主题名称服务器证书](device-advisor-tests-tls.md#TLS_Incorrect_Subject_Name)（“不正确的主题通用名称（CN）/主题备用名称（SAN）”）
+ [TLS 不安全的服务器证书](device-advisor-tests-tls.md#TLS_Unsecure_Server_Cert)（“未经认可的 CA 签名”）
+ [AWS IoT 密码套件的 TLS 设备支持（“ AWS IoT 推荐密码套件](device-advisor-tests-tls.md#TLS_DeviceSupport_For_IOT)的 TLS 设备支持”）
+ [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)（“设备发送连接到 AWS IoT Core （Happy case）”）
+ [MQTT 订阅](device-advisor-tests-mqtt.md#MQTT_Subscribe) [“可以订阅（快乐使用案例）”]
+ [MQTT 发布](device-advisor-tests-mqtt.md#MQTT_Publish) [“QoS0（快乐使用案例）”]
+ [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。

## 满意路径
<a name="happy-path"></a>

**TLS 连接**  <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，但设备或 AWS IoT发来了 TLS 警告消息。
+ **失败** — 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>

** AWS IoT 推荐的密码套件的 TLS Device Support**  <a name="TLS_DeviceSupport_For_IOT"></a>
验证来自受测设备的 TLS Client 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 连接**测试使用案例通过，我们建议您提高设备的 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，但设备或 AWS IoT TLS 警告消息来自该设备。
+ **失败** — AWS IoT 由于握手过程中出现错误，被测设备未能完成 TLS 握手。

## 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 之间，不能超过 128KB。 AWS IoT Core 拒绝大于 128KB 的发布和连接请求，如 [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 到 128KB 之间的值。定义有效载荷大小会覆盖有效载荷内容，因为 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 记录被测设备的连接请求的时间戳，执行数据包验证，暂停而不向客户端设备发送连接，并等待被测设备重新发送请求。收集的时间戳用于验证被测设备在重新连接时是否使用抖动和退避。如果被测设备具有严格的指数退避或未实现适当的抖动退避机制，此测试用例将通过但是带有警告。如果被测设备实施了线性退避或恒定退避机制，测试将失败。  
要通过此测试用例，我们建议在所测试设备上实施[指数退避和抖动](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 在五次成功连接后将设备与服务器断开连接，并观察设备的 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（快乐使用案例）”**  <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"
      }
   }
]
```

## Subscribe
<a name="subscribe"></a>

**“可以订阅（快乐使用案例）”**  <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>

**“Mattt No Ack PingResp”**  
此测试使用案例验证被测设备在未收到 ping 响应时是否断开连接。作为此测试用例的一部分，设备顾问会屏蔽来自 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>

**“持久会话（快乐使用案例）”**  
此测试使用案例验证设备在与持久会话断开连接时的行为。该测试使用案例检查设备是否可以重新连接，恢复对其触发器主题的订阅而无需显式重新订阅，接收主题中存储的消息以及在持久会话期间按预期工作。当此测试用例通过时，它表明客户端设备能够以预期的方式与 AWS IoT Core 代理保持持续会话。有关 AWS IoT 持久会话的更多信息，请参阅[使用 MQTT 持久会话](https://docs.aws.amazon.com/iot/latest/developerguide/mqtt.html#mqtt-persistent-sessions)。  
在此测试使用案例中，客户端设备应该与 AWS IoT Core 进行连接 [clean session（清理会话）标志设置为 false]，然后订阅一个触发器主题。成功订阅后，设备顾问将断开 AWS IoT Core 设备连接。当设备处于断开连接状态时，该主题中将存储 QoS 1 消息有效载荷。然后，Device Advisor 将允许客户端设备与测试端点重新连接。此时，由于存在持久会话，客户端设备应该恢复其主题订阅而不发送任何其他 SUBSCRIBE 数据包，然后接收来自代理的 QoS 1 消息。重新连接后，如果客户端设备未能从触发主题接收存储的消息，通过发送额外的 SUBSCRIBE 数据包再次订阅其触发主题， and/or 则测试用例将失败。  
*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"
      }
   }
]
```

**“持久会话 - 会话到期”**  
此测试使用案例有助于验证断开连接的设备重新连接到过期的持久会话时的设备行为。会话过期后，我们希望设备通过显式发送新的 SUBSUBE 数据包来重新订阅之前订阅的主题。  
在第一次连接期间，我们希望测试设备与 AWS 物联网代理连接，因为其`CleanSession`标志设置为 false 即可启动持续会话。然后，设备应该订阅触发器主题。然后，在成功订阅并启动持续会话后， AWS IoT Core 设备顾问将断开设备的连接。断开连接后， AWS IoT Core 设备顾问允许测试设备与测试端点重新连接。此时，当测试设备发送另一个 CONNECT 数据包时， AWS IoT Core 设备顾问会发回一个 CONNACK 数据包，表示持续会话已过期。测试设备需要正确地解释此数据包，并且在持久会话终止时，它应该会再次重新订阅同一触发器主题。如果测试设备不再重新订阅其主题触发器，测试使用案例将失败。要通过测试，设备需要了解持久会话已经结束，然后为第二个连接中的相同触发器主题发回一个新的 SUBSCRIBE 数据包。  
如果测试设备的此测试使用案例获得通过，则表示该设备能够按照预期方式在持久会话到期时进行重新连接。  
*API 测试用例定义：*  
`EXECUTION_TIMEOUT` 的默认值为 5 分钟。我们建议将超时值设置为至少 4 分钟。测试设备需要显式订阅之前没有订阅的 `TRIGGER_TOPIC`。要通过测试使用案例，测试设备必须发送 CONNECT 数据包（`CleanSession` 标志设置为 false），并使用 QoS 1 成功订阅触发器主题。成功连接后， AWS IoT Core 设备顾问会断开设备的连接。断开连接后， AWS IoT Core Device Advisor 允许设备重新连接，并且设备应该重新订阅相同的连接，`TRIGGER_TOPIC`因为 AWS IoT Core 设备顾问本来会终止持续会话。

```
"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)了解更多信息。如果在测试套件中配置了这些测试使用案例，则在启动套件运行时需要提供一个事物。

 WebSocket目前不支持 **MQTT** 版本。

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

***“设备连接后发布状态（快乐使用案例）”***  
验证设备连接后能否发布其状态 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`，则测试使用案例将默认查找发布到 Unnamed（经典）影子类型的主题前缀的消息。如果您的设备使用命名的影子类型，请提供影子名称。请参阅[在设备中使用影子](https://docs.aws.amazon.com/iot/latest/developerguide/device-shadow-comms-device.html)，了解更多信息。

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

***“设备更新报告状态为理想状态（快乐使用案例）”***  
验证设备是否读取所有收到的更新消息，并同步设备的状态以与所需的状态属性匹配。您的设备应在同步后发布其最新报告状态。如果您的设备在运行测试之前已存在影子，请确保为测试使用案例配置的所需状态与现有报告状态不匹配。您可以通过查看 Shadow 文档中的**ClientToken**字段来识别 Device Advisor 发送的 Shadow 更新消息`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`，则测试使用案例将默认查找发布到 Unnamed（经典）影子类型的主题前缀的消息。如果您的设备使用命名的影子类型，请提供影子名称。请参阅[在设备中使用影子](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 任务](https://docs.aws.amazon.com/iot/latest/developerguide/reserved-topics.html#reserved-topics-job)的保留主题。  
 WebSocket目前不支持 **MQTT** 版本。  
*API 测试用例定义：*  
`EXECUTION_TIMEOUT` 的默认值为 5 分钟。我们建议将超时值设置为 3 分钟。根据所提供的 Jo AWS IoT b 文档或来源，调整超时值（例如，如果作业需要很长时间才能运行，请为测试用例定义更长的超时值）。要运行测试，需要有效的 AWS IoT Job 文档或已经存在的作业 ID。 AWS IoT Job 文档可以以 JSON 文档或 S3 链接的形式提供。如果已提供任务文档，则可以选择提供任务 ID。如果提供了任务 ID，Device Advisor 将在代表您创建 AWS IoT 任务时使用该ID。如果未提供任务文档，您可以提供用于运行测试使用案例的同一区域中的现有 ID。在这种情况下，设备顾问将在运行测试用例时使用该 AWS IoT Job。

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

您可以使用下列测试来确定附加到设备证书的策略是否符合下列标准最佳实践。

 WebSocket目前不支持 **MQTT** 版本。

**“设备证书附加策略不包含通配符”**  
 验证与设备关联的权限策略是否遵循最佳实践，并且未向设备授予除所需权限以外的其它权限。  
*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 连接、订阅、发布和重新连接之类的快乐使用案例场景中观察的。然后，在多种复杂的故障场景中观察该设备，例如 MQTT 重新连接回退、长时间服务器断开连接和间歇性连接。

## MQTT 长时间测试使用案例执行流程
<a name="long-duration-test-case-execution-flow"></a>

MQTT 长时间测试使用案例的执行分为三个阶段：

![\[显示基本测试执行、高级测试执行和额外执行时间的“MQTT 长时间测试执行”。\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/images/mqtt-execution-flow.png)


### 执行基本测试
<a name="basic-tests-execution"></a>

在此阶段，测试使用案例并行运行多项简单测试。该测试验证设备是否在配置中选择了这些操作。

根据所选操作，基本测试集可以包括以下内容：

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

此场景验证设备是否能够成功与代理建立连接。

![\[基本连接流程，其中包括发送 CONNECT 消息的设备，以及以 CONNACK 消息及成功返回代码进行响应的代理。\]](http://docs.aws.amazon.com/zh_cn/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_cn/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_cn/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_cn/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_cn/iot/latest/developerguide/images/subscribe-Qos1.png)


#### 重新连接
<a name="basic-tests-execution-reconnect"></a>

此场景验证在设备从成功连接断开连接后，是否能够成功与代理重新连接。如果在之前的测试套件期间多次连接设备，Device Advisor 不会断开设备此连接。相反，它会将测试标记为 **Pass**（通过）。

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


### 执行高级测试
<a name="advanced-tests-execution"></a>

在此阶段，测试使用案例连续运行更复杂的测试，以验证设备是否遵循最佳实践。这些高级测试可供选择，如果不需要，可以选择退出。根据场景的要求，每个高级测试都有自己的超时值。

#### 订阅 QoS 1 时返回 PUBACK
<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_cn/iot/latest/developerguide/images/return-puback.png)


#### 接收较大有效载荷
<a name="advanced-tests-execution-receive-large-payload"></a>

**注意**  
仅当您的设备能够执行 QoS 1 订阅时才选择此场景。

此场景验证设备在从代理接收到 QoS 1 主题的具有较大有效载荷的 `PUBLISH` 消息后，是否以 `PUBACK` 消息进行响应。可以使用 `LONG_PAYLOAD_FORMAT` 选项配置预期有效载荷的格式。

![\[DUT 和代理之间的 RECEIVE LARGE PAYLOAD 流程。\]](http://docs.aws.amazon.com/zh_cn/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_cn/iot/latest/developerguide/images/persistent-session.png)


#### 保持活动
<a name="advanced-tests-execution-keep-alive"></a>

此场景验证设备在未收到来自代理的 ping 响应后是否成功断开连接。连接必须配置有效的保持活动计时器。作为此测试的一部分，代理会阻止针对 `PUBLISH`、`SUBSCRIBE` 和 `PINGREQ` 消息发送的所有响应。它还验证正在测试的设备是否断开了 MQTT 连接。

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


#### 间歇性连接
<a name="advanced-tests-execution-intermittent-connectivity"></a>

此场景验证在代理以随机间隔断开设备连接一段随机时间后，设备是否可以连接回代理。

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


#### 重新连接回退
<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_cn/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_cn/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：**  
配置此选项可在所有测试完成后提供一个时间范围，用于监控设备和代理之间的事件。默认值为 5 分钟。此值可配置为 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 长时间测试使用案例的运行时间比常规测试使用案例长。提供了单独的摘要日志，其中列出了运行期间的重要事件，例如设备连接、发布和订阅。详细信息包括测试的内容、未测试的内容和失败的内容。测试会在日志的末尾包含测试使用案例运行期间发生的所有事件的摘要。摘要包括：
+ *设备上配置的“保持活动”计时器。*
+ *设备上配置的持久会话标志。*
+ *测试运行期间的设备连接数。*
+ *设备重新连接回退类型（如果已通过重新连接回退测试验证）。*
+ *在测试使用案例运行期间，设备发布到的主题。*
+ *在测试用例运行期间，设备订阅的主题。*