

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

# Connect 客户端设备与核心设备连接
<a name="connect-client-devices"></a>

您可以将*云发现*配置为将客户端设备连接到核心设备。配置云发现时，客户端设备可以连接到 AWS IoT Greengrass 云服务，以检索有关其可以连接的核心设备的信息。然后，客户端设备可以尝试连接到每台核心设备，直至其成功连接。

要使用云发现，您必须执行以下操作：
+ 将客户端设备与其可以连接的核心设备关联。
+ 指定客户端设备可以连接到每个核心设备的 MQTT 代理端点。
+ 将组件部署到能启用客户端设备支持的核心设备。

  您也可以部署可选组件来执行以下操作：
  + 在客户端设备、Greengrass 组件和云服务之间中继消息。 AWS IoT Core 
  + 自动为您管理核心设备 MQTT 代理端点。
  + 管理本地客户端设备阴影并将阴影与 AWS IoT Core 云服务同步。

您还必须查看并更新核心设备的 AWS IoT 策略，以验证其是否具有连接客户端设备所需的权限。有关更多信息，请参阅 [要求](#connect-client-devices-requirements)。

配置云发现后，您可以测试客户端设备与核心设备间的通信。有关更多信息，请参阅[测试客户端设备通信](test-client-device-communications.md)。

**Topics**
+ [要求](#connect-client-devices-requirements)
+ [用于支持客户端设备的 Greengrass 组件](#cloud-discovery-components)
+ [配置云发现（控制台）](#configure-cloud-discovery-console)
+ [配置云发现（AWS CLI）](#configure-cloud-discovery-cli)
+ [关联客户端设备](associate-client-devices.md)
+ [在离线时对客户端进行身份验证](offline-authentication.md)
+ [管理核心设备端点](manage-core-device-endpoints.md)
+ [选择 MQTT 代理](choose-local-mqtt-broker.md)
+ [使用 MQTT 代理将客户端设备连接到 AWS IoT Greengrass 核心设备](connecting-to-mqtt.md)
+ [测试客户端设备通信](test-client-device-communications.md)
+ [Greengrass 发现 API RESTful](greengrass-discover-api.md)

## 要求
<a name="connect-client-devices-requirements"></a>

要将客户端设备连接到核心设备，您必须满足以下要求或具备以下内容：
+ 核心设备必须运行 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.2.0 或更高版本。
+ 在核心设备运行的区域， AWS IoT Greengrass 与 AWS 账户 您关联的 Greengrass 服务角色。 AWS 有关更多信息，请参阅 [配置 Greengrass 服务角色](#configure-service-role-requirement)。
+ 核心设备的 AWS IoT 策略必须允许以下权限：<a name="core-device-iot-policy-client-device-permissions"></a>
  + <a name="core-device-iot-policy-client-device-permissions-putcertificateauthorities"></a>`greengrass:PutCertificateAuthorities`
  + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceidentity"></a>`greengrass:VerifyClientDeviceIdentity`
  + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceiotcertificateassociation"></a>`greengrass:VerifyClientDeviceIoTCertificateAssociation`
  + <a name="core-device-iot-policy-client-device-permissions-getconnectivityinfo"></a>`greengrass:GetConnectivityInfo`
  + <a name="core-device-iot-policy-client-device-permissions-updateconnectivityinfo"></a>`greengrass:UpdateConnectivityInfo`—（可选）使用 [IP 检测器组件需要此权限，该组件](ip-detector-component.md)将核心设备的网络连接信息报告给 AWS IoT Greengrass 云服务。
  + <a name="core-device-iot-policy-client-device-permissions-shadows"></a>`iot:GetThingShadow``iot:UpdateThingShadow`、和 `iot:DeleteThingShadow` —（可选）使用[影子管理器组件与客户端设备影子](shadow-manager-component.md)同步需要这些权限 AWS IoT Core。此功能需要 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.6.0 或更高版本、影子管理器 v2.2.0 或更高版本以及 [MQTT 网桥](mqtt-bridge-component.md) v2.2.0 或更高版本。

  有关更多信息，请参阅 [配置 AWS IoT 事物策略](#configure-iot-policy-requirement)。
**注意**  
如果您在[安装 AWS IoT Greengrass 酷睿软件](install-greengrass-core-v2.md)时使用默认 AWS IoT 策略，则核心设备具有允许访问所有 AWS IoT Greengrass 操作的 AWS IoT 策略（`greengrass:*`）。
+ AWS IoT 可以作为客户端设备连接的东西。有关更多信息，请参阅《AWS IoT Core 开发人员指南》**中的[创建 AWS IoT 资源](https://docs.aws.amazon.com/iot/latest/developerguide/create-iot-resources.html)。
+ 客户端设备必须使用客户端 ID 进行连接。客户端 ID 是一个事物名称。不接受其他客户端 ID。
+ 每台客户端设备的 AWS IoT 策略都必须允许该`greengrass:Discover`权限。有关更多信息，请参阅 [客户端设备的最低 AWS IoT 政策](device-auth.md#client-device-minimal-iot-policy)。

**Topics**
+ [配置 Greengrass 服务角色](#configure-service-role-requirement)
+ [配置 AWS IoT 事物策略](#configure-iot-policy-requirement)

### 配置 Greengrass 服务角色
<a name="configure-service-role-requirement"></a>

<a name="greengrass-service-role-intro"></a>Greengrass 服务角色 AWS Identity and Access Management 是一个 (IAM) 服务角色，它 AWS IoT Greengrass 授权代表您访问服务中的资源。 AWS 此角色 AWS IoT Greengrass 使验证客户端设备的身份和管理核心设备的连接信息成为可能。

如果您之前未在该区域设置 [Greengrass 服务角色，则必须将该区域的 Green](greengrass-service-role.md) grass 服务角色与您的服务角色相关联。 AWS IoT Greengrass AWS 账户 

在[AWS IoT Greengrass 控制台](https://console.aws.amazon.com/greengrass)中使用**配置核心设备发现**页面时，请为您 AWS IoT Greengrass 设置 Greengrass 服务角色。否则，您可以使用[AWS IoT 控制台](https://console.aws.amazon.com/iot)或 AWS IoT Greengrass API 进行手动设置。

在本节中，您将检查是否已设置好 Greengrass 服务角色。如果未设置，则可以在该区域为您创建一个新的 Greengrass 服务角色 AWS IoT Greengrass 进行关联。 AWS 账户 

#### 配置 Greengrass 服务角色（控制台）
<a name="configure-service-role-requirement-console"></a>

1. 检查该区域中是否与您的 Greengrass 服务角色相关 AWS IoT Greengrass 联。 AWS 账户 执行以下操作：

   1. <a name="open-iot-console"></a>导航至 [AWS IoT 控制台](https://console.aws.amazon.com/iot)。

   1. 在导航窗格中，选择**设置**。

   1. 在 **Greengrass 服务角色**部分，找到**当前服务角色**以查看是否关联了 Greengrass 服务角色。

      如果您关联了 Greengrass 服务角色，则符合使用 IP 检测器组件的要求。跳至[配置 AWS IoT 事物策略](#configure-iot-policy-requirement)。

1. 如果该区域中没有 AWS IoT Greengrass 与您的 Greengrass 服务角色关联， AWS 账户 请创建一个 Greengrass 服务角色并将其关联。执行以下操作：

   1. 导航到 [IAM 控制台](https://console.aws.amazon.com/iam)。

   1. 选择**角色**。

   1. 选择**创建角色**。

   1. 在**创建角色**页面上，执行以下操作：

      1. 在**可信实体类型**下，选择 **AWS 服务**。

      1. 在**使用案例**、**其他 AWS 服务使用案例**下，选择 **Greengrass**，然后选择 **Greengrass**。此选项指定添加为可以 AWS IoT Greengrass 担任此角色的可信实体。

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

      1. 在**权限策略**下，选择要附加到角色的 **AWSGreengrassResourceAccessRolePolicy**。

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

      1. 在**角色名称**中，输入角色的名称，例如 **Greengrass\$1ServiceRole**。

      1. 选择**创建角色**。

   1. <a name="open-iot-console"></a>导航至 [AWS IoT 控制台](https://console.aws.amazon.com/iot)。

   1. 在导航窗格中，选择**设置**。

   1. 在 **Greengrass 服务角色**部分，选择**附加角色**。

   1. 在**更新 Greengrass 服务角色**模式中，选择您创建的 IAM 角色，然后选择**附加角色**。

#### 配置 Greengrass 服务角色（AWS CLI）
<a name="configure-service-role-requirement-cli"></a>

1. 检查该区域中是否与您的 Greengrass 服务角色相关 AWS IoT Greengrass 联。 AWS 账户 

   ```
   aws greengrassv2 get-service-role-for-account
   ```

   如果关联了 Greengrass 服务角色，则该操作会返回包含有关该角色的信息的响应。

   如果您关联了 Greengrass 服务角色，则符合使用 IP 检测器组件的要求。跳至[配置 AWS IoT 事物策略](#configure-iot-policy-requirement)。

1. 如果该区域中没有 AWS IoT Greengrass 与您的 Greengrass 服务角色关联， AWS 账户 请创建一个 Greengrass 服务角色并将其关联。执行以下操作：

   1. <a name="create-greengrass-service-role-step-create-role"></a>使用允许代入该角色 AWS IoT Greengrass 的信任策略创建角色。此示例将创建一个名为 `Greengrass_ServiceRole` 的角色，但您也可以使用其他名称。我们建议您在信任策略中加入 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键，以帮助防止出现*混淆代理人*安全问题。条件上下文键可限制访问权限，仅允许来自指定账户和 Greengrass 工作空间的请求。有关混淆代理人问题的更多信息，请参阅 [防止跨服务混淆代理](cross-service-confused-deputy-prevention.md)。

------
#### [ Linux or Unix ]

      ```
      aws iam create-role --role-name Greengrass_ServiceRole --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "greengrass.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
              "ArnLike": {
                "aws:SourceArn": "arn:aws:greengrass:region:account-id:*"
              },
              "StringEquals": {
                "aws:SourceAccount": "account-id"
              }
            }
          }
        ]
      }'
      ```

------
#### [ Windows Command Prompt (CMD) ]

      ```
      aws iam create-role --role-name Greengrass_ServiceRole --assume-role-policy-document "{\\"Version\\":\\"2012-10-17		 	 	 \\",\\"Statement\\":[{\\"Effect\\":\\"Allow\\",\\"Principal\\":{\\"Service\\":\\"greengrass.amazonaws.com\\"},\\"Action\\":\\"sts:AssumeRole\\",\\"Condition\\":{\\"ArnLike\\":{\\"aws:SourceArn\\":\\"arn:aws:greengrass:region:account-id:*\\"},\\"StringEquals\\":{\\"aws:SourceAccount\\":\\"account-id\\"}}}]}"
      ```

------
#### [ PowerShell ]

      ```
      aws iam create-role --role-name Greengrass_ServiceRole --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "greengrass.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
              "ArnLike": {
                "aws:SourceArn": "arn:aws:greengrass:region:account-id:*"
              },
              "StringEquals": {
                "aws:SourceAccount": "account-id"
              }
            }
          }
        ]
      }'
      ```

------

   1. <a name="create-greengrass-service-role-step-copy-role-arn"></a>从输出中的角色元数据复制角色 ARN。使用该 ARN 将角色与您的账户关联。

   1. <a name="create-greengrass-service-role-step-attach-policy"></a>将 `AWSGreengrassResourceAccessRolePolicy` 策略附加到该角色。

      ```
      aws iam attach-role-policy --role-name Greengrass_ServiceRole --policy-arn arn:aws:iam::aws:policy/service-role/AWSGreengrassResourceAccessRolePolicy
      ```

   1. 将 Greengrass 服务角色与您的服务角色相关联。 AWS IoT Greengrass AWS 账户*role-arn*替换为服务角色的 ARN。

      ```
      aws greengrassv2 associate-service-role-to-account --role-arn role-arn
      ```

      如果操作成功，将返回以下响应。

      ```
      {
        "associatedAt": "timestamp"
      }
      ```

### 配置 AWS IoT 事物策略
<a name="configure-iot-policy-requirement"></a>

核心设备使用 X.509 设备证书来授权与 AWS的连接。您可以将 AWS IoT 策略附加到设备证书以定义核心设备的权限。有关更多信息，请参阅[AWS IoT 数据平面操作策略](device-auth.md#iot-policies)和[支持客户端设备的最低 AWS IoT 政策](device-auth.md#client-device-support-minimal-iot-policy)。

要将客户端设备连接到核心设备，核心设备的 AWS IoT 策略必须允许以下权限：<a name="core-device-iot-policy-client-device-permissions"></a>
+ <a name="core-device-iot-policy-client-device-permissions-putcertificateauthorities"></a>`greengrass:PutCertificateAuthorities`
+ <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceidentity"></a>`greengrass:VerifyClientDeviceIdentity`
+ <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceiotcertificateassociation"></a>`greengrass:VerifyClientDeviceIoTCertificateAssociation`
+ <a name="core-device-iot-policy-client-device-permissions-getconnectivityinfo"></a>`greengrass:GetConnectivityInfo`
+ <a name="core-device-iot-policy-client-device-permissions-updateconnectivityinfo"></a>`greengrass:UpdateConnectivityInfo`—（可选）使用 [IP 检测器组件需要此权限，该组件](ip-detector-component.md)将核心设备的网络连接信息报告给 AWS IoT Greengrass 云服务。
+ <a name="core-device-iot-policy-client-device-permissions-shadows"></a>`iot:GetThingShadow``iot:UpdateThingShadow`、和 `iot:DeleteThingShadow` —（可选）使用[影子管理器组件与客户端设备影子](shadow-manager-component.md)同步需要这些权限 AWS IoT Core。此功能需要 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.6.0 或更高版本、影子管理器 v2.2.0 或更高版本以及 [MQTT 网桥](mqtt-bridge-component.md) v2.2.0 或更高版本。

在本节中，您将查看核心设备的 AWS IoT 策略并添加缺少的所有必需权限。如果您使用[AWS IoT Greengrass 核心软件安装程序来配置资源](quick-installation.md)，则您的核心设备具有允许访问所有 AWS IoT Greengrass 操作的 AWS IoT 策略（`greengrass:*`）。在这种情况下，只有当您计划部署影子管理器组件来同步设备影子时，才必须更新 AWS IoT 策略 AWS IoT Core。否则，您可以跳过此部分。

#### 配置 AWS IoT 事物策略（控制台）
<a name="configure-iot-policy-requirement-console"></a>

1. <a name="update-iot-policy-console-open-greengrass-console"></a>在 [AWS IoT Greengrass 控制台](https://console.aws.amazon.com/greengrass)导航菜单中，选择**核心设备**。

1. <a name="update-iot-policy-console-choose-core-device"></a>在**核心设备**页面上，选择要更新的核心设备。

1. <a name="update-iot-policy-console-choose-core-device-thing"></a>在核心设备详细信息页面上，选择指向核心设备的**事物**的链接。此链接可打开 AWS IoT 控制台中的事物详细信息页面。

1. <a name="update-iot-policy-console-choose-thing-security"></a>在“事物详细信息”页面上，选择**证书**。

1. <a name="update-iot-policy-console-choose-thing-certificate"></a>在**证书**选项卡中，选择事物的有效证书。

1. <a name="update-iot-policy-console-choose-certificate-policies"></a>在证书详细信息页面上，选择**策略**。

1. <a name="update-iot-policy-console-choose-policy"></a>在 “**策略**” 选项卡中，选择要查看和更新的 AWS IoT 策略。您可以为附加到核心设备有效证书的任何策略添加所需权限。
**注意**  <a name="quick-installation-iot-policies-note"></a>
如果您使用[AWS IoT Greengrass 核心软件安装程序来配置资源](quick-installation.md)，则有两个 AWS IoT 策略。我们建议您选择名为 **GreengrassV2IoTThingPolicy** 的策略（如果存在）。默认情况下，使用快速安装程序创建的核心设备将使用此策略名称。如果您为此策略添加权限，则也会将这些权限授予使用此策略的其他核心设备。

1. <a name="update-iot-policy-console-edit-policy"></a>在策略概述中，选择**编辑活动版本**。

1. 查看策略以了解所需权限，然后添加缺失的所有必要权限。<a name="core-device-iot-policy-client-device-permissions"></a>
   + <a name="core-device-iot-policy-client-device-permissions-putcertificateauthorities"></a>`greengrass:PutCertificateAuthorities`
   + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceidentity"></a>`greengrass:VerifyClientDeviceIdentity`
   + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceiotcertificateassociation"></a>`greengrass:VerifyClientDeviceIoTCertificateAssociation`
   + <a name="core-device-iot-policy-client-device-permissions-getconnectivityinfo"></a>`greengrass:GetConnectivityInfo`
   + <a name="core-device-iot-policy-client-device-permissions-updateconnectivityinfo"></a>`greengrass:UpdateConnectivityInfo`—（可选）使用 [IP 检测器组件需要此权限，该组件](ip-detector-component.md)将核心设备的网络连接信息报告给 AWS IoT Greengrass 云服务。
   + <a name="core-device-iot-policy-client-device-permissions-shadows"></a>`iot:GetThingShadow``iot:UpdateThingShadow`、和 `iot:DeleteThingShadow` —（可选）使用[影子管理器组件与客户端设备影子](shadow-manager-component.md)同步需要这些权限 AWS IoT Core。此功能需要 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.6.0 或更高版本、影子管理器 v2.2.0 或更高版本以及 [MQTT 网桥](mqtt-bridge-component.md) v2.2.0 或更高版本。

1. （可选）要允许核心设备与其同步阴影 AWS IoT Core，请在策略中添加以下声明。如果您计划与客户端设备影子进行交互，但不打算与之同步 AWS IoT Core，请跳过此步骤。将*region*和*account-id*替换为您使用的地区和您的 AWS 账户 电话号码。
   + 此示例语句允许访问所有事物的设备影子。要遵循最佳安全实践，您可以将访问权限限制为仅访问核心设备和您连接到核心设备的客户端设备。有关更多信息，请参阅[支持客户端设备的最低 AWS IoT 政策](device-auth.md#client-device-support-minimal-iot-policy)。

   ```
   {
     "Effect": "Allow",
     "Action": [
       "iot:GetThingShadow",
       "iot:UpdateThingShadow",
       "iot:DeleteThingShadow"
     ],
     "Resource": [
       "arn:aws:iot:region:account-id:thing/*"
     ]
   }
   ```

   添加此语句后，策略文档可能看上去与以下示例相似。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "iot:Connect",
           "iot:Publish",
           "iot:Subscribe",
           "iot:Receive",
           "greengrass:*"
         ],
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": [
           "iot:GetThingShadow",
           "iot:UpdateThingShadow",
           "iot:DeleteThingShadow"
         ],
         "Resource": [
           "arn:aws:iot:us-east-1:123456789012:thing/*"
         ]
       }
     ]
   }
   ```

------

1. <a name="update-iot-policy-console-set-as-active-version"></a>要将新的策略版本设置为活动版本，请在**策略版本状态**下，选择**将编辑后的版本设置为该策略的活动版本**。

1. <a name="update-iot-policy-console-save-policy"></a>选择**另存为新版本**。

#### 配置 AWS IoT 事物策略 (AWS CLI)
<a name="configure-iot-policy-requirement-cli"></a>

1. <a name="update-iot-policy-cli-list-thing-principals"></a>列出核心设备的原理 AWS IoT 。事物主体可以是 X.509 设备证书或其他标识。运行以下命令，并*MyGreengrassCore*替换为核心设备的名称。

   ```
   aws iot list-thing-principals --thing-name MyGreengrassCore
   ```

   该操作将返回一个响应，列出核心设备的事物主体。

   ```
   {
       "principals": [
           "arn:aws:iot:us-west-2:123456789012:cert/certificateId"
       ]
   }
   ```

1. <a name="update-iot-policy-cli-identify-active-certificate"></a>识别核心设备的有效证书。运行以下命令，并*certificateId*替换为上一步中每个证书的 ID，直到找到活动证书。证书 ID 是证书 ARN 末尾的十六进制字符串。`--query` 参数用于指定仅输出证书的状态。

   ```
   aws iot describe-certificate --certificate-id certificateId --query 'certificateDescription.status'
   ```

   该操作以字符串形式返回证书状态。例如，如果证书有效，则此操作会输出 `"ACTIVE"`。

1. <a name="update-iot-policy-cli-list-certificate-policies"></a>列出附加到证书的 AWS IoT 策略。运行以下命令，并将证书 ARN 替换为实际的证书 ARN。

   ```
   aws iot list-principal-policies --principal arn:aws:iot:us-west-2:123456789012:cert/certificateId
   ```

   该操作会返回一个响应，其中列出了附加到证书的 AWS IoT 策略。

   ```
   {
       "policies": [
           {
               "policyName": "GreengrassTESCertificatePolicyMyGreengrassCoreTokenExchangeRoleAlias",
               "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassTESCertificatePolicyMyGreengrassCoreTokenExchangeRoleAlias"
           },
           {
               "policyName": "GreengrassV2IoTThingPolicy",
               "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassV2IoTThingPolicy"
           }
       ]
   }
   ```

1. <a name="update-iot-policy-cli-choose-policy"></a>选择要查看和更新的策略。
**注意**  <a name="quick-installation-iot-policies-note"></a>
如果您使用[AWS IoT Greengrass 核心软件安装程序来配置资源](quick-installation.md)，则有两个 AWS IoT 策略。我们建议您选择名为 **GreengrassV2IoTThingPolicy** 的策略（如果存在）。默认情况下，使用快速安装程序创建的核心设备将使用此策略名称。如果您为此策略添加权限，则也会将这些权限授予使用此策略的其他核心设备。

1. <a name="update-iot-policy-cli-get-policy-document"></a>获取策略的文档。运行以下命令，并*GreengrassV2IoTThingPolicy*替换为策略的名称。

   ```
   aws iot get-policy --policy-name GreengrassV2IoTThingPolicy
   ```

   该操作会返回一个响应，其中包含策略的文档和有关该策略的其他信息。策略文档是一个序列化为字符串的 JSON 对象。

   ```
   {
       "policyName": "GreengrassV2IoTThingPolicy",
       "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassV2IoTThingPolicy",
       "policyDocument": "{\
     \\"Version\\": \\"2012-10-17		 	 	 \\",\
     \\"Statement\\": [\
       {\
         \\"Effect\\": \\"Allow\\",\
         \\"Action\\": [\
                   \\"iot:Connect\\",\
                   \\"iot:Publish\\",\
                   \\"iot:Subscribe\\",\
                   \\"iot:Receive\\",\
                   \\"greengrass:*\\"\
   ],\
         \\"Resource\\": \\"*\\"\
       }\
     ]\
   }",
       "defaultVersionId": "1",
       "creationDate": "2021-02-05T16:03:14.098000-08:00",
       "lastModifiedDate": "2021-02-05T16:03:14.098000-08:00",
       "generationId": "f19144b798534f52c619d44f771a354f1b957dfa2b850625d9f1d0fde530e75f"
   }
   ```

1. <a name="update-iot-policy-cli-create-policy-document-file"></a>使用在线转换器或其他工具将策略文档字符串转换为 JSON 对象，然后将其保存到名为 `iot-policy.json` 的文件中。

   例如，如果您安装了 [jq](https://stedolan.github.io/jq/) 工具，则可以运行以下命令来获取策略文档，将其转换为 JSON 对象，然后将策略文档另存为 JSON 对象。

   ```
   aws iot get-policy --policy-name GreengrassV2IoTThingPolicy --query 'policyDocument' | jq fromjson >> iot-policy.json
   ```

1. 查看策略以了解所需权限，然后添加缺失的所有必要权限。

   <a name="nano-command-intro-existing-file"></a>例如，在 Linux 系统上，您可以运行以下命令来使用 GNU nano 打开文件。

   ```
   nano iot-policy.json
   ```<a name="core-device-iot-policy-client-device-permissions"></a>
   + <a name="core-device-iot-policy-client-device-permissions-putcertificateauthorities"></a>`greengrass:PutCertificateAuthorities`
   + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceidentity"></a>`greengrass:VerifyClientDeviceIdentity`
   + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceiotcertificateassociation"></a>`greengrass:VerifyClientDeviceIoTCertificateAssociation`
   + <a name="core-device-iot-policy-client-device-permissions-getconnectivityinfo"></a>`greengrass:GetConnectivityInfo`
   + <a name="core-device-iot-policy-client-device-permissions-updateconnectivityinfo"></a>`greengrass:UpdateConnectivityInfo`—（可选）使用 [IP 检测器组件需要此权限，该组件](ip-detector-component.md)将核心设备的网络连接信息报告给 AWS IoT Greengrass 云服务。
   + <a name="core-device-iot-policy-client-device-permissions-shadows"></a>`iot:GetThingShadow``iot:UpdateThingShadow`、和 `iot:DeleteThingShadow` —（可选）使用[影子管理器组件与客户端设备影子](shadow-manager-component.md)同步需要这些权限 AWS IoT Core。此功能需要 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.6.0 或更高版本、影子管理器 v2.2.0 或更高版本以及 [MQTT 网桥](mqtt-bridge-component.md) v2.2.0 或更高版本。

1. <a name="update-iot-policy-cli-create-policy-version"></a>将更改保存为策略的新版本。运行以下命令，并*GreengrassV2IoTThingPolicy*替换为策略的名称。

   ```
   aws iot create-policy-version --policy-name GreengrassV2IoTThingPolicy --policy-document file://iot-policy.json --set-as-default
   ```

   如果操作成功，它会返回与以下示例类似的响应。

   ```
   {
       "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassV2IoTThingPolicy",
       "policyDocument": "{\
     \\"Version\\": \\"2012-10-17		 	 	 \\",\
     \\"Statement\\": [\
       {\
         \\"Effect\\": \\"Allow\\",\
         \\"Action\\": [\
   \\t\\t\\"iot:Connect\\",\
   \\t\\t\\"iot:Publish\\",\
   \\t\\t\\"iot:Subscribe\\",\
   \\t\\t\\"iot:Receive\\",\
   \\t\\t\\"greengrass:*\\"\
         ],\
         \\"Resource\\": \\"*\\"\
       }\
     ]\
   }",
       "policyVersionId": "2",
       "isDefaultVersion": true
   }
   ```

## 用于支持客户端设备的 Greengrass 组件
<a name="cloud-discovery-components"></a>

**重要**  <a name="client-device-support-nucleus-requirement"></a>
核心设备必须运行 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.2.0 或更高版本才能支持客户端设备。

要使客户端设备能够连接到核心设备并与之通信，请将以下 Greengrass 组件部署到核心设备：
+ <a name="client-device-component-overview-client-device-auth"></a>[客户端设备身份验证](client-device-auth-component.md) (`aws.greengrass.clientdevices.Auth`)

  部署客户端设备身份验证组件，以对客户端设备进行身份验证并授权客户端设备操作。这个组件允许你的 AWS IoT 东西连接到核心设备。

  此组件需要进行一些配置才能使用。您必须指定客户端设备组以及每个组有权执行的操作，例如通过 MQTT 进行连接和通信。有关更多信息，请参阅[客户端设备身份验证组件配置](client-device-auth-component.md#client-device-auth-component-configuration)。
+ <a name="client-device-component-overview-mqtt-broker-moquette"></a>[MQTT 3.1.1 代理（Moquette）](mqtt-broker-moquette-component.md) (`aws.greengrass.clientdevices.mqtt.Moquette`)

  部署 Moquette MQTT 代理组件来运行轻量级 MQTT 代理。Moquette MQTT 代理符合 MQTT 3.1.1，包括对 QoS 0、QoS 1、QoS 2、保留消息、最后遗嘱消息和永久订阅的本地支持。

  您无需配置此组件即可使用此组件。但是，您可以配置此组件操作 MQTT 代理的端口。默认情况下，使用端口 8883。
+ <a name="client-device-component-overview-mqtt-broker-emqx"></a>[MQTT 5 代理（EMQX）](mqtt-broker-emqx-component.md) (`aws.greengrass.clientdevices.mqtt.EMQX`)
**注意**  
要使用 EMQX MQTT 5 代理，必须使用 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.6.0 或更高版本以及客户端设备身份验证 v2.2.0 或更高版本。

  部署 EMQX MQTT 代理组件，以便在客户端设备和核心设备间的通信中使用 MQTT 5.0 功能。EMQX MQTT 代理符合 MQTT 5.0 的要求，并且支持会话和消息过期间隔、用户属性、共享订阅、主题别名等功能。

  您无需配置此组件即可使用此组件。但是，您可以配置此组件操作 MQTT 代理的端口。默认情况下，使用端口 8883。
+ <a name="client-device-component-overview-mqtt-bridge"></a>[MQTT 网桥](mqtt-bridge-component.md) (`aws.greengrass.clientdevices.mqtt.Bridge`)

  （可选）部署 MQTT 桥接组件，以便在客户端设备（本地 MQTT）、本地发布/订阅和 MQTT 之间中继消息。 AWS IoT Core 将此组件配置为与 Greengrass 组件中的客户端设备同步 AWS IoT Core 并与客户端设备进行交互。

  此组件需要配置才能使用。您必须指定此组件用于中继消息的主题映射。有关更多信息，请参阅 [MQTT 网桥组件配置](mqtt-bridge-component.md#mqtt-bridge-component-configuration)。
+ <a name="client-device-component-overview-ip-detector"></a>[IP 检测器](ip-detector-component.md) (`aws.greengrass.clientdevices.IPDetector`)

  （可选）部署 IP 检测器组件，自动向 AWS IoT Greengrass 云服务报告核心设备的 MQTT 代理端点。如果您的网络设置很复杂（例如路由器将 MQTT 代理端口转发到核心设备），则无法使用此组件。

  您无需配置此组件即可使用此组件。
+ <a name="client-device-component-overview-shadow-manager"></a>[影子管理器](shadow-manager-component.md) (`aws.greengrass.ShadowManager`)
**注意**  
要管理客户端设备影子，必须使用 [Greengrass Nucleus](greengrass-nucleus-component.md) v2.6.0 或更高版本、影子管理器 v2.2.0 或更高版本以及 [MQTT 网桥](mqtt-bridge-component.md) v2.2.0 或更高版本。

  （可选）部署影子管理器组件以管理核心设备上的客户端设备影子。Greengrass 组件可以获取、更新和删除客户端设备影子，以与客户端设备进行交互。您也可以将影子管理器组件配置为将客户端设备影子与 AWS IoT Core 云服务同步。

  要将此组件用于客户端设备影子，必须配置 MQTT 网桥组件，以通过本地发布/订阅在客户端设备和影子管理器间中继消息。否则，此组件无需配置即可使用，但配置后才能同步设备影子。

**注意**  <a name="note-deploy-one-mqtt-broker"></a>
我们建议您仅部署一个 MQTT 代理组件。[MQTT 网桥](mqtt-bridge-component.md)和 [IP 检测器](ip-detector-component.md)组件每次只能使用一个 MQTT 代理组件。如果您部署多个 MQTT 代理组件，您必须将这些组件配置为使用不同的端口。

## 配置云发现（控制台）
<a name="configure-cloud-discovery-console"></a>

您可以使用 AWS IoT Greengrass 控制台关联客户端设备、管理核心设备端点和部署组件以启用客户端设备支持。有关更多信息，请参阅 [第 2 步：启用客户端设备支持](client-devices-tutorial.md#enable-client-device-support)。

## 配置云发现（AWS CLI）
<a name="configure-cloud-discovery-cli"></a>

您可以使用 AWS Command Line Interface (AWS CLI) 关联客户端设备、管理核心设备端点和部署组件以启用客户端设备支持。有关更多信息，请参阅下列内容：
+ [管理客户端设备关联（AWS CLI）](associate-client-devices.md#manage-client-device-associations-cli)
+ [管理核心设备端点](manage-core-device-endpoints.md)
+ [AWS 提供的客户端设备组件](client-device-components.md)
+ [创建部署](create-deployments.md)