

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

# 实施 AWS。 DiscoverDevices 操作
<a name="discover-devices-op"></a>

设备发现会将最终用户拥有的物理设备列表与 AWS IoT Device Management 托管集成中维护的最终用户设备的数字表示形式保持一致。只有在用户与 AWS IoT Device Management 的托管集成之间完成账户关联后， AWS 客户才会在最终用户拥有的设备上执行此操作。设备发现是一个异步过程，其中 AWS IoT Device Management 的托管集成会调用连接器来启动设备发现请求。C2C 连接器异步返回已发现的最终用户设备列表，其中包含托管集成生成的参考标识符（称为`deviceDiscoveryId`）。

下图说明了 AWS IoT Device Management 的最终用户和托管集成之间的设备发现工作流程：

![\[AWS。 DiscoverDevices 工作流程\]](http://docs.aws.amazon.com/zh_cn/iot-mi/latest/devguide/images/device-discovery-workflow.png)


**AWS。 DiscoverDevices 工作流程**

1. 客户代表最终用户启动设备发现流程。

1. 的托管集成 AWS IoT Device Management 会生成一个参考标识符，该标识符调`deviceDiscoveryId`用 AWS 客户生成的设备发现请求。

1. 的托管集成使用`AWS.DiscoverDevices`操作界面向 C2C 连接器 AWS IoT Device Management 发送设备发现请求，包括有效 OAuth`accessToken`的最终用户以及. `deviceDiscoveryId` 

1. 您的连接器存储`deviceDiscoveryId`以包含在`DEVICE_DISCOVERY`活动中。此事件还将包含已发现的最终用户设备的列表，并且必须将其发送到 AWS IoT Device Management 的托管集成，并将 `SendConnectorEvent` API 作为`DEVICE_DISCOVERY`事件发送。

1. 您的 C2C 连接器应调用资源服务器来获取最终用户拥有的所有设备。

1. 您的 C2C 连接器 Lambda 会响应 Lambda 调用 `invokeFunction` ()，并向 AWS IoT Device Management 的托管集成发出 ACK 响应，作为操作的初始响应。`AWS.DiscoverDevices`托管集成通过 ACK 通知客户已启动的设备发现流程。

1. 您的资源服务器会向您发送最终用户拥有和操作的设备列表。

1. 您的连接器将每台最终用户设备转换为 AWS IoT Device Management 所需设备格式的托管集成 `ConnectorDeviceId``ConnectorDeviceName`，包括每台设备的能力报告。

1. C2C 连接器还提供`UserId`已发现设备所有者的信息。它可以作为设备列表的一部分从您的资源服务器中检索，也可以根据您的资源服务器实现情况在单独的调用中检索。

1. 接下来，您的 C2C 连接器将使用 AWS 账户 凭证并将操作参数设置为 “DEVICE\$1DISCOVERY”`SendConnectorEvent`，通过 sigv4 调用 AWS IoT 设备管理 API 的托管集成。发送到 AWS IoT Device Management 托管集成的设备列表中的每台设备都将由设备特定的参数表示`connectorDeviceId`，例如`connectorDeviceName`、和 a。`capabilityReport`

   1. 根据您的资源服务器响应，您需要相应地通知 AWS IoT Device Management 的托管集成。

     例如，如果您的资源服务器对最终用户发现的设备列表进行了分页响应，那么对于每次轮询，您都可以发送一个`statusCode`参数为的`3xx`单个`DEVICE_DISCOVERY`操作事件。如果您的设备发现仍在进行中，请重复步骤 5、6 和 7。

1. 的托管集成会向客户 AWS IoT Device Management 发送有关已发现最终用户设备的通知。

1. 如果您的 C2C 连接器发送的`DEVICE_DISCOVERY`操作事件`statusCode`参数更新为 200，则托管集成将通知客户设备发现工作流程已完成。
**重要**  
如果需要，步骤 7 到 11 可以在步骤 6 之前进行。例如，如果您的第三方平台有一个用于列出最终用户设备的 API，则可以在 C2C 连接器 Lambda 使用典型的 ACK 响应`SendConnectorEvent`之前发送 DEVICE\$1DISCOVERY 事件。

## 设备发现时的 C2C 连接器要求
<a name="connector-device-discovery-requirements"></a>

以下列表概述了 C2C 连接器的要求，以便于成功发现设备。
+ C2C 连接器 Lambda a 可以处理来自 AWS IoT Device Management 托管集成的设备发现请求消息并处理操作。`AWS.DiscoverDevices`
+ 您的 C2C 连接器可以使用用于注册连接器的凭证 APIs 通过 Sigv4 调用 AWS IoT Device Management 的 AWS 账户 托管集成。

## 设备发现过程
<a name="device-discovery-process"></a>

以下步骤概述了使用您的 C2C 连接器和托管集成 AWS IoT Device Management 的设备发现过程。

**设备发现过程**

1. 托管集成会触发设备发现：

   1. 使用以下 JSON 负载`DiscoverDevices`向发送 POST 请求：

     ```
     /DiscoverDevices
     {
        "header": {
             "auth": {                 
                 "token": "ashriu32yr97feqy7afsaf",  
                 "type": "OAuth2.0"
             }
        },
        "payload": {
             "operationName": "AWS.DiscoverDevices",
             "operationVersion": "1.0",
             "connectorId": "Your-Connector-Id",
             "deviceDiscoveryId": "12345678"
        }
     }
     ```

1. 连接器确认发现：

   1. 连接器发送带有以下 JSON 响应的确认：

     ```
     {
          "header": {
               "responseCode":200
          },
          "payload": {
               "responseMessage": "Discovering devices for discovery-job-id '12345678' with connector-id `Your-Connector-Id`"
          }
     }
     ```

1. 连接器发送设备发现事件：

   1. 使用以下 JSON 负载`/connector-event/{your_connector_id}`向发送 POST 请求：

     ```
     AWS API - /SendConnectorEvent
     URI – POST /connector-event/{your_connector_id}
     {
        "UserId": "6109342",
        "Operation": "DEVICE_DISCOVERY",
        "OperationVersion": "1.0",
        "StatusCode": 200,
        "DeviceDiscoveryId": "12345678",
        "ConnectorId": "Your_connector_Id",
        "Message": "Device discovery for discovery-job-id '12345678' successful",
        "Devices": [
             {
                 "ConnectorDeviceId": "Your_Device_Id_1",
                 "ConnectorDeviceName": "Your-Device-Name",
                 "CapabilityReport": {
      	      		"nodeId":"1",
      			"version":"1.0.0", 
       			"endpoints":[{
      				"id":"1",
      				"deviceTypes":["Camera"],
      				"clusters":[{
      					"id":"0x0006",
      					"revision":1, 
      					"attributes":[{
      						"id":"0x0000",
      					}],
      					"commands":["0x00","0x01"],
      					"events":["0x00"]
      				}]
      			}]
      		} 
             }
         ]
     }
     ```

## 为 DISCOVER\$1D CapabilityReport EVICES 事件构造一个
<a name="capability-report-discover-devices"></a>

如上面定义的事件结构所示，在 DISCOVER\$1DEVICES 事件中报告的每台设备作为对`AWS.DiscoverDevices`操作的响应，都需要 CapbilityReport 来描述相应设备的功能。`CapabilityReport`以符合 Matter 的格式表示 AWS IoT Device Management 设备功能的托管集成。` CapabilityReport`中必须提供以下字段：
+ `nodeId`，字符串：包含以下内容的设备节点的标识符 `endpoints`
+ `version`，String：此设备节点的版本，由连接器开发者设置
+ `endpoints`，<Cluster>列表：此设备端点支持的案件数据模型 AWS 实现列表。
  + `id`，字符串：连接器开发者设置的端点标识符
  + `deviceTypes`，<String>列表：此端点捕获的设备类型列表，即 “摄像头”。
  + `clusters`，Lis <Cluster>t：此端点支持的案件数据模型的 AWS 实现列表。
    + `id`，字符串：Matter 标准定义的集群标识符。
    + `revision`，整数：Matter 标准定义的集群修订版号。
    + `attributes`，<String, Object> 地图：属性标识符及其对应的当前设备状态值的映射，标识符和有效值由问题标准定义。
      + `id`，字符串：案件数据模型的 AWS 实现所定义的属性 ID。
      + `value`，对象：由属性 ID 定义的属性的当前值。“值” 的类型可以根据属性而变化。该`value`字段对于每个属性都是可选的，只有当您的连接器 lambda 可以在发现期间确定当前状态时，才应包含该字段。
    + `commands`，<String>列表：按照 Matter 标准的定义，此集群 IDs 支持的命令列表。
    + `events`，<String>列表：根据 Matter 标准的定义，此集群 IDs 支持的事件列表。

有关[物质数据模型支持的功能及其相应AWS 实现的](matter-data-model.md)当前列表，请参阅最新版本的数据模型文档。