

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

# 將用戶端裝置連接至核心裝置
<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 Core 裝置](connecting-to-mqtt.md)
+ [測試用戶端裝置通訊](test-client-device-communications.md)
+ [Greengrass 探索 RESTful API](greengrass-discover-api.md)

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

若要將用戶端裝置連接至核心裝置，您必須具有下列項目：
+ 核心裝置必須執行 [Greengrass 核 v](greengrass-nucleus-component.md)2.2.0 或更新版本。
+ 在核心裝置運作 AWS 帳戶 的 AWS 區域中，與 AWS IoT Greengrass 相關聯的 Greengrass 服務角色。如需詳細資訊，請參閱[設定 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 核](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 Core 軟體](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 服務角色](greengrass-service-role.md)，則必須在此區域中 AWS IoT Greengrass 為 建立 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 服務角色是否已設定。如果未設定，您會在此 AWS 帳戶 區域中為 建立新的 Greengrass AWS IoT Greengrass 服務角色，以與 建立關聯。

#### 設定 Greengrass 服務角色 （主控台）
<a name="configure-service-role-requirement-console"></a>

1. 檢查 Greengrass 服務角色是否 AWS 帳戶 與此區域中 AWS IoT Greengrass 的 相關聯。請執行下列操作：

   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. 如果 Greengrass 服務角色與此 AWS 帳戶 區域中 AWS IoT Greengrass 的 沒有關聯，請建立 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 帳戶 與此區域中 AWS IoT Greengrass 的 相關聯。

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

   如果 Greengrass 服務角色相關聯，操作會傳回包含角色相關資訊的回應。

   如果您有相關聯的 Greengrass 服務角色，則需符合此要求才能使用 IP 偵測器元件。跳至 [設定 AWS IoT 物件政策](#configure-iot-policy-requirement)。

1. 如果 Greengrass 服務角色與此 AWS 帳戶 區域中 AWS IoT Greengrass 的 沒有關聯，請建立 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 核 v](greengrass-nucleus-component.md)2.6.0 或更新版本、陰影管理員 v2.2.0 或更新版本，以及 [MQTT 橋接](mqtt-bridge-component.md)器 v2.2.0 或更新版本。

在本節中，您將檢閱核心裝置 AWS IoT 的政策，並新增任何缺少的必要許可。如果您使用 [AWS IoT Greengrass Core 軟體安裝程式佈建資源](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 Core 軟體安裝程式佈建資源](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 核 v](greengrass-nucleus-component.md)2.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 Core 軟體安裝程式佈建資源](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 核](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 核 v](greengrass-nucleus-component.md)2.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)、本機發佈/訂閱和 AWS IoT Core MQTT 之間轉送訊息。設定此元件以同步用戶端裝置與 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 管理員](shadow-manager-component.md) (`aws.greengrass.ShadowManager`)
**注意**  
若要管理用戶端裝置影子，您必須使用 [Greengrass 核 v](greengrass-nucleus-component.md)2.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)

# 關聯用戶端裝置
<a name="associate-client-devices"></a>

若要使用雲端探索，請將用戶端裝置與核心裝置建立關聯，以便他們可以探索核心裝置。然後，他們可以使用 [Greengrass 探索 API](greengrass-discover-api.md) 來擷取其相關聯核心裝置的連線資訊和憑證。

同樣地，取消用戶端裝置與核心裝置的關聯，使其無法探索核心裝置。

**Topics**
+ [管理用戶端裝置關聯 （主控台）](#manage-client-device-associations-console)
+ [管理用戶端裝置關聯 (AWS CLI)](#manage-client-device-associations-cli)
+ [管理用戶端裝置關聯 (API)](#manage-client-device-associations-api)

## 管理用戶端裝置關聯 （主控台）
<a name="manage-client-device-associations-console"></a>

您可以使用 AWS IoT Greengrass 主控台來檢視、新增和刪除用戶端裝置關聯。

**檢視核心裝置的用戶端裝置關聯 （主控台）**

1. <a name="navigate-greengrass-console"></a>導覽至 [AWS IoT Greengrass 主控台](https://console.aws.amazon.com/greengrass)。

1. 選擇**核心裝置**。

1. 選擇要管理的核心裝置。

1. 在核心裝置的詳細資訊頁面上，選擇**用戶端裝置**索引標籤。

1. 在**關聯的用戶端裝置**區段中，您可以查看哪些用戶端裝置 (AWS IoT 物件） 與核心裝置相關聯。

**將用戶端裝置與核心裝置建立關聯 （主控台）**

1. <a name="navigate-greengrass-console"></a>導覽至 [AWS IoT Greengrass 主控台](https://console.aws.amazon.com/greengrass)。

1. 選擇**核心裝置**。

1. 選擇要管理的核心裝置。

1. 在核心裝置的詳細資訊頁面上，選擇**用戶端裝置**索引標籤。

1. 在**關聯的用戶端裝置**區段中，選擇**關聯用戶端裝置**。

1. 在**將用戶端裝置與核心裝置模式建立關聯**中，為每個要建立關聯的用戶端裝置執行下列動作：

   1. 輸入要做為用戶端裝置建立關聯的 AWS IoT 物件名稱。

   1. 選擇**新增**。

1. 選擇**關聯**。

   您相關聯的用戶端裝置現在可以使用 Greengrass 探索 API 來探索此核心裝置。

**取消用戶端裝置與核心裝置的關聯 （主控台）**

1. <a name="navigate-greengrass-console"></a>導覽至 [AWS IoT Greengrass 主控台](https://console.aws.amazon.com/greengrass)。

1. 選擇**核心裝置**。

1. 選擇要管理的核心裝置。

1. 在核心裝置的詳細資訊頁面上，選擇**用戶端裝置**索引標籤。

1. 在**關聯的用戶端裝置**區段中，選取要取消關聯的每個用戶端裝置。

1. 選擇**取消關聯**。

1. 在確認模態中，選擇**取消關聯**。

   您取消關聯的用戶端裝置無法再使用 Greengrass 探索 API 來探索此核心裝置。

## 管理用戶端裝置關聯 (AWS CLI)
<a name="manage-client-device-associations-cli"></a>

您可以使用 AWS Command Line Interface (AWS CLI) 來管理核心裝置的用戶端裝置關聯。

**檢視核心裝置的用戶端裝置關聯 (AWS CLI)**
+ 使用下列命令：[list-client-devices-associated-with-core-device](https://docs.aws.amazon.com/cli/latest/reference/greengrassv2/list-client-devices-associated-with-core-device.html)。

**將用戶端裝置與核心裝置建立關聯 (AWS CLI)**
+ 使用下列命令： [batch-associate-client-device-with-core-device](https://docs.aws.amazon.com/cli/latest/reference/greengrassv2/batch-associate-client-device-with-core-device.html)。

**取消用戶端裝置與核心裝置的關聯 (AWS CLI)**
+ 使用下列命令： [batch-disassociate-client-device-from-core-device](https://docs.aws.amazon.com/cli/latest/reference/greengrassv2/batch-disassociate-client-device-from-core-device.html)。

## 管理用戶端裝置關聯 (API)
<a name="manage-client-device-associations-api"></a>

您可以使用 AWS API 來管理核心裝置的用戶端裝置關聯。

**檢視核心裝置 (AWS API) 的用戶端裝置關聯**
+ 使用下列操作：[ListClientDevicesAssociatedWithCoreDevice](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_ListClientDevicesAssociatedWithCoreDevice.html)。

**將用戶端裝置與核心裝置 (AWS API) 建立關聯**
+ 使用下列操作：[BatchAssociateClientDeviceWithCoreDevice](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchAssociateClientDeviceWithCoreDevice.html)。

**取消用戶端裝置與核心裝置 (AWS API) 的關聯**
+ 使用下列操作：[BatchDisassociateClientDeviceFromCoreDevice](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchDisassociateClientDeviceFromCoreDevice.html)。

# 離線時驗證用戶端
<a name="offline-authentication"></a>

透過*離線身分驗證*，您可以設定您的 AWS IoT Greengrass Core 裝置，讓用戶端裝置可以連線至核心裝置，即使核心裝置未連線至雲端也一樣。當您使用離線身分驗證時，您的 Greengrass 裝置可以繼續在部分離線的環境中運作。

若要對具有雲端連線的用戶端裝置使用離線身分驗證，您需要下列項目：
+ 部署 [用戶端裝置身分驗證](client-device-auth-component.md)元件的核心 AWS IoT Greengrass 裝置。您必須使用 2.3.0 版或更新版本進行離線身分驗證。
+ 在用戶端裝置的初始連線期間，核心裝置的雲端連線。

## 儲存用戶端登入資料
<a name="offline-auth-store-credentials"></a>

當用戶端裝置第一次連線到核心裝置時，核心裝置會呼叫 AWS IoT Greengrass 服務。呼叫時，Greengrass 會將用戶端裝置的註冊驗證為 AWS IoT 物件。它也會驗證裝置是否具有有效的憑證。然後，核心裝置會在本機存放此資訊。

下次裝置連線時，Greengrass 核心裝置會嘗試使用 AWS IoT Greengrass 服務驗證用戶端裝置。如果無法連線 AWS IoT Greengrass，核心裝置會使用其本機儲存的裝置資訊來驗證用戶端裝置。

您可以設定 Greengrass 核心裝置存放登入資料的時間長度。您可以在[用戶端裝置驗證元件組態](https://docs.aws.amazon.com//greengrass/v2/developerguide/client-device-auth-component.html#client-device-auth-component-configuration)中設定`clientDeviceTrustDurationMinutes`組態選項，將逾時從一分鐘設定為 2，147，483，647 分鐘。預設值為一分鐘，可有效關閉離線身分驗證。當您設定此逾時時，我們建議您考慮安全需求。您也應該考慮在與雲端中斷連線時，預期核心裝置執行的時間長度。

核心裝置會更新其登入資料儲存三次：

1. 當裝置第一次連接到核心裝置時。

1. 如果核心裝置連接到雲端，當用戶端裝置重新連接到核心裝置時。

1. 如果核心裝置已連線至雲端，請每天重新整理一次整個登入資料存放區。

當 Greengrass 核心裝置重新整理其登入資料存放區時，會使用 [ ListClientDevicesAssociatedWithCoreDevice](https://docs.aws.amazon.com//greengrass/v2/APIReference/API_ListClientDevicesAssociatedWithCoreDevice.html) 操作。Greengrass 只會重新整理此操作傳回的裝置。若要將用戶端裝置與核心裝置建立關聯，請參閱 [關聯用戶端裝置](associate-client-devices.md)。

若要使用 `ListClientDevicesAssociatedWithCoreDevice`操作，您必須將操作的許可新增至與執行 相關聯的 AWS Identity and Access Management (IAM) AWS 帳戶 角色 AWS IoT Greengrass。如需詳細資訊，請參閱[授權核心裝置與 AWS 服務互動](device-service-role.md)。

# 管理核心裝置端點
<a name="manage-core-device-endpoints"></a>

當您使用雲端探索時，您可以將核心裝置的 MQTT 代理程式端點存放在雲端服務中 AWS IoT Greengrass 。用戶端裝置會連線至 AWS IoT Greengrass ，以擷取這些端點及其相關聯核心裝置的其他資訊。

對於每個核心裝置，您可以自動或手動管理端點。
+ **使用 IP 偵測器自動管理端點**

  如果您有非複雜網路設定，例如用戶端裝置與核心裝置位於相同網路上，您可以部署 [IP 偵測器元件](ip-detector-component.md)來自動管理核心裝置端點。例如，如果核心裝置位於將 MQTT 代理程式連接埠轉送至核心裝置的路由器後方，則無法使用 IP 偵測器元件。

  如果您部署到物件群組，IP 偵測器元件也很有用，因為它會管理物件群組中所有核心裝置的端點。如需詳細資訊，請參閱[使用 IP 偵測器自動管理端點](#use-ip-detector)。
+ **手動管理端點**

  如果您無法使用 IP 偵測器元件，則必須手動管理核心裝置端點。您可以使用 主控台或 API 更新這些端點。如需詳細資訊，請參閱[手動管理端點](#manually-manage-endpoints)。

**Topics**
+ [使用 IP 偵測器自動管理端點](#use-ip-detector)
+ [手動管理端點](#manually-manage-endpoints)

## 使用 IP 偵測器自動管理端點
<a name="use-ip-detector"></a>

如果您有簡單的網路設定，例如與核心裝置位於相同網路上的用戶端裝置，您可以部署 [IP 偵測器元件](ip-detector-component.md)來執行下列動作：
+ 監控 Greengrass 核心裝置的本機網路連線資訊。此資訊包括核心裝置的網路端點，以及 MQTT 中介裝置操作所在的連接埠。
+ 向 AWS IoT Greengrass 雲端服務報告核心裝置的連線資訊。

IP 偵測器元件會覆寫您手動設定的端點。

**重要**  
核心裝置的 AWS IoT 政策必須允許 使用 IP 偵測器元件的`greengrass:UpdateConnectivityInfo`許可。如需詳細資訊，請參閱[AWS IoT 資料平面操作的 政策](device-auth.md#iot-policies)及[設定 AWS IoT 物件政策](connect-client-devices.md#configure-iot-policy-requirement)。

您可以執行下列任一動作來部署 IP 偵測器元件：
+ 使用 主控台中的**設定探索**頁面。如需詳細資訊，請參閱[設定雲端探索 （主控台）](connect-client-devices.md#configure-cloud-discovery-console)。
+ 建立和修訂部署以包含 IP 偵測器。您可以使用 主控台 AWS CLI、 或 AWS API 來管理部署。如需詳細資訊，請參閱[建立部署](create-deployments.md)。

### 部署 IP 偵測器元件 （主控台）
<a name="deploy-ip-detector-console"></a>

1. 在[AWS IoT Greengrass 主控台](https://console.aws.amazon.com/greengrass)導覽功能表中，選擇**元件**。

1. 在**元件**頁面上，選擇**公有元件**索引標籤，然後選擇 **aws.greengrass.clientdevices.IPDetector**。

1. 在 **aws.greengrass.clientdevices.IPDetector** 頁面中，選擇**部署**。

1. <a name="deploy-component-choose-deployment-step"></a>從**新增至部署**中，選擇要修改的現有部署，或選擇建立新的部署，然後選擇**下一步**。

1. <a name="deploy-component-choose-target-step"></a>如果您選擇建立新的部署，請選擇部署的目標核心裝置或物件群組。在**指定目標**頁面的**部署目標**下，選擇核心裝置或物件群組，然後選擇**下一步**。

1. 在**選取元件**頁面上，確認已選取**aws.greengrass.clientdevices.IPDetector**元件，選擇**下一步**。

1. 在**設定元件**頁面上，選取 **aws.greengrass.clientdevices.IPDetector**，然後執行下列動作：

   1. 選擇**設定元件**。

   1. 在**設定aws.greengrass.clientdevices.IPDetector**模態、**組態更新**下，**在要合併的組態中**，您可以輸入組態更新來設定 IP 偵測器元件。您可以指定下列任何組態選項：
      + `defaultPort` – <a name="ip-detector-component-configuration-default-port-definition"></a>（選用） 此元件偵測到 IP 地址時要報告的 MQTT 代理程式連接埠。如果您將 MQTT 代理程式設定為使用與預設連接埠 8883 不同的連接埠，則必須指定此參數。
      + `includeIPv4LoopbackAddrs` – <a name="ip-detector-component-configuration-include-ipv4-loopback-addrs-definition"></a>（選用） 您可以啟用此選項來偵測和報告 IPv4 回送地址。這些是 IP 地址，例如 `localhost`，裝置可以自行通訊。在核心裝置和用戶端裝置在相同系統上執行的測試環境中使用此選項。
      + `includeIPv4LinkLocalAddrs` – <a name="ip-detector-component-configuration-include-ipv4-link-local-addrs-definition"></a>（選用） 您可以啟用此選項來偵測和報告 IPv4 [連結本機地址](https://en.wikipedia.org/wiki/Link-local_address)。如果核心裝置的網路沒有動態主機組態協定 (DHCP) 或靜態指派的 IP 地址，請使用此選項。
      + `includeIPv6LoopbackAddrs` – <a name="ip-detector-component-configuration-include-ipv6-loopback-addrs-definition"></a>（選用） 您可以啟用此選項來偵測和報告 IPv6 回送地址。這些是 IP 地址，例如 `localhost`，裝置可以自行通訊。在核心裝置和用戶端裝置在相同系統上執行的測試環境中使用此選項。您必須將 `includeIPv4Addrs` 設定為 `false`，並將 `includeIPv6Addrs` 設定為 `true`，才能使用此選項。您必須擁有 IP 偵測器 v2.2.0 或更新版本，才能使用此選項。
      + `includeIPv6LinkLocalAddrs` – <a name="ip-detector-component-configuration-include-ipv6-link-local-addrs-definition"></a>（選用） 您可以啟用此選項來偵測和報告 IPv6 [連結本機地址](https://en.wikipedia.org/wiki/Link-local_address)。如果核心裝置的網路沒有動態主機組態協定 (DHCP) 或靜態指派的 IP 地址，請使用此選項。您必須將 `includeIPv4Addrs` 設定為 `false`，並將 `includeIPv6Addrs` 設定為 `true`，才能使用此選項。您必須擁有 IP 偵測器 v2.2.0 或更新版本，才能使用此選項。
      + `includeIPv4Addrs` – <a name="ip-detector-component-configuration-include-ipv4-addrs-definition"></a>（選用） 預設值設為 true。您可以啟用此選項來發佈核心裝置上找到的 IPv4 地址。您必須擁有 IP 偵測器 v2.2.0 或更新版本，才能使用此選項。
      + `includeIPv6Addrs` – <a name="ip-detector-component-configuration-include-ipv6-addrs-definition"></a>（選用） 您可以啟用此選項來發佈核心裝置上找到的 IPv6 地址。`includeIPv4Addrs`設定為 `false` 以使用此選項。您必須擁有 IP 偵測器 v2.2.0 或更新版本，才能使用此選項。

      組態更新看起來可能會類似下列範例。

      ```
      {
        "defaultPort": "8883",
        "includeIPv4LoopbackAddrs": false,
        "includeIPv4LinkLocalAddrs": false
      }
      ```

   1. 選擇**確認**以關閉模態，然後選擇**下一步**。

1. <a name="deploy-component-configure-advanced-settings-step"></a>在**設定進階設定**頁面上，保留預設組態設定，然後選擇 **下一步**。

1. <a name="deploy-component-review-and-deploy-step"></a>在 **Review (檢閱)** 頁面，選擇 **Deploy (部署)**。

   部署可能需要一分鐘的時間才能完成。

### 部署 IP 偵測器元件 (AWS CLI)
<a name="deploy-ip-detector-cli"></a>

若要部署 IP 偵測器元件，請建立包含在 `components` 物件`aws.greengrass.clientdevices.IPDetector`中的部署文件，並指定元件的組態更新。遵循 中的指示[建立部署](create-deployments.md)建立新的部署或修改現有的部署。

您可以在建立部署文件時指定下列任一選項來設定 IP 偵測器元件：
+ `defaultPort` – <a name="ip-detector-component-configuration-default-port-definition"></a>（選用） 此元件偵測到 IP 地址時要報告的 MQTT 代理程式連接埠。如果您將 MQTT 代理程式設定為使用與預設連接埠 8883 不同的連接埠，則必須指定此參數。
+ `includeIPv4LoopbackAddrs` – <a name="ip-detector-component-configuration-include-ipv4-loopback-addrs-definition"></a>（選用） 您可以啟用此選項來偵測和報告 IPv4 回送地址。這些是 IP 地址，例如 `localhost`，裝置可以自行通訊。在核心裝置和用戶端裝置在相同系統上執行的測試環境中使用此選項。
+ `includeIPv4LinkLocalAddrs` – <a name="ip-detector-component-configuration-include-ipv4-link-local-addrs-definition"></a>（選用） 您可以啟用此選項來偵測和報告 IPv4 [連結本機地址](https://en.wikipedia.org/wiki/Link-local_address)。如果核心裝置的網路沒有動態主機組態協定 (DHCP) 或靜態指派的 IP 地址，請使用此選項。
+ `includeIPv6LoopbackAddrs` – <a name="ip-detector-component-configuration-include-ipv6-loopback-addrs-definition"></a>（選用） 您可以啟用此選項來偵測和報告 IPv6 回送地址。這些是 IP 地址，例如 `localhost`，裝置可以自行通訊。在核心裝置和用戶端裝置在相同系統上執行的測試環境中使用此選項。您必須將 `includeIPv4Addrs` 設定為 `false`，並將 `includeIPv6Addrs` 設定為 `true`，才能使用此選項。您必須擁有 IP 偵測器 v2.2.0 或更新版本，才能使用此選項。
+ `includeIPv6LinkLocalAddrs` – <a name="ip-detector-component-configuration-include-ipv6-link-local-addrs-definition"></a>（選用） 您可以啟用此選項來偵測和報告 IPv6 [連結本機地址](https://en.wikipedia.org/wiki/Link-local_address)。如果核心裝置的網路沒有動態主機組態協定 (DHCP) 或靜態指派的 IP 地址，請使用此選項。您必須將 `includeIPv4Addrs` 設定為 `false`，並將 `includeIPv6Addrs` 設定為 `true`，才能使用此選項。您必須擁有 IP 偵測器 v2.2.0 或更新版本，才能使用此選項。
+ `includeIPv4Addrs` – <a name="ip-detector-component-configuration-include-ipv4-addrs-definition"></a>（選用） 預設值設為 true。您可以啟用此選項來發佈核心裝置上找到的 IPv4 地址。您必須擁有 IP 偵測器 v2.2.0 或更新版本，才能使用此選項。
+ `includeIPv6Addrs` – <a name="ip-detector-component-configuration-include-ipv6-addrs-definition"></a>（選用） 您可以啟用此選項來發佈核心裝置上找到的 IPv6 地址。`includeIPv4Addrs`設定為 `false` 以使用此選項。您必須擁有 IP 偵測器 v2.2.0 或更新版本，才能使用此選項。

下列範例部分部署文件指定 將連接埠 8883 報告為 MQTT 代理程式連接埠。

```
{
  ...,
  "components": {
    ...,
    "aws.greengrass.clientdevices.IPDetector": {
      "componentVersion": "2.1.1",
      "configurationUpdate": {
        "merge": "{\"defaultPort\":\"8883\",}"
      }
    }
  }
}
```

## 手動管理端點
<a name="manually-manage-endpoints"></a>

您可以手動管理核心裝置的 MQTT 代理程式端點。

每個 MQTT 代理程式端點都有以下資訊：

**端點** (`HostAddress`)  
用戶端裝置可以連線到核心裝置上 MQTT 代理程式的 IP 地址或 DNS 地址。

**連接埠** (`PortNumber`)  
MQTT 中介裝置在核心裝置上操作的連接埠。  
您可以在預設使用連接埠 8883 的 [Moquette MQTT 代理程式元件](mqtt-broker-moquette-component.md)上設定此連接埠。

**中繼資料 **(`Metadata`)  
要提供給連接到此端點之用戶端裝置的其他中繼資料。

**Topics**
+ [管理端點 （主控台）](#manually-manage-endpoints-console)
+ [管理端點 (AWS CLI)](#manually-manage-endpoints-cli)
+ [管理端點 (API)](#manually-manage-endpoints-api)

### 管理端點 （主控台）
<a name="manually-manage-endpoints-console"></a>

您可以使用 AWS IoT Greengrass 主控台來檢視、更新和移除核心裝置的端點。

**管理核心裝置的端點 （主控台）**

1. <a name="navigate-greengrass-console"></a>導覽至 [AWS IoT Greengrass 主控台](https://console.aws.amazon.com/greengrass)。

1. 選擇**核心裝置**。

1. 選擇要管理的核心裝置。

1. 在核心裝置的詳細資訊頁面上，選擇**用戶端裝置**索引標籤。

1. 在 **MQTT 代理程式端點**區段中，您可以查看核心裝置的 MQTT 代理程式端點。選擇**管理端點**。

1. 在**管理端點**模態中，新增或移除核心裝置的 MQTT 代理程式端點。

1. 選擇**更新**。

### 管理端點 (AWS CLI)
<a name="manually-manage-endpoints-cli"></a>

您可以使用 AWS Command Line Interface (AWS CLI) 來管理核心裝置的端點。

**注意**  
由於 中的用戶端裝置支援 AWS IoT Greengrass V2 與 回溯相容 AWS IoT Greengrass V1，您可以使用 AWS IoT Greengrass V2 或 AWS IoT Greengrass V1 API 操作來管理核心裝置端點。

**取得核心裝置的端點 (AWS CLI)**
+ 使用下列其中一個命令：
  + [greengrassv2：get-connectivity-info](https://docs.aws.amazon.com/cli/latest/reference/greengrassv2/get-connectivity-info.html)
  + [greengrass：get-connectivity-info](https://docs.aws.amazon.com/cli/latest/reference/greengrass/get-connectivity-info.html)

**更新核心裝置的端點 (AWS CLI)**
+ 使用下列其中一個命令：
  + [greengrassv2：update-connectivity-info](https://docs.aws.amazon.com/cli/latest/reference/greengrassv2/update-connectivity-info.html)
  + [greengrass：update-connectivity-info](https://docs.aws.amazon.com/cli/latest/reference/greengrass/update-connectivity-info.html)

### 管理端點 (API)
<a name="manually-manage-endpoints-api"></a>

您可以使用 AWS API 來管理核心裝置的端點。

**注意**  
由於 中的用戶端裝置支援 AWS IoT Greengrass V2 與 回溯相容 AWS IoT Greengrass V1，您可以使用 AWS IoT Greengrass V2 或 AWS IoT Greengrass V1 API 操作來管理核心裝置端點。

**取得核心裝置 (AWS API) 的端點**
+ 使用下列任一操作：
  + [V2：GetConnectivityInfo](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_GetConnectivityInfo.html)
  + [V1：GetConnectivityInfo](https://docs.aws.amazon.com/greengrass/v1/apireference/getconnectivityinfo-get.html)

**更新核心裝置 (AWS API) 的端點**
+ 使用下列任一操作：
  + [V2：UpdateConnectivityInfo](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_UpdateConnectivityInfo.html)
  + [V1：UpdateConnectivityInfo](https://docs.aws.amazon.com/greengrass/v1/apireference/updateconnectivityinfo-put.html)

# 選擇 MQTT 代理程式
<a name="choose-local-mqtt-broker"></a>

AWS IoT Greengrass 提供選項，讓您選擇要在核心裝置上執行的本機 MQTT 代理程式。用戶端裝置會連線至核心裝置上執行的 MQTT 代理程式，因此請選擇與您要連線的用戶端裝置相容的 MQTT 代理程式。

**注意**  <a name="note-deploy-one-mqtt-broker"></a>
我們建議您僅部署一個 MQTT 代理程式元件。[MQTT 橋接](mqtt-bridge-component.md)器和 [IP 偵測器](ip-detector-component.md)元件一次只能使用一個 MQTT 代理程式元件。如果您部署多個 MQTT 代理程式元件，則必須將其設定為使用不同的連接埠。

您可以從下列 MQTT 代理程式中選擇：
+ **[MQTT 3.1.1 代理程式 (Moquette)](mqtt-broker-moquette-component.md)** – `aws.greengrass.clientdevices.mqtt.Moquette`

  針對符合 MQTT 3.1.1 標準的輕量型 MQTT 代理程式選擇此選項。 AWS IoT Core MQTT 代理程式和 AWS IoT Device SDK 也符合 MQTT 3.1.1 標準，因此您可以使用這些功能來建立應用程式，在您的裝置和 中使用 MQTT 3.1.1。 AWS 雲端
+ **[MQTT 5 代理程式 (EMQX)](mqtt-broker-emqx-component.md)** – `aws.greengrass.clientdevices.mqtt.EMQX`

  選擇此選項以使用核心裝置和用戶端裝置之間的 MQTT 5 功能進行通訊。此元件使用的資源比 Moquette MQTT 3.1.1 代理程式多，在 Linux 核心裝置上需要 Docker。

  MQTT 5 與 MQTT 3.1.1 向後相容，因此您可以將使用 MQTT 3.1.1 的用戶端裝置連接到此代理程式。如果您執行 Moquette MQTT 3.1.1 代理程式，則可以將其取代為 EMQX MQTT 5 代理程式，而且用戶端裝置可以繼續如常連線和操作。

  <a name="note-local-mqtt-broker-mqtt-5-features"></a>
+ **實作自訂代理程式**

  選擇此選項可建立自訂本機代理程式元件，以與用戶端裝置通訊。您可以建立使用 MQTT 以外通訊協定的自訂本機代理程式。 AWS IoT Greengrass 提供元件 SDK，可用來驗證和授權用戶端裝置。如需詳細資訊，請參閱 [使用 AWS IoT Device SDK 與 Greengrass 核、其他元件和 通訊 AWS IoT Core與 Greengrass 核、其他元件和 通訊 AWS IoT Core](interprocess-communication.md) 和 [驗證和授權用戶端裝置](ipc-client-device-auth.md)。

# 使用 MQTT 代理程式將用戶端裝置連接至 AWS IoT Greengrass Core 裝置
<a name="connecting-to-mqtt"></a>

當您在 AWS IoT Greengrass Core 裝置上使用 MQTT 代理程式時，裝置會使用裝置特有*的核心裝置憑證授權機構 (CA)*，向代理程式發出憑證，以便與用戶端進行交互 TLS 連線。

AWS IoT Greengrass 會自動產生核心裝置 CA，您也可以提供自己的 CA。連接[用戶端裝置身分驗證](client-device-auth-component.md)元件 AWS IoT Greengrass 時，核心裝置 CA 會向 註冊。自動產生的核心裝置 CA 為持久性，只要已設定用戶端裝置驗證元件，裝置就會繼續使用相同的 CA。

當 MQTT 代理程式啟動時，它會請求憑證。用戶端裝置身分驗證元件會使用核心裝置 CA 發行 X.509 憑證。代理程式啟動、憑證過期或 IP 地址等連線資訊變更時，會輪換憑證。如需詳細資訊，請參閱[本機 MQTT 代理程式上的憑證輪換](device-auth.md#mqtt-certificate-expiration)。

若要將用戶端連線至 MQTT 代理程式，您需要下列項目：
+ 用戶端裝置必須具有 AWS IoT Greengrass Core 裝置 CA。您可以透過雲端探索或手動提供 CA 來取得此 CA。如需詳細資訊，請參閱[使用您自己的憑證授權單位](#use-your-own-CA)。
+ 核心裝置的完整網域名稱 (FQDN) 或 IP 地址必須存在於核心裝置 CA 發行的代理程式憑證中。您可以使用 [IP 偵測器](ip-detector-component.md)元件或手動設定 IP 地址來確保這一點。如需詳細資訊，請參閱[管理核心裝置端點](manage-core-device-endpoints.md)。
+ 用戶端裝置身分驗證元件必須授予用戶端裝置連線至 Greengrass 核心裝置的許可。如需詳細資訊，請參閱[用戶端裝置身分驗證](client-device-auth-component.md)。

## 使用您自己的憑證授權單位
<a name="use-your-own-CA"></a>

如果您的用戶端裝置無法存取雲端來探索您的核心裝置，您可以提供*核心裝置憑證授權單位 (CA)*。您的 Greengrass 核心裝置使用核心裝置 CA 為您的 MQTT 代理程式發行憑證。設定核心裝置並以其 CA 佈建用戶端裝置後，您的用戶端裝置就可以連線至端點，並使用核心裝置 CA （已提供 CA 或自動產生） 驗證 TLS 交握。

若要設定[用戶端裝置身分驗證](client-device-auth-component.md)元件以使用您的核心裝置 CA，請在部署元件時設定`certificateAuthority`組態參數。您必須在組態期間提供下列詳細資訊：
+ 核心裝置 CA 憑證的位置。
+ 核心裝置 CA 憑證的私有金鑰。
+ （選用） 如果核心裝置 CA 是中繼 CA，則為根憑證的憑證鏈結。

如果您提供核心裝置 CA， 會將 CA AWS IoT Greengrass 註冊至雲端。

您可以將憑證存放在硬體安全模組或檔案系統上。下列範例顯示使用 HSM/TPM 存放的中繼 CA `certificateAuthority`組態。請注意，憑證鏈只能存放在磁碟上。

```
  "certificateAuthority": {
      "certificateUri": "pkcs11:object=CustomerIntermediateCA;type=cert",
      "privateKeyUri": "pkcs11:object=CustomerIntermediateCA;type=private"
      "certificateChainUri": "file:///home/ec2-user/creds/certificateChain.pem",
    }
```

在此範例中，`certificateAuthority`組態參數會將用戶端裝置身分驗證元件設定為使用檔案系統的中繼 CA：

```
  "certificateAuthority": {
      "certificateUri": "file:///home/ec2-user/creds/intermediateCA.pem",
      "privateKeyUri": "file:///home/ec2-user/creds/intermediateCA.privateKey.pem",
      "certificateChainUri": "file:///home/ec2-user/creds/certificateChain.pem",
    }
```

若要將裝置連接到您的 AWS IoT Greengrass Core 裝置，請執行下列動作：

1. 使用組織的根 CA 為 Greengrass 核心裝置建立中繼憑證授權機構 (CA)。我們建議您使用中繼 CA 做為安全最佳實務。

1. 將中繼 CA 憑證、私有金鑰和憑證鏈提供給 Greengrass 核心裝置的根 CA。如需詳細資訊，請參閱[用戶端裝置身分驗證](client-device-auth-component.md)。中繼 CA 會成為 Greengrass 核心裝置的核心裝置 CA，而裝置會向該 CA 註冊 AWS IoT Greengrass。

1. 將用戶端裝置註冊為 AWS IoT 物件。如需詳細資訊，請參閱《 *AWS IoT Core 開發人員指南*》中的[建立物件](https://docs.aws.amazon.com/iot/latest/developerguide/create-iot-resources.html#create-aws-thing)。將私有金鑰、公有金鑰、裝置憑證和根 CA 憑證新增至您的用戶端裝置。如何新增資訊取決於您的裝置和軟體。

設定裝置後，您可以使用憑證和公有金鑰鏈連線到 Greengrass 核心裝置。您的軟體負責尋找核心裝置端點。您可以手動設定核心裝置的端點。如需詳細資訊，請參閱[手動管理端點](manage-core-device-endpoints.md#manually-manage-endpoints)。

# 測試用戶端裝置通訊
<a name="test-client-device-communications"></a>

用戶端裝置可以使用 AWS IoT Device SDK 來探索、連線核心裝置，以及與核心裝置通訊。您可以在 中使用 Greengrass 探索用戶端 AWS IoT Device SDK 來使用 [Greengrass 探索 API](greengrass-discover-api.md)，這會傳回用戶端裝置可連線之核心裝置的相關資訊。API 回應包含要連線的 MQTT 代理程式端點，以及用來驗證每個核心裝置的身分的憑證。然後，用戶端裝置可以嘗試每個端點，直到成功連接到核心裝置為止。

用戶端裝置只能探索與之建立關聯的核心裝置。在測試用戶端裝置與核心裝置之間的通訊之前，您必須將用戶端裝置與核心裝置建立關聯。如需詳細資訊，請參閱[關聯用戶端裝置](associate-client-devices.md)。

Greengrass 探索 API 會傳回您指定的核心裝置 MQTT 代理程式端點。您可以使用 [IP 偵測器元件](ip-detector-component.md)來為您管理這些端點，也可以為每個核心裝置手動管理它們。如需詳細資訊，請參閱[管理核心裝置端點](manage-core-device-endpoints.md)。

**注意**  
若要使用 Greengrass 探索 API，用戶端裝置必須具有 `greengrass:Discover`許可。如需詳細資訊，請參閱[用戶端裝置的最低 AWS IoT 政策](device-auth.md#client-device-minimal-iot-policy)。

 AWS IoT Device SDK 提供多種程式設計語言。如需詳細資訊，請參閱《 *AWS IoT Core 開發人員指南*[AWS IoT 》中的 裝置SDKs](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html)。

**Topics**
+ [測試通訊 (Python)](#test-client-device-communications-python)
+ [測試通訊 (C\$1\$1)](#test-client-device-communications-cpp)
+ [測試通訊 (JavaScript)](#test-client-device-communications-javascript)
+ [測試通訊 (Java)](#test-client-device-communications-java)

## 測試通訊 (Python)
<a name="test-client-device-communications-python"></a>

在本節中，您會在適用於 [AWS IoT Device SDK Python 的 v2](https://github.com/aws/aws-iot-device-sdk-python-v2) 中使用 Greengrass 探索範例來測試用戶端裝置與核心裝置之間的通訊。

**重要**  
若要使用 AWS IoT Device SDK v2 for Python，裝置必須執行 Python 3.6 或更新版本。

**測試通訊 (AWS IoT Device SDK v2 for Python)**

1. <a name="download-iot-device-sdk-python-v2"></a>下載並安裝適用於 [AWS IoT Device SDK Python 的 v2](https://github.com/aws/aws-iot-device-sdk-python-v2) 至 AWS IoT 物件，以做為用戶端裝置進行連線。

   在用戶端裝置上，執行下列動作：

   1. 複製 AWS IoT Device SDK v2 for Python 儲存庫以進行下載。

      ```
      git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git
      ```

   1. 安裝 AWS IoT Device SDK v2 for Python。

      ```
      python3 -m pip install --user ./aws-iot-device-sdk-python-v2
      ```

1. <a name="cd-iot-device-sdk-python-v2"></a>變更為 AWS IoT Device SDK v2 for Python 中的範例資料夾。

   ```
   cd aws-iot-device-sdk-python-v2/samples/greengrass
   ```

1. <a name="test-client-device-communications-application-intro"></a>執行範例 Greengrass 探索應用程式。此應用程式需要指定用戶端裝置物件名稱的引數、要使用的 MQTT 主題和訊息，以及驗證和保護連線的憑證。下列範例會將 Hello World 訊息傳送至 `clients/MyClientDevice1/hello/world`主題。<a name="test-client-device-communications-application-command-replace"></a>
   + 將 *MyClientDevice1* 取代為用戶端裝置的物件名稱。
   + 將 *\$1/certs/AmazonRootCA1.pem* 取代為用戶端裝置上 Amazon 根 CA 憑證的路徑。
   + 將 *\$1/certs/device.pem.crt* 取代為用戶端裝置上裝置憑證的路徑。
   + 將 *\$1/certs/private.pem.key* 取代為用戶端裝置上私有金鑰檔案的路徑。
   + 將 *us-east-1* 取代為用戶端裝置和核心裝置操作所在的 AWS 區域。

   ```
   python3 basic_discovery.py \\
     --thing_name MyClientDevice1 \\
     --topic 'clients/MyClientDevice1/hello/world' \\
     --message 'Hello World!' \\
     --ca_file ~/certs/AmazonRootCA1.pem \\
     --cert ~/certs/device.pem.crt \\
     --key ~/certs/private.pem.key \\
     --region us-east-1 \\
     --verbosity Warn
   ```

   <a name="test-client-device-communications-application-output-intro"></a>探索範例應用程式會傳送訊息 10 次並中斷連線。它也會訂閱發佈訊息的相同主題。如果輸出指出應用程式收到有關主題的 MQTT 訊息，用戶端裝置可以成功與核心裝置通訊。

   ```
   Performing greengrass discovery...
   awsiot.greengrass_discovery.DiscoverResponse(gg_groups=[awsiot.greengrass_discovery.GGGroup(gg_group_id='greengrassV2-coreDevice-MyGreengrassCore', cores=[awsiot.greengrass_discovery.GGCore(thing_arn='arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore', connectivity=[awsiot.greengrass_discovery.ConnectivityInfo(id='203.0.113.0', host_address='203.0.113.0', metadata='', port=8883)])], certificate_authorities=['-----BEGIN CERTIFICATE-----\
   MIICiT...EXAMPLE=\
   -----END CERTIFICATE-----\
   '])])
   Trying core arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore at host 203.0.113.0 port 8883
   Connected!
   Published topic clients/MyClientDevice1/hello/world: {"message": "Hello World!", "sequence": 0}
   
   Publish received on topic clients/MyClientDevice1/hello/world
   b'{"message": "Hello World!", "sequence": 0}'
   Published topic clients/MyClientDevice1/hello/world: {"message": "Hello World!", "sequence": 1}
   
   Publish received on topic clients/MyClientDevice1/hello/world
   b'{"message": "Hello World!", "sequence": 1}'
   
   ...
   
   Published topic clients/MyClientDevice1/hello/world: {"message": "Hello World!", "sequence": 9}
   
   Publish received on topic clients/MyClientDevice1/hello/world
   b'{"message": "Hello World!", "sequence": 9}'
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>如果應用程式輸出錯誤，請參閱[故障診斷 Greengrass 探索問題](troubleshooting-client-devices.md#greengrass-discovery-issues)。

   <a name="test-client-device-communications-application-view-core-logs"></a>您也可以在核心裝置上檢視 Greengrass 日誌，以驗證用戶端裝置是否成功連線並傳送訊息。如需詳細資訊，請參閱[監控 AWS IoT Greengrass 日誌](monitor-logs.md)。

## 測試通訊 (C\$1\$1)
<a name="test-client-device-communications-cpp"></a>

在本節中，您會在適用於 [AWS IoT Device SDK C\$1\$1 的 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2) 中使用 Greengrass 探索範例來測試用戶端裝置與核心裝置之間的通訊。

<a name="iot-device-sdk-cpp-v2-build-requirements-intro"></a>若要建置適用於 C\$1\$1 的 AWS IoT Device SDK v2，裝置必須具有下列工具：<a name="iot-device-sdk-cpp-v2-build-requirements"></a>
+ C\$1\$1 11 或更新版本
+ CMake 3.1 或更新版本
+ 下列其中一個編譯器：
  + GCC 4.8 或更新版本
  + Clang 3.9 或更新版本
  + MSVC 2015 或更新版本

**測試通訊 （適用於 C\$1\$1 的AWS IoT Device SDK v2)**

1. 下載並建置適用於 [AWS IoT Device SDK C\$1\$1 的 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2) 至 AWS IoT 物件，以做為用戶端裝置進行連線。

   在用戶端裝置上，執行下列動作：

   1. 建立適用於 C\$1\$1 工作區的 AWS IoT Device SDK v2 資料夾，然後變更為該資料夾。

      ```
      cd
      mkdir iot-device-sdk-cpp
      cd iot-device-sdk-cpp
      ```

   1. 複製適用於 C\$1\$1 儲存庫的 AWS IoT Device SDK v2 以進行下載。`--recursive` 旗標指定 下載子模組。

      ```
      git clone --recursive https://github.com/aws/aws-iot-device-sdk-cpp-v2.git
      ```

   1. 為 AWS IoT Device SDK v2 建立 C\$1\$1 組建輸出的資料夾，然後變更為該資料夾。

      ```
      mkdir aws-iot-device-sdk-cpp-v2-build
      cd aws-iot-device-sdk-cpp-v2-build
      ```

   1. 建置適用於 C\$1\$1 的 AWS IoT Device SDK v2。

      ```
      cmake -DCMAKE_INSTALL_PREFIX="~/iot-device-sdk-cpp" -DCMAKE_BUILD_TYPE="Release" ../aws-iot-device-sdk-cpp-v2
      cmake --build . --target install
      ```

1. 在適用於 C\$1\$1 的 AWS IoT Device SDK v2 中建置 Greengrass 探索範例應用程式。請執行下列操作：

   1. 變更為適用於 C\$1\$1 的 AWS IoT Device SDK v2 中的 Greengrass 探索範例資料夾。

      ```
      cd ../aws-iot-device-sdk-cpp-v2/samples/greengrass/basic_discovery
      ```

   1. 建立 Greengrass 探索範例建置輸出的資料夾，然後變更為該資料夾。

      ```
      mkdir build
      cd build
      ```

   1. 建置 Greengrass 探索範例應用程式。

      ```
      cmake -DCMAKE_PREFIX_PATH="~/iot-device-sdk-cpp" -DCMAKE_BUILD_TYPE="Release" ..
      cmake --build . --config "Release"
      ```

1. <a name="test-client-device-communications-application-scanner-intro"></a>執行範例 Greengrass 探索應用程式。此應用程式預期引數會指定用戶端裝置物件名稱、要使用的 MQTT 主題，以及驗證和保護連線的憑證。下列範例會訂閱`clients/MyClientDevice1/hello/world`主題，並將您在命令列中輸入的訊息發佈至相同的主題。<a name="test-client-device-communications-application-command-replace"></a>
   + 將 *MyClientDevice1* 取代為用戶端裝置的物件名稱。
   + 將 *\$1/certs/AmazonRootCA1.pem* 取代為用戶端裝置上 Amazon 根 CA 憑證的路徑。
   + 將 *\$1/certs/device.pem.crt* 取代為用戶端裝置上裝置憑證的路徑。
   + 將 *\$1/certs/private.pem.key* 取代為用戶端裝置上私有金鑰檔案的路徑。
   + 將 *us-east-1* 取代為用戶端裝置和核心裝置操作所在的 AWS 區域。

   ```
   ./basic-discovery \
     --thing_name MyClientDevice1 \
     --topic 'clients/MyClientDevice1/hello/world' \
     --ca_file ~/certs/AmazonRootCA1.pem \
     --cert ~/certs/device.pem.crt \
     --key ~/certs/private.pem.key \
     --region us-east-1
   ```

   <a name="test-client-device-communications-application-scanner-output-intro"></a>探索範例應用程式會訂閱主題，並提示您輸入要發佈的訊息。

   ```
   Connecting to group greengrassV2-coreDevice-MyGreengrassCore with thing arn arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore, using endpoint 203.0.113.0:8883
   Connected to group greengrassV2-coreDevice-MyGreengrassCore, using connection to 203.0.113.0:8883
   Successfully subscribed to clients/MyClientDevice1/hello/world
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press enter. Enter 'exit' to exit this program.
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>如果應用程式輸出錯誤，請參閱[故障診斷 Greengrass 探索問題](troubleshooting-client-devices.md#greengrass-discovery-issues)。

1. <a name="test-client-device-communications-application-scanner-input"></a>輸入訊息，例如 **Hello World\$1**。

   ```
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press enter. Enter 'exit' to exit this program.
   Hello World!
   ```

   <a name="test-client-device-communications-application-scanner-input-output"></a>如果輸出指出應用程式收到主題的 MQTT 訊息，用戶端裝置可以成功與核心裝置通訊。

   ```
   Operation on packetId 2 Succeeded
   Publish received on topic clients/MyClientDevice1/hello/world
   Message:
   Hello World!
   ```

   <a name="test-client-device-communications-application-view-core-logs"></a>您也可以在核心裝置上檢視 Greengrass 日誌，以驗證用戶端裝置是否成功連線並傳送訊息。如需詳細資訊，請參閱[監控 AWS IoT Greengrass 日誌](monitor-logs.md)。

## 測試通訊 (JavaScript)
<a name="test-client-device-communications-javascript"></a>

在本節中，您會在適用於 [AWS IoT Device SDK JavaScript 的 v2](https://github.com/aws/aws-iot-device-sdk-js-v2) 中使用 Greengrass 探索範例來測試用戶端裝置與核心裝置之間的通訊。

**重要**  
若要使用 AWS IoT Device SDK v2 for JavaScript，裝置必須執行 Node v10.0 或更新版本。

**測試通訊 （適用於 JavaScript 的AWS IoT Device SDK v2)**

1. 下載並安裝適用於 [AWS IoT Device SDK JavaScript 的 v2](https://github.com/aws/aws-iot-device-sdk-js-v2) 至 AWS IoT 物件，以做為用戶端裝置進行連線。

   在用戶端裝置上，執行下列動作：

   1. 複製 AWS IoT Device SDK v2 for JavaScript 儲存庫以進行下載。

      ```
      git clone https://github.com/aws/aws-iot-device-sdk-js-v2.git
      ```

   1. 安裝適用於 JavaScript 的 AWS IoT Device SDK v2。

      ```
      cd aws-iot-device-sdk-js-v2
      npm install
      ```

1. 變更為適用於 JavaScript 的 AWS IoT Device SDK v2 中的 Greengrass 探索範例資料夾。

   ```
   cd samples/node/greengrass/basic_discovery
   ```

1. 安裝 Greengrass 探索範例應用程式。

   ```
   npm install
   ```

1. <a name="test-client-device-communications-application-intro"></a>執行範例 Greengrass 探索應用程式。此應用程式需要指定用戶端裝置物件名稱的引數、要使用的 MQTT 主題和訊息，以及驗證和保護連線的憑證。下列範例會將 Hello World 訊息傳送至 `clients/MyClientDevice1/hello/world`主題。<a name="test-client-device-communications-application-command-replace"></a>
   + 將 *MyClientDevice1* 取代為用戶端裝置的物件名稱。
   + 將 *\$1/certs/AmazonRootCA1.pem* 取代為用戶端裝置上 Amazon 根 CA 憑證的路徑。
   + 將 *\$1/certs/device.pem.crt* 取代為用戶端裝置上裝置憑證的路徑。
   + 將 *\$1/certs/private.pem.key* 取代為用戶端裝置上私有金鑰檔案的路徑。
   + 將 *us-east-1* 取代為您的用戶端裝置和核心裝置操作 AWS 的區域。

   ```
   node dist/index.js \
     --thing_name MyClientDevice1 \
     --topic 'clients/MyClientDevice1/hello/world' \
     --message 'Hello World!' \
     --ca_file ~/certs/AmazonRootCA1.pem \
     --cert ~/certs/device.pem.crt \
     --key ~/certs/private.pem.key \
     --region us-east-1 \
     --verbose warn
   ```

   <a name="test-client-device-communications-application-output-intro"></a>探索範例應用程式會傳送訊息 10 次並中斷連線。它也會訂閱發佈訊息的相同主題。如果輸出指出應用程式收到有關主題的 MQTT 訊息，用戶端裝置可以成功與核心裝置通訊。

   ```
   Discovery Response:
   {"gg_groups":[{"gg_group_id":"greengrassV2-coreDevice-MyGreengrassCore","cores":[{"thing_arn":"arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore","connectivity":[{"id":"203.0.113.0","host_address":"203.0.113.0","port":8883,"metadata":""}]}],"certificate_authorities":["-----BEGIN CERTIFICATE-----\nMIICiT...EXAMPLE=\n-----END CERTIFICATE-----\n"]}]}
   Trying endpoint={"id":"203.0.113.0","host_address":"203.0.113.0","port":8883,"metadata":""}
   [WARN] [2021-06-12T00:46:45Z] [00007f90c0e8d700] [socket] - id=0x7f90b8018710 fd=26: setsockopt() for NO_SIGNAL failed with errno 92. If you are having SIGPIPE signals thrown, you may want to install a signal trap in your application layer.
   Connected to endpoint={"id":"203.0.113.0","host_address":"203.0.113.0","port":8883,"metadata":""}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":1}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":2}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":3}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":4}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":5}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":6}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":7}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":8}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":9}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":10}
   Complete!
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>如果應用程式輸出錯誤，請參閱[故障診斷 Greengrass 探索問題](troubleshooting-client-devices.md#greengrass-discovery-issues)。

   <a name="test-client-device-communications-application-view-core-logs"></a>您也可以在核心裝置上檢視 Greengrass 日誌，以驗證用戶端裝置是否成功連線並傳送訊息。如需詳細資訊，請參閱[監控 AWS IoT Greengrass 日誌](monitor-logs.md)。

## 測試通訊 (Java)
<a name="test-client-device-communications-java"></a>

在本節中，您會在適用於 [AWS IoT Device SDK Java 的 v2](https://github.com/aws/aws-iot-device-sdk-java-v2) 中使用 Greengrass 探索範例來測試用戶端裝置與核心裝置之間的通訊。

**重要**  
若要建置適用於 Java 的 AWS IoT Device SDK v2，裝置必須具有下列工具：  
Java 8 或更新版本，並`JAVA_HOME`指向 Java 資料夾。
Apache Maven

**測試通訊 (AWS IoT Device SDK v2 for Java)**

1. 下載並建置適用於 [AWS IoT Device SDK Java 的 v2](https://github.com/aws/aws-iot-device-sdk-java-v2) 至 AWS IoT 物件，以做為用戶端裝置進行連線。

   在用戶端裝置上，執行下列動作：

   1. 複製 AWS IoT Device SDK v2 for Java 儲存庫以進行下載。

      ```
      git clone https://github.com/aws/aws-iot-device-sdk-java-v2.git
      ```

   1. 變更為 AWS IoT Device SDK v2 for Java 資料夾。

   1. 建置適用於 Java 的 AWS IoT Device SDK v2。

      ```
      cd aws-iot-device-sdk-java-v2
      mvn versions:use-latest-versions -Dincludes="software.amazon.awssdk.crt*"
      mvn clean install
      ```

1. <a name="test-client-device-communications-application-scanner-intro"></a>執行範例 Greengrass 探索應用程式。此應用程式需要指定用戶端裝置物件名稱的引數、要使用的 MQTT 主題，以及驗證和保護連線的憑證。下列範例會訂閱`clients/MyClientDevice1/hello/world`主題，並將您在命令列中輸入的訊息發佈至相同的主題。<a name="test-client-device-communications-application-command-replace"></a>
   + 以用戶端裝置的物件名稱取代 *MyClientDevice1* 的兩個執行個體。
   + 將 *\$1HOME/certs/AmazonRootCA1.pem* 取代為用戶端裝置上 Amazon 根 CA 憑證的路徑。
   + 將 *\$1HOME/certs/device.pem.crt* 取代為用戶端裝置上裝置憑證的路徑。
   + 將 *\$1HOME/certs/private.pem.key* 取代為用戶端裝置上的私有金鑰檔案路徑。
   + 將 *us-east-1* 取代為您的用戶端裝置和核心裝置操作 AWS 區域 所在的 。

   ```
   DISCOVERY_SAMPLE_ARGS="--thing_name MyClientDevice1 \
     --topic 'clients/MyClientDevice1/hello/world' \
     --ca_file $HOME/certs/AmazonRootCA1.pem \
     --cert $HOME/certs/device.pem.crt \
     --key $HOME/certs/private.pem.key \
     --region us-east-1"
   
   mvn exec:java -pl samples/Greengrass/Discovery \
     -Dexec.mainClass=greengrass.BasicDiscovery \
     -Dexec.args="$DISCOVERY_SAMPLE_ARGS"
   ```

   <a name="test-client-device-communications-application-scanner-output-intro"></a>探索範例應用程式會訂閱主題，並提示您輸入要發佈的訊息。

   ```
   Connecting to group ID greengrassV2-coreDevice-MyGreengrassCore, with thing arn arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore, using endpoint 203.0.113.0:8883
   Started a clean session
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press Enter. Type 'exit' or 'quit' to exit this program:
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>如果應用程式輸出錯誤，請參閱[故障診斷 Greengrass 探索問題](troubleshooting-client-devices.md#greengrass-discovery-issues)。

1. <a name="test-client-device-communications-application-scanner-input"></a>輸入訊息，例如 **Hello World\$1**。

   ```
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press Enter. Type 'exit' or 'quit' to exit this program:
   Hello World!
   ```

   <a name="test-client-device-communications-application-scanner-input-output"></a>如果輸出指出應用程式收到主題的 MQTT 訊息，用戶端裝置可以成功與核心裝置通訊。

   ```
   Message received on topic clients/MyClientDevice1/hello/world: Hello World!
   ```

   <a name="test-client-device-communications-application-view-core-logs"></a>您也可以在核心裝置上檢視 Greengrass 日誌，以驗證用戶端裝置是否成功連線並傳送訊息。如需詳細資訊，請參閱[監控 AWS IoT Greengrass 日誌](monitor-logs.md)。

# Greengrass 探索 RESTful API
<a name="greengrass-discover-api"></a>

AWS IoT Greengrass 提供用戶端裝置可用來識別 Greengrass 核心裝置連線的 `Discover` API 操作。用戶端裝置會使用此資料平面操作來擷取連線至 Greengrass 核心裝置所需的資訊，您可以將它們與 [BatchAssociateClientDeviceWithCoreDevice](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchAssociateClientDeviceWithCoreDevice.html) API 操作建立關聯。當用戶端裝置上線時，可以連線至 AWS IoT Greengrass 雲端服務，並使用 探索 API 來尋找：
+ 每個相關聯 Greengrass 核心裝置的 IP 地址和連接埠。
+ 核心裝置 CA 憑證，用戶端裝置可用來驗證 Greengrass 核心裝置。

**注意**  
用戶端裝置也可以使用 中的探索用戶端 AWS IoT Device SDK 來探索 Greengrass 核心裝置的連線資訊。探索用戶端使用探索 API。如需詳細資訊，請參閱下列內容：  
[測試用戶端裝置通訊](test-client-device-communications.md)
《 *AWS IoT Greengrass Version 1 開發人員指南*》中的 [Greengrass 探索 RESTful API](https://docs.aws.amazon.com/greengrass/v1/developerguide/gg-discover-api.html)。

若要使用此 API 操作，請將 HTTP 請求傳送至 Greengrass 資料平面端點上的探索 API。此 API 端點的格式如下。

```
https://greengrass-ats.iot.region.amazonaws.com:port/greengrass/discover/thing/thing-name
```

如需 AWS IoT Greengrass 探索 API 支援 AWS 區域 和端點的清單，請參閱 中的[AWS IoT Greengrass V2 端點和配額](https://docs.aws.amazon.com/general/latest/gr/greengrassv2.html)*AWS 一般參考*。此 API 操作僅適用於 Greengrass 資料平面端點。您用來管理元件和部署的控制平面端點與資料平面端點不同。

**注意**  
 AWS IoT Greengrass V1 和 的探索 API 相同 AWS IoT Greengrass V2。如果您有連接到 AWS IoT Greengrass V1 核心的用戶端裝置，您可以將它們連接到 AWS IoT Greengrass V2 核心裝置，而無需變更用戶端裝置上的程式碼。如需詳細資訊，請參閱《 *AWS IoT Greengrass Version 1 開發人員指南*》中的 [Greengrass 探索 RESTful API](https://docs.aws.amazon.com/greengrass/v1/developerguide/gg-discover-api.html)。

**Topics**
+ [探索身分驗證和授權](#greengrass-discover-auth)
+ [請求](#greengrass-discover-request)
+ [回應](#greengrass-discover-response)
+ [使用 cURL 測試探索 API](#greengrass-discover-test-request)

## 探索身分驗證和授權
<a name="greengrass-discover-auth"></a>

若要使用 探索 API 擷取連線資訊，用戶端裝置必須使用 TLS 交互身分驗證搭配 X.509 用戶端憑證進行身分驗證。如需詳細資訊，請參閱《 *AWS IoT Core 開發人員指南*》中的 [X.509 用戶端憑證](https://docs.aws.amazon.com/iot/latest/developerguide/x509-client-certs.html)。

用戶端裝置也必須具有執行 `greengrass:Discover`動作的許可。下列範例 AWS IoT 政策允許名為 的 AWS IoT 物件`Discover`自行`MyClientDevice1`執行。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "greengrass:Discover",
      "Resource": [
        "arn:aws:iot:us-west-2:123456789012:thing/MyClientDevice1"
      ]
    }
  ]
}
```

------

**重要**  
<a name="thing-policy-variable-not-supported"></a>核心裝置或 Greengrass 資料平面操作的政策中不支援 的[物件政策變數](https://docs.aws.amazon.com/iot/latest/developerguide/thing-policy-variables.html) (`iot:Connection.Thing.*`)。 AWS IoT 反之，您可以使用與具有類似名稱的多個裝置相符的萬用字元。例如，您可以指定 `MyGreengrassDevice*`來比對 `MyGreengrassDevice1`、 `MyGreengrassDevice2`等。

如需詳細資訊，請參閱《 *AWS IoT Core 開發人員指南*》中的[AWS IoT Core 政策](https://docs.aws.amazon.com/iot/latest/developerguide/iot-policies.html)。

## 請求
<a name="greengrass-discover-request"></a>

請求包含標準 HTTP 標頭，並傳送至 Greengrass 探索端點，如下列範例所示。

連接埠號碼取決於核心裝置是否設定為透過連接埠 8443 或連接埠 443 傳送 HTTPS 流量。如需詳細資訊，請參閱[連線至連接埠 443 或透過網路代理](configure-greengrass-core-v2.md#configure-alpn-network-proxy)。

**注意**  
這些範例使用 Amazon Trust Services (ATS) 端點，其可與建議的 ATS 根 CA 憑證搭配使用。端點必須符合根 CA 憑證類型。

連接埠 8443  

```
HTTP GET https://greengrass-ats.iot.region.amazonaws.com:8443/greengrass/discover/thing/thing-name
```

連接埠 443  

```
HTTP GET https://greengrass-ats.iot.region.amazonaws.com:443/greengrass/discover/thing/thing-name
```
在連接埠 443 上連線的用戶端必須實作 [Application Layer Protocol Negotiation (ALPN)](https://tools.ietf.org/html/rfc7301) TLS 延伸模組，並在 `ProtocolName`中`x-amzn-http-ca`做為 傳遞`ProtocolNameList`。如需詳細資訊，請參閱《 *AWS IoT 開發人員指南*》中的[通訊協定](https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html)。

## 回應
<a name="greengrass-discover-response"></a>

成功時，回應標頭會包含 HTTP 200 狀態碼，而回應內文會包含探索回應文件。

**注意**  
由於 AWS IoT Greengrass V2 使用與 相同的探索 API AWS IoT Greengrass V1，因此回應會根據 AWS IoT Greengrass V1 概念組織資訊，例如 Greengrass 群組。回應包含 Greengrass 群組的清單。在 中 AWS IoT Greengrass V2，每個核心裝置都在自己的群組中，其中 群組只包含該核心裝置及其連線資訊。

### 範例 Discover 回應文件
<a name="greengrass-discover-response-examples"></a>

下列文件顯示與一個 Greengrass 核心裝置相關聯之用戶端裝置的回應。核心裝置有一個端點和一個 CA 憑證。

```
{
  "GGGroups": [
    {
      "GGGroupId": "greengrassV2-coreDevice-core-device-01-thing-name",
      "Cores": [
        {
          "thingArn": "core-device-01-thing-arn",
          "Connectivity": [
            {
              "id": "core-device-01-connection-id",
              "hostAddress": "core-device-01-address",
              "portNumber": core-device-01-port,
              "metadata": "core-device-01-description"
            }
          ]
        }
      ],
      "CAs": [
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----"
      ]
    }
  ]
}
```

下列文件顯示與兩個核心裝置相關聯的用戶端裝置的回應。核心裝置具有多個端點和多個群組 CA 憑證。

```
{
  "GGGroups": [
    {
      "GGGroupId": "greengrassV2-coreDevice-core-device-01-thing-name",
      "Cores": [
        {
          "thingArn": "core-device-01-thing-arn",
          "Connectivity": [
            {
              "id": "core-device-01-connection-id",
              "hostAddress": "core-device-01-address",
              "portNumber": core-device-01-port,
              "metadata": "core-device-01-connection-1-description"
            },
            {
              "id": "core-device-01-connection-id-2",
              "hostAddress": "core-device-01-address-2",
              "portNumber": core-device-01-port-2,
              "metadata": "core-device-01-connection-2-description"
            }
          ]
        }
      ],
      "CAs": [
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----",
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----",
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----"
      ]
    },
    {
      "GGGroupId": "greengrassV2-coreDevice-core-device-02-thing-name",
      "Cores": [
        {
          "thingArn":"core-device-02-thing-arn",
          "Connectivity" : [
            {
              "id": "core-device-02-connection-id",
              "hostAddress": "core-device-02-address",
              "portNumber": core-device-02-port,
              "metadata": "core-device-02-connection-1-description"
            }
          ]
        }
      ],
      "CAs": [
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----",
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----",
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----"
      ]
    }
  ]
}
```

## 使用 cURL 測試探索 API
<a name="greengrass-discover-test-request"></a>

如果您`cURL`已安裝 ，則可以測試 探索 API。下列範例指定用戶端裝置的憑證，以驗證對 Greengrass 探索 API 端點的請求。

```
curl -i \
  --cert 1a23bc4d56.cert.pem \
  --key 1a23bc4d56.private.key \
  https://greengrass-ats.iot.us-west-2.amazonaws.com:8443/greengrass/discover/thing/MyClientDevice1
```

**注意**  
`-i` 引數指定 輸出 HTTP 回應標頭。您可以使用此選項來協助識別錯誤。

如果請求成功，此命令會輸出類似下列範例的回應。

```
{
  "GGGroups": [
    {
      "GGGroupId": "greengrassV2-coreDevice-MyGreengrassCore",
      "Cores": [
        {
          "thingArn": "arn:aws:iot:us-west-2:123456789012:thing/MyGreengrassCore",
          "Connectivity": [
            {
              "Id": "AUTOIP_192.168.1.4_1",
              "HostAddress": "192.168.1.5",
              "PortNumber": 8883,
              "Metadata": ""
            }
          ]
        }
      ],
      "CAs": [
        "-----BEGIN CERTIFICATE-----\ncert-contents\n-----END CERTIFICATE-----\n"
      ]
    }
  ]
}
```

如果命令輸出錯誤，請參閱[故障診斷 Greengrass 探索問題](troubleshooting-client-devices.md#greengrass-discovery-issues)。