

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

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

本節描述如何設定您的裝置以連接至 AWS IoT Core。如果您想要開始使用 AWS IoT Core 但還沒有裝置，您可以使用 Amazon EC2 建立虛擬裝置，也可以使用 Windows PC 或 Mac 做為 IoT 裝置。

選取要嘗試的最佳裝置選項 AWS IoT Core。當然，您可以嘗試它們全部，但一次只能嘗試一個。如果您不確定哪個裝置選項最適合您，請閱讀如何選擇[哪個是最好的裝置選項](iot-gs-first-thing.md#choosing-a-gs-system)，然後返回此頁面。

**裝置選項**
+ [使用 Amazon EC2 建立虛擬裝置](creating-a-virtual-thing.md)
+ [使用您的 Windows 或 Linux PC 或 Mac 做為 AWS IoT 裝置](using-laptop-as-device.md)
+ [連接 Raspberry Pi 或其他裝置](connecting-to-existing-device.md)

# 使用 Amazon EC2 建立虛擬裝置
<a name="creating-a-virtual-thing"></a>

在本教學課程中，您將建立 Amazon EC2 執行個體，充當雲端中的虛擬裝置。

若要完成本教學課程，您需要 AWS 帳戶。若您沒有帳戶，請完成 [設定 AWS 帳戶](setting-up.md) 所述的步驟，然後再繼續。

**Topics**
+ [設定 Amazon EC2 執行個體](#set-up-ec2)
+ [安裝 Git、Node.js 並設定 AWS CLI](#install-git-node)
+ [為您的虛擬裝置建立 AWS IoT 資源](#ec2-create-certificate)
+ [安裝適用於 JavaScript 的 AWS IoT 裝置 SDK](#ec2-sdk)
+ [執行範例應用程式](#ec2-run-app)
+ [在 AWS IoT 主控台中檢視來自範例應用程式的訊息](#ec2-view-msg)

## 設定 Amazon EC2 執行個體
<a name="set-up-ec2"></a>

下列步驟顯示如何建立 Amazon EC2 執行個體，其將充當您的虛擬裝置取代實體裝置。

如果您是第一次建立 Amazon EC2 執行個體，[開始使用 Amazon EC2Linux 執行個體](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/EC2_GetStarted.html)中的相關指示可能會更有幫助。

**啟動執行個體**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 從左側的主控台功能表展開 **Instances** (執行個體) 區段，然後選擇 **Instances** (執行個體)。在 **Instances** (執行個體) 儀表板中，選擇右側的 **Launch instances** (啟動執行個體) 以顯示基本組態清單。

1. 在 **Name and tags** (名稱和標籤) 區段中，輸入執行個體的名稱，並選擇性地新增標籤。

1. 在 **Application in OS Images (Amazon Machine Image)** (應用程式和作業系統映像) 區段中選擇執行個體的 AMI 範本，例如 *Amazon Linux 2 AMI (HVM)*。請注意，此 AMI 會標示為 "Free tier eligible." (符合免費方案。)

1. 在 **Instance Type** (執行個體類型) 頁面中，您可以選取您執行個體的硬體組態。選取 `t2.micro` 類型，其預設為選取。請注意，此執行個體類型符合免費方案資格。

1. 在 **Key pair (login)** (金鑰對 (登入)) 區段中，從下拉式清單中選擇金鑰對名稱，或選擇 **Create a new key pair** (建立新金鑰對) 以建立新的金鑰對。建立新金鑰對時，請務必下載私密金鑰檔案並將其儲存在安全的地方，因為這是您下載並儲存的唯一機會。每次您連線至執行個體來啟動執行個體與對應的私有金鑰時，都需要提供您的金鑰對名稱。
**警告**  
不要選取 **Proceed without a key pair** (不使用金鑰對而繼續) 選項。如果不使用金鑰對而啟動執行個體，就無法與它連線。

1. 在 **Network settings** (網路設定) 區段和 **Configure storage** (設定儲存區) 區段中，您可以保留預設設定。當您就緒後，選擇 **Launch Instances** (啟動執行個體)。

1. 會有確認頁面讓您知道您的執行個體正在啟動。選擇 **View Instances** (檢視執行個體) 關閉確認頁面並返回主控台。

1. 您可以在 **Instances (執行個體)** 畫面中檢視啟動狀態。啟動執行個體無須費時。當您啟動執行個體時，其初始狀態是 `pending`。在執行個體啟動後，其狀態會變更為 `running`，並得到公有的 DNS 名稱。(如果隱藏 **Public DNS (IPv4) (公有 DNS (IPv4))** 欄，請選擇頁面右上角的 **Show/Hide Columns (顯示/隱藏欄)** (齒輪狀圖示)，然後選取 **Public DNS (IPv4) (公有 DNS (IPv4))**。)

1. 執行個體可能需要幾分鐘的時間準備就緒讓您連線。確認您的執行個體是否已通過狀態檢查，您可以在 **Status Checks (狀態檢查)** 欄檢視此資訊。

   在新的執行個體通過其狀態檢查之後，請繼續下一個程序並連接至該執行個體。

**連結到您的執行個體**

您可以從 Amazon EC2 主控台選取執行個體，並選擇使用 Amazon EC2 Instance Connect 來進行連線，以使用瀏覽器型用戶端連接至執行個體。Instance Connect 會處理許可並提供成功的連線。

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在左側選單中，選擇 **Instances** (執行個體)。

1. 選取執行個體，然後選取 **Connect (連線)**。

1. 選擇 **Amazon EC2 Instance Connect**，**Connect** (連線)。

您現在應該具有已登入新 Amazon EC2 執行個體的 **Amazon EC2 Instance Connect** 視窗。

## 安裝 Git、Node.js 並設定 AWS CLI
<a name="install-git-node"></a>

在本節中，您會在 Linux 執行個體上安裝 Git 和 Node.js。

**安裝 Git**

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用下列命令更新您的執行個體。

   ```
   sudo yum update -y
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用下列命令安裝 Git。

   ```
   sudo yum install git -y
   ```

1. 若要檢查 Git 是否已安裝，以及 Git 的目前版本，請執行下列命令：

   ```
   git --version
   ```

**安裝 Node.js**

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用下列命令安裝 Node Version Manager (NVM)。

   ```
   curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
   ```

   nvm 可以安裝多種 Node.js 版本且允許您在各版本間進行切換，因此我們會使用 nvm 安裝 Node.js。

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用此命令啟用 nvm。

   ```
   . ~/.nvm/nvm.sh
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用 nvm 來透過使用此命令安裝最新版本的 Node.js。

   ```
   nvm install 16
   ```
**注意**  
這會安裝 Node.js 的最新 LTS 版本。

   安裝 Node.js 時，系統會一併安裝節點套件管理工具 (npm)，您可以視需要安裝額外的模組。

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用此命令來測試是否已安裝並正確地執行 Node.js。

   ```
   node -e "console.log('Running Node.js ' + process.version)"
   ```

    本教學課程需要 Node v10.0 或更新版本。如需詳細資訊，請參閱 [Tutorial: Setting Up Node.js on an Amazon EC2 Instance](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html) (教學課程：在 Amazon EC2 執行個體上設定 Node.js)。

**設定 AWS CLI**

您的 Amazon EC2 執行個體已預先載入 AWS CLI。不過，您必須完成您的 AWS CLI 設定檔。如需如何設定 CLI 的詳細資訊，請參閱[設定 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。

1. 下列範例顯示範本值。將它們取代為您自己的值。您可以在 [AWS 主控台中於您在 **My Security Credentials**](https://console.aws.amazon.com//iam/home#/security_credentials) (我的安全憑證) 下的帳戶資訊中找到這些值。

   在您的 **Amazon EC2 Instance Connect** 視窗中，輸入此命令：

   ```
   aws configure
   ```

   然後在顯示的提示中輸入來自您帳戶的值。

   ```
   AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
   AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   Default region name [None]: us-west-2
   Default output format [None]: json
   ```

1. 您可以使用此命令測試您的 AWS CLI 組態：

   ```
   aws iot describe-endpoint --endpoint-type iot:Data-ATS
   ```

   如果您的 AWS CLI 設定正確，命令應該會從 傳回端點地址 AWS 帳戶。

## 為您的虛擬裝置建立 AWS IoT 資源
<a name="ec2-create-certificate"></a>

本節說明如何使用 AWS CLI 直接在虛擬裝置上建立物件物件及其憑證檔案。這是直接在裝置上完成，以避免從另一台電腦將它們複製到裝置時可能造成的潛在複雜性。在本節中，您將為虛擬裝置建立下列資源：
+ 代表虛擬裝置所在的物件 AWS IoT。
+ 要驗證虛擬裝置的憑證。
+ 政策文件，用來授權虛擬裝置連接至 AWS IoT，以及用來發佈、接收和訂閱訊息。

**在 Linux 執行個體中建立 AWS IoT 物件**

連接到 的裝置 AWS IoT 由 AWS IoT 登錄檔中的*物件*表示。「物件」**代表特定的裝置或邏輯實體。在此案例中，您的「物件」**將代表您的虛擬裝置，即 Amazon EC2 執行個體。

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，執行下列命令來建立您的物件。

   ```
   aws iot create-thing --thing-name "MyIotThing"
   ```

1. JSON 回應應該如下所示：

   ```
   {
       "thingArn": "arn:aws:iot:your-region:your-aws-account:thing/MyIotThing", 
       "thingName": "MyIotThing",
       "thingId": "6cf922a8-d8ea-4136-f3401EXAMPLE"
   }
   ```

**在 Linux 執行個體中建立和連接 AWS IoT 金鑰和憑證**

**[create-keys-and-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/create-keys-and-certificate.html)** 命令會建立由 Amazon 根憑證授權機構簽署的用戶端憑證。此憑證用來驗證虛擬裝置的身分。

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，建立目錄以存放您的憑證和金鑰檔案。

   ```
   mkdir ~/certs
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用此命令下載 Amazon 憑證授權機構 (CA) 憑證的副本。

   ```
   curl -o ~/certs/Amazon-root-CA-1.pem \
       https://www.amazontrust.com/repository/AmazonRootCA1.pem
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，執行下列命令來建立您的私有金鑰、公有金鑰，以及 X.509 憑證檔案。此命令也會向 註冊和啟用憑證 AWS IoT。

   ```
   aws iot create-keys-and-certificate \
       --set-as-active \
       --certificate-pem-outfile "~/certs/device.pem.crt" \
       --public-key-outfile "~/certs/public.pem.key" \
       --private-key-outfile "~/certs/private.pem.key"
   ```

   回傳的結果如下所示。儲存 `certificateArn`，以便您可以在後續命令中使用它。您需要它，將您的憑證連接到您的物件，並在稍後的步驟中將政策連接到憑證。

   ```
   {
       "certificateArn": "arn:aws:iot:us-west-2:123456789012:cert/9894ba17925e663f1d29c23af4582b8e3b7619c31f3fbd93adcb51ae54b83dc2",
       "certificateId": "9894ba17925e663f1d29c23af4582b8e3b7619c31f3fbd93adcb51ae54b83dc2",
       "certificatePem": "
   -----BEGIN CERTIFICATE-----
   MIICiTCCEXAMPLE6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
   VVMxCzAJBgNVBAgEXAMPLEAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
   b24xFDASBgNVBAsTC0lBTSEXAMPLE2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
   BgkqhkiG9w0BCQEWEG5vb25lQGFtYEXAMPLEb20wHhcNMTEwNDI1MjA0NTIxWhcN
   MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCEXAMPLEJBgNVBAgTAldBMRAwDgYD
   VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDAEXAMPLEsTC0lBTSBDb25z
   b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEXAMPLE25lQGFt
   YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+aEXAMPLE
   EXAMPLEfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
   rDHudUZEXAMPLELG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
   Ibb3OhjZnzcvQAEXAMPLEWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
   nUhVVxYUntneD9+h8Mg9qEXAMPLEyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
   FFBjvSfpJIlJ00zbhNYS5f6GuoEDEXAMPLEBHjJnyp378OD8uTs7fLvjx79LjSTb
   NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=
   -----END CERTIFICATE-----\n",
       "keyPair": {
           "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkEXAMPLEQEFAAOCAQ8AMIIBCgKCAQEAEXAMPLE1nnyJwKSMHw4h\nMMEXAMPLEuuN/dMAS3fyce8DW/4+EXAMPLEyjmoF/YVF/gHr99VEEXAMPLE5VF13\n59VK7cEXAMPLE67GK+y+jikqXOgHh/xJTwo+sGpWEXAMPLEDz18xOd2ka4tCzuWEXAMPLEahJbYkCPUBSU8opVkR7qkEXAMPLE1DR6sx2HocliOOLtu6Fkw91swQWEXAMPLE\GB3ZPrNh0PzQYvjUStZeccyNCx2EXAMPLEvp9mQOUXP6plfgxwKRX2fEXAMPLEDa\nhJLXkX3rHU2xbxJSq7D+XEXAMPLEcw+LyFhI5mgFRl88eGdsAEXAMPLElnI9EesG\nFQIDAQAB\n-----END PUBLIC KEY-----\n",
           "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nkey omitted for security reasons\n-----END RSA PRIVATE KEY-----\n"
       }
   }
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，將您的物件連接到您剛建立的憑證，方法是使用下列命令，以及來自前一個命令之回應中的 *certificateArn*。

   ```
   aws iot attach-thing-principal \
       --thing-name "MyIotThing" \
       --principal "certificateArn"
   ```

   如果成功，此命令不會顯示任何輸出。

**建立並連接政策**

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，複製此策略文件並將其貼到名為 **\$1/policy.json** 的檔案來建立政策檔案。

   如果您沒有最愛的 Linux 編輯器，則可以使用此命令開啟 **nano**。

   ```
   nano ~/policy.json
   ```

   將 `policy.json` 的政策文件貼入其中。輸入 ctrl-x 以結束 **nano** 編輯器並儲存檔案。

   `policy.json` 的政策文件內容  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Publish",
                   "iot:Subscribe",
                   "iot:Receive",
                   "iot:Connect"
               ],
               "Resource": [
                   "*"
               ]
           }
       ]
   }
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用下列命令建立您的政策。

   ```
   aws iot create-policy \
       --policy-name "MyIotThingPolicy" \
       --policy-document "file://~/policy.json"
   ```

   輸出：  
****  

   ```
   {
       "policyName": "MyIotThingPolicy",
       "policyArn": "arn:aws:iot:us-east-1:your-aws-account:policy/MyIotThingPolicy",
       "policyDocument": "{
           \"Version\": \"2012-10-17\",
           \"Statement\": [
               {
                   \"Effect\": \"Allow\",
                   \"Action\": [
                       \"iot:Publish\",
                       \"iot:Receive\",
                       \"iot:Subscribe\",
                       \"iot:Connect\"
                   ],
                   \"Resource\": [
                       \"*\"
                   ]
           }
           ]
       }",
       "policyVersionId": "1"
   }
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用下列命令將政策連接至虛擬裝置的憑證。

   ```
   aws iot attach-policy \
       --policy-name "MyIotThingPolicy" \
       --target "certificateArn"
   ```

   如果成功，此命令不會顯示任何輸出。

## 安裝適用於 JavaScript 的 AWS IoT 裝置 SDK
<a name="ec2-sdk"></a>

在本節中，您將安裝適用於 JavaScript 的 AWS IoT 裝置開發套件，其中包含應用程式可用來與 AWS IoT 和範例程式通訊的程式碼。如需詳細資訊，請參閱[適用於 JavaScript GitHub 儲存庫的AWS IoT SDK](https://github.com/aws/aws-iot-device-sdk-js-v2)。

**在 Linux 執行個體上安裝適用於 JavaScript 的 AWS IoT 裝置 SDK**

1. 在 **Amazon EC2 Instance Connect** 視窗中，使用此命令將適用於 JavaScript 的 AWS IoT 裝置 SDK 儲存庫複製到主目錄的 `aws-iot-device-sdk-js-v2` 目錄中。

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

1. 導覽至您在上述步驟中建立的 `aws-iot-device-sdk-js-v2` 目錄。

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

1. 使用 npm 來安裝 SDK。

   ```
   npm install
   ```

## 執行範例應用程式
<a name="ec2-run-app"></a>

 以下各節命令假設您的金鑰和憑證檔案存放在虛擬裝置上，如下表所示。


**憑證檔案名稱**  

|  檔案  |  檔案路徑  | 
| --- | --- | 
|  私有金鑰  |  `~/certs/private.pem.key`  | 
|  裝置憑證  |  `~/certs/device.pem.crt`  | 
|  根 CA 憑證  |  `~/certs/Amazon-root-CA-1.pem`  | 

在本節中，您將安裝並執行可在適用於 JavaScript 的 AWS IoT 裝置 SDK `aws-iot-device-sdk-js-v2/samples/node`目錄中找到`pub-sub.js`的範例應用程式。此應用程式顯示裝置 (您的 Amazon EC2 執行個體) 如何使用 MQTT 程式庫來發佈和訂閱 MQTT 訊息。`pub-sub.js` 範例應用程式會訂閱主題 `topic_1`、將 10 則訊息發佈至該主題，以及在從訊息代理程式接收訊息時顯示這些訊息。

**安裝並執行範例應用程式**

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，導覽至 SDK 已建立的 `aws-iot-device-sdk-js-v2/samples/node/pub_sub` 目錄，並使用這些命令安裝範例應用程式。

   ```
   cd ~/aws-iot-device-sdk-js-v2/samples/node/pub_sub
   npm install
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用此命令 AWS IoT 從 取得*your-iot-endpoint*。

   ```
   aws iot describe-endpoint --endpoint-type iot:Data-ATS
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，依指示插入 *your-iot-endpoint* 並執行此命令。

   ```
   node dist/index.js --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

範例應用程式：

1. 連線至 AWS IoT Core 您帳戶的 。

1. 訂閱訊息主題 **topic\$11**，並顯示其收到關於該主題的訊息。

1. 將 10 則訊息發佈至主題 **topic\$11**。

1. 顯示類似下列內容的輸出：

   ```
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":1}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":2}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":3}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":4}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":5}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":6}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":7}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":8}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":9}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":10}
   ```

若在執行範例應用程式時發生問題，請檢閱 [對範例應用程式的問題進行故障診斷](gs-device-troubleshoot.md)。

您也可以將 `--verbosity debug` 參數新增至命令列，以便範例應用程式顯示有關其正在做什麼的詳細訊息。這些資訊可能會提供您更正問題所需的協助。

## 在 AWS IoT 主控台中檢視來自範例應用程式的訊息
<a name="ec2-view-msg"></a>

您可以在範例應用程式的訊息透過訊息代理程式傳遞時看到這些訊臮，方法為使用 **AWS IoT 主控台**中的 **MQTT test client** (MQTT 測試用戶端)。

**檢視範例應用程式所發佈的 MQTT 訊息**

1. 檢閱 [使用 MQTT 用戶端檢視 AWS IoT MQTT 訊息](view-mqtt-messages.md)。這有助於您了解如何使用 **AWS IoT 主控台**中的 **MQTT 測試用戶端**，在 MQTT 訊息通過訊息代理程式時，檢視訊息。

1. 在 **AWS IoT 主控台**中開啟 **MQTT 測試用戶端**。

1. 在**Subscribe to a topic** (訂閱主題)中，訂閱主題，**topic\$11**。

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，再次執行範例應用程式，並在 **AWS IoT 主控台**的 **MQTT test client** (MQTT 測試用戶端) 中觀看訊息。

   ```
   cd ~/aws-iot-device-sdk-js-v2/samples/node/pub_sub
   node dist/index.js --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

如需 MQTT 和 如何 AWS IoT Core 支援通訊協定的詳細資訊，請參閱 [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html)。

# 使用您的 Windows 或 Linux PC 或 Mac 做為 AWS IoT 裝置
<a name="using-laptop-as-device"></a>

在本教學課程中，您將設定個人電腦以搭配 使用 AWS IoT。這些指示支援 Windows 和 Linux PC 以及 Mac。若要完成此目的，您需要在電腦上安裝一些軟體。如果您不想要在電腦上安裝軟體，則可以嘗試 [使用 Amazon EC2 建立虛擬裝置](creating-a-virtual-thing.md)，它會在虛擬機器上安裝所有軟體。

**Topics**
+ [設定您的個人電腦](#gs-pc-prereqs)
+ [安裝 Git、Python 和適用於 Python AWS IoT 的裝置 SDK](#gs-pc-sdk-node)
+ [設定政策和執行範例應用程式](#gs-pc-python-app-run)
+ [在 AWS IoT 主控台中檢視來自範例應用程式的訊息](#gs-pc-view-msg)
+ [在 Python 中執行共享訂閱範例](#gs-pc-shared-subscription-example)

## 設定您的個人電腦
<a name="gs-pc-prereqs"></a>

若要完成本教學課程，您需要一部 Windows 或 Linux PC，或是一部可連接到網際網路的 Mac。

繼續下一個步驟之前，請確定您可以在電腦上開啟命令列視窗。在 Windows PC 上使用 **cmd.exe**。在 Linux PC 或 Mac 上，使用 **Terminal**。

## 安裝 Git、Python 和適用於 Python AWS IoT 的裝置 SDK
<a name="gs-pc-sdk-node"></a>

在本節中，您將在電腦上安裝 Python 和適用於 Python 的 AWS IoT 裝置 SDK。

### 安裝最新版本的 Git 和 Python
<a name="gs-pc-node-runtime"></a>

此程序說明如何在個人電腦上安裝最新版本的 Git 和 Python。

**在您的電腦上下載並安裝 Git 和 Python**

1. 查看您的電腦上是否已安裝 Git。在命令列中輸入此命令。

   ```
   git --version
   ```

   如果命令顯示 Git 版本，表示已安裝 Git，而且您可以繼續進行下一個步驟。

   如果命令顯示錯誤，請開啟 [https://git-scm.com/download](https://git-scm.com/download) 並為您的電腦安裝 Git。

1. 查看您是否已安裝 Python。在命令列中輸入此命令。

   ```
   python -V
   ```
**注意**  
如果此命令提供錯誤：`Python was not found`，原因可能是您的作業系統呼叫 Python v3.x 可執行檔作為 `Python3`。在此情況下，將 `python` 的所有執行個體取代為 `python3`，並繼續進行本教學課程的其餘部分。

   如果命令顯示 Python 版本，則表示已安裝 Python。本教學課程需要 Python v3.7 或更新版本。

1. 如果已安裝 Python，則可以跳過本節的其餘步驟。如果未安裝，請繼續。

1. 開啟 [https://www.python.org/downloads/](https://www.python.org/downloads/)，並下載適用於您電腦的安裝程式。

1. 如果下載未自動開始安裝，請執行下載的程式來安裝 Python。

1. 驗證 Python 的安裝。

   ```
   python -V
   ```

   確認命令顯示 Python 版本。如果未顯示 Python 版本，請嘗試再次下載並安裝 Python。

### 安裝適用於 Python 的 AWS IoT 裝置 SDK
<a name="gs-pc-python-intall-sdk"></a>

**在電腦上安裝適用於 Python 的 AWS IoT 裝置 SDK**

1. 安裝適用於 Python 的 AWS IoT 裝置 SDK v2。

   ```
   python3 -m pip install awsiotsdk
   ```

1. 將適用於 Python 的 AWS IoT 裝置 SDK 儲存庫複製到主目錄的 aws-iot-device-sdk-python-v2 目錄中。此程序會將所安裝檔案的目錄稱為 *home*。

   *home* 目錄的實際位置取決於您的作業系統。

------
#### [ Linux/macOS ]

   在 macOS 和 Linux 中，*home* 目錄為 `~`。

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

------
#### [ Windows ]

   在 Windows 中，您可以在 `cmd` 視窗中執行此命令，來尋找 *home* 目錄路徑。

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

------
**注意**  
如果您是使用 Windows PowerShell，而不是 **cmd.exe**，則會使用下列命令。  

   ```
   echo $home
   ```

如需詳細資訊，請參閱[適用於 Python GitHub 儲存庫的AWS IoT 裝置 SDK](https://github.com/aws/aws-iot-device-sdk-python-v2)。

### 準備執行範例應用程式
<a name="gs-pc-python-config-app"></a>

**準備您的系統以執行範例應用程式**
+ 建立 `certs` 目錄。將下列項目複製至 `certs` 目錄：私有金鑰、裝置憑證，以及您在 [建立 AWS IoT 資源](create-iot-resources.md) 建立和註冊物件時所儲存的根憑證授權機構憑證檔案。目的地目錄中每個檔案的檔案名稱應與表格中的檔案名稱相符。

   下節命令假設您的金鑰和憑證檔案儲存在您的裝置上，如下表所示。

------
#### [ Linux/macOS ]

  執行此命令來建立 `certs` 子目錄，您會在執行範例應用程式時使用這個子目錄。

  ```
  mkdir ~/certs
  ```

  在新的子目錄中，將檔案複製到下表所示的目的地檔案路徑。  
**憑證檔案名稱**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/using-laptop-as-device.html)

  執行此命令來列出 `certs` 目錄中的檔案，並將其與表格中列出的檔案進行比較。

  ```
  ls -l ~/certs
  ```

------
#### [ Windows ]

  執行此命令來建立 `certs` 子目錄，您會在執行範例應用程式時使用這個子目錄。

  ```
  mkdir %USERPROFILE%\certs
  ```

  在新的子目錄中，將檔案複製到下表所示的目的地檔案路徑。  
**憑證檔案名稱**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/using-laptop-as-device.html)

  執行此命令來列出 `certs` 目錄中的檔案，並將其與表格中列出的檔案進行比較。

  ```
  dir %USERPROFILE%\certs
  ```

------

## 設定政策和執行範例應用程式
<a name="gs-pc-python-app-run"></a>

在本節中，您會設定政策，並執行 `pubsub.py` 範例指令碼，其位於 適用於 Python 的 AWS IoT Device SDK的 `aws-iot-device-sdk-python-v2/samples` 目錄中。此指令碼顯示您的裝置如何使用 MQTT 程式庫來發佈和訂閱 MQTT 訊息。

`pubsub.py` 範例應用程式會訂閱主題 `test/topic`、將 10 則訊息發佈至該主題，以及在從訊息代理程式接收訊息時顯示這些訊息。

若要執行 `pubsub.py` 範例指令碼，您需要以下資訊：


**應用程式參數值**  

|  參數  |  可在哪裡找到值  | 
| --- | --- | 
| your-iot-endpoint |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/using-laptop-as-device.html)  | 

*your-iot-endpoint* 值的格式為：`endpoint_id-ats.iot.region.amazonaws.com`，例如 `a3qj468EXAMPLE-ats.iot.us-west-2.amazonaws.com`。

執行指令碼之前，請確定您物件的政策許可範例指令碼連接、訂閱、發佈和接收。

**尋找並檢閱物件資源的政策文件**

1. 在 [AWS IoT 主控台](https://console.aws.amazon.com//iot/home#/thinghub)的 **Things** (物件) 清單中，尋找代表您裝置的資源。

1. 選擇代表您裝置物件資源的 **Name** (名稱) 連結，以開啟 **Thing details** (物件詳細資訊) 頁面。

1. 在 **Thing details** (物件詳細資訊) 頁面中的 **Certificates** (憑證) 索引標籤上，選擇與物件資源相連的憑證。清單中應該只有一個憑證。如果有一個以上的憑證，請選擇其檔案已安裝在裝置上且將用來連接至 AWS IoT Core的憑證。

   於 **Certificate** (憑證) 詳細資訊頁面的 **Policies** (政策) 索引標籤中，選擇與憑證相連的政策。其中應只有一個政策。如果有多個政策，請針對每個政策重複下一個步驟，以確保至少有一個政策授予必要的存取權。

1. 在 **Policy** (政策) 概觀頁面中，找到 JSON 編輯器並選擇 **Edit policy document** (編輯政策文件)，視需要檢閱和編輯政策文件。

1. 政策 JSON 會顯示在下列範例中。在 `"Resource"`元素中，將 取代`region:account`為每個`Resource`值 AWS 帳戶 中的 AWS 區域 和 。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Publish",
                   "iot:Receive"
               ],
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:topic/test/topic"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Subscribe"
               ],
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:topicfilter/test/topic"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Connect"
               ],
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:client/test-*"
               ]
           }
       ]
   }
   ```

------
#### [ Linux/macOS ]

**在 Linux/macOS 上執行範本指令碼**

1. 在命令列視窗中，導覽至 SDK 使用這些命令所建立的 `~/aws-iot-device-sdk-python-v2/samples/node/pub_sub` 目錄。

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

1. 在您的命令列視窗中，按照指示取代 *your-iot-endpoint* 並執行此命令。

   ```
   python3 pubsub.py --endpoint your-iot-endpoint --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key
   ```

------
#### [ Windows ]

**在 Windows PC 上執行範例應用程式**

1. 在命令列視窗中，導覽至 SDK 所建立的 `%USERPROFILE%\aws-iot-device-sdk-python-v2\samples` 目錄，然後使用這些命令來安裝範例應用程式。

   ```
   cd %USERPROFILE%\aws-iot-device-sdk-python-v2\samples
   ```

1. 在您的命令列視窗中，按照指示取代 *your-iot-endpoint* 並執行此命令。

   ```
   python3 pubsub.py --endpoint your-iot-endpoint --ca_file %USERPROFILE%\certs\Amazon-root-CA-1.pem --cert %USERPROFILE%\certs\device.pem.crt --key %USERPROFILE%\certs\private.pem.key
   ```

------

範例指令碼：

1. 連線至 AWS IoT Core 您帳戶的 。

1. 訂閱訊息主題 **test/topic**，並顯示其收到關於該主題的訊息。

1. 將 10 則訊息發佈至主題 **test/topic**。

1. 顯示類似下列內容的輸出：

```
Connected!
Subscribing to topic 'test/topic'...
Subscribed with QoS.AT_LEAST_ONCE
Sending 10 message(s)
Publishing message to topic 'test/topic': Hello World! [1]
Received message from topic 'test/topic': b'"Hello World! [1]"'
Publishing message to topic 'test/topic': Hello World! [2]
Received message from topic 'test/topic': b'"Hello World! [2]"'
Publishing message to topic 'test/topic': Hello World! [3]
Received message from topic 'test/topic': b'"Hello World! [3]"'
Publishing message to topic 'test/topic': Hello World! [4]
Received message from topic 'test/topic': b'"Hello World! [4]"'
Publishing message to topic 'test/topic': Hello World! [5]
Received message from topic 'test/topic': b'"Hello World! [5]"'
Publishing message to topic 'test/topic': Hello World! [6]
Received message from topic 'test/topic': b'"Hello World! [6]"'
Publishing message to topic 'test/topic': Hello World! [7]
Received message from topic 'test/topic': b'"Hello World! [7]"'
Publishing message to topic 'test/topic': Hello World! [8]
Received message from topic 'test/topic': b'"Hello World! [8]"'
Publishing message to topic 'test/topic': Hello World! [9]
Received message from topic 'test/topic': b'"Hello World! [9]"'
Publishing message to topic 'test/topic': Hello World! [10]
Received message from topic 'test/topic': b'"Hello World! [10]"'
10 message(s) received.
Disconnecting...
Disconnected!
```

若在執行範例應用程式時發生問題，請檢閱 [對範例應用程式的問題進行故障診斷](gs-device-troubleshoot.md)。

您也可以將 `--verbosity Debug` 參數新增至命令列，以便範例應用程式顯示有關其正在做什麼的詳細訊息。該資訊可能會協助您更正問題。

## 在 AWS IoT 主控台中檢視來自範例應用程式的訊息
<a name="gs-pc-view-msg"></a>

您可以在範例應用程式的訊息透過訊息代理程式傳遞時看到這些訊臮，方法為使用 **AWS IoT 主控台**中的 **MQTT test client** (MQTT 測試用戶端)。

**檢視範例應用程式所發佈的 MQTT 訊息**

1. 檢閱 [使用 MQTT 用戶端檢視 AWS IoT MQTT 訊息](view-mqtt-messages.md)。這有助於您了解如何使用 **AWS IoT 主控台**中的 **MQTT 測試用戶端**，在 MQTT 訊息通過訊息代理程式時，檢視訊息。

1. 在 **AWS IoT 主控台**中開啟 **MQTT 測試用戶端**。

1. 在 **Subscribe to a topic** (訂閱主題) 中，訂閱主題 **test/topic**。

1. 在您的命令列視窗中，再次執行範例應用程式，並在 **AWS IoT 主控台**的 **MQTT client** (MQTT 用戶端) 中觀看訊息。

------
#### [ Linux/macOS ]

   ```
   cd ~/aws-iot-device-sdk-python-v2/samples
   python3 pubsub.py --topic test/topic --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

------
#### [ Windows ]

   ```
   cd %USERPROFILE%\aws-iot-device-sdk-python-v2\samples
   python3 pubsub.py --topic test/topic --ca_file %USERPROFILE%\certs\Amazon-root-CA-1.pem --cert %USERPROFILE%\certs\device.pem.crt --key %USERPROFILE%\certs\private.pem.key --endpoint your-iot-endpoint
   ```

------

如需 MQTT 和 如何 AWS IoT Core 支援通訊協定的詳細資訊，請參閱 [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html)。

## 在 Python 中執行共享訂閱範例
<a name="gs-pc-shared-subscription-example"></a>

AWS IoT Core 同時支援 MQTT 3 和 MQTT 5 [的共用訂閱](mqtt.md#mqtt5-shared-subscription)。共享訂閱允許多個用戶端共享一個主題的訂閱，而且只有一個用戶端會使用隨機分佈接收發佈至該主題的訊息。若要使用共享訂閱，用戶端會訂閱共享訂閱的[主題篩選條件](https://docs.aws.amazon.com//iot/latest/developerguide/topics.html#topicfilters)：`$share/{ShareName}/{TopicFilter}`。

**設定政策並執行共享訂閱範例**

1. 若要執行共享訂閱範例，您必須依照 [MQTT 5 共享訂閱](https://github.com/aws/aws-iot-device-sdk-python-v2/blob/main/samples/mqtt5_shared_subscription.md#mqtt5-shared-subscription)中所述來設定物件的政策。

1. 若要執行共享訂閱，請執行下列命令。

------
#### [ Linux/macOS ]

**在 Linux/macOS 上執行範本指令碼**

   1. 在命令列視窗中，導覽至 SDK 使用這些命令所建立的 `~/aws-iot-device-sdk-python-v2/samples` 目錄。

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

   1. 在您的命令列視窗中，按照指示取代 *your-iot-endpoint* 並執行此命令。

      ```
      python3 mqtt5_shared_subscription.py --endpoint your-iot-endpoint --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --group_identifier consumer
      ```

------
#### [ Windows ]

**在 Windows PC 上執行範例應用程式**

   1. 在命令列視窗中，導覽至 SDK 所建立的 `%USERPROFILE%\aws-iot-device-sdk-python-v2\samples` 目錄，然後使用這些命令來安裝範例應用程式。

      ```
      cd %USERPROFILE%\aws-iot-device-sdk-python-v2\samples
      ```

   1. 在您的命令列視窗中，按照指示取代 *your-iot-endpoint* 並執行此命令。

      ```
      python3 mqtt5_shared_subscription.py --endpoint your-iot-endpoint --ca_file %USERPROFILE%\certs\Amazon-root-CA-1.pem --cert %USERPROFILE%\certs\device.pem.crt --key %USERPROFILE%\certs\private.pem.key --group_identifier consumer
      ```

------
**注意**  
執行範例 (例如 `--group_identifier consumer`) 時，您可以根據需求選擇性地指定群組識別碼。如果您沒有指定一個，則 `python-sample` 是預設群組識別碼。

1. 此命令列的輸出如下所示：

   ```
   Publisher]: Lifecycle Connection Success
   [Publisher]: Connected
   Subscriber One]: Lifecycle Connection Success
   [Subscriber One]: Connected
   Subscriber Two]: Lifecycle Connection Success
   [Subscriber Two]: Connected
   [Subscriber One]: Subscribed to topic 'test/topic' in shared subscription group 'consumer'.
   [Subscriber One]: Full subscribed topic is: '$share/consumer/test/topic' with SubAck code: [<SubackReasonCode.GRANTED_QOS_1: 1>]
   [Subscriber Two]: Subscribed to topic 'test/topic' in shared subscription group 'consumer'.
   [Subscriber Two]: Full subscribed topic is: '$share/consumer/test/topic' with SubAck code: [<SubackReasonCode.GRANTED_QOS_1: 1>]
   [Publisher]: Sent publish and got PubAck code: <PubackReasonCode.SUCCESS: 0>
   [Subscriber Two] Received a publish
           Publish received message on topic: test/topic
           Message: b'"Hello World!  [1]"'
   [Publisher]: Sent publish and got PubAck code: <PubackReasonCode.SUCCESS: 0>
   [Subscriber One] Received a publish
           Publish received message on topic: test/topic
           Message: b'"Hello World!  [2]"'
   [Publisher]: Sent publish and got PubAck code: <PubackReasonCode.SUCCESS: 0>
   [Subscriber Two] Received a publish
           Publish received message on topic: test/topic
           Message: b'"Hello World!  [3]"'
   [Publisher]: Sent publish and got PubAck code: <PubackReasonCode.SUCCESS: 0>
   [Subscriber One] Received a publish
           Publish received message on topic: test/topic
           Message: b'"Hello World!  [4]"'
   [Publisher]: Sent publish and got PubAck code: <PubackReasonCode.SUCCESS: 0>
   [Subscriber Two] Received a publish
           Publish received message on topic: test/topic
           Message: b'"Hello World!  [5]"'
   [Publisher]: Sent publish and got PubAck code: <PubackReasonCode.SUCCESS: 0>
   [Subscriber One] Received a publish
           Publish received message on topic: test/topic
           Message: b'"Hello World!  [6]"'
   [Publisher]: Sent publish and got PubAck code: <PubackReasonCode.SUCCESS: 0>
   [Subscriber Two] Received a publish
           Publish received message on topic: test/topic
           Message: b'"Hello World!  [7]"'
   [Publisher]: Sent publish and got PubAck code: <PubackReasonCode.SUCCESS: 0>
   [Subscriber One] Received a publish
           Publish received message on topic: test/topic
           Message: b'"Hello World!  [8]"'
   [Publisher]: Sent publish and got PubAck code: <PubackReasonCode.SUCCESS: 0>
   [Subscriber Two] Received a publish
           Publish received message on topic: test/topic
           Message: b'"Hello World!  [9]"'
   [Publisher]: Sent publish and got PubAck code: <PubackReasonCode.SUCCESS: 0>
   [Subscriber One] Received a publish
           Publish received message on topic: test/topic
           Message: b'"Hello World!  [10]"'
   [Subscriber One]: Unsubscribed to topic 'test/topic' in shared subscription group 'consumer'.
   [Subscriber One]: Full unsubscribed topic is: '$share/consumer/test/topic' with UnsubAck code: [<UnsubackReasonCode.SUCCESS: 0>]
   [Subscriber Two]: Unsubscribed to topic 'test/topic' in shared subscription group 'consumer'.
   [Subscriber Two]: Full unsubscribed topic is: '$share/consumer/test/topic' with UnsubAck code [<UnsubackReasonCode.SUCCESS: 0>]
   Publisher]: Lifecycle Disconnected
   [Publisher]: Lifecycle Stopped
   [Publisher]: Fully stopped
   Subscriber One]: Lifecycle Disconnected
   [Subscriber One]: Lifecycle Stopped
   [Subscriber One]: Fully stopped
   Subscriber Two]: Lifecycle Disconnected
   [Subscriber Two]: Lifecycle Stopped
   [Subscriber Two]: Fully stopped
   Complete!
   ```

1. 在 **AWS IoT 主控台**中開啟 **MQTT 測試用戶端**。在**訂閱主題**中，訂閱共享訂閱的主題，例如：`$share/consumer/test/topic`。執行範例 (例如 `--group_identifier consumer`) 時，您可以根據需求指定群組識別碼。如果您未指定群組識別碼，則預設值為 `python-sample`。如需詳細資訊，請參閱來自《AWS IoT Core 開發人員指南》**中的 [MQTT 5 共享訂閱 Python 範例](https://github.com/aws/aws-iot-device-sdk-python-v2/blob/main/samples/mqtt5_shared_subscription.md#mqtt5-shared-subscription)和[共享訂閱](mqtt.md#mqtt5-shared-subscription)。

   在您的命令列視窗中，再次執行範例應用程式，並在 **AWS IoT 主控台**的 **MQTT 測試用戶端**，以及命令列中觀看訊息的分佈。  
![\[共用訂閱輸出頁面。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/shared-subscription-output.png)

# 連接 Raspberry Pi 或其他裝置
<a name="connecting-to-existing-device"></a>

在本節中，我們將設定 Raspberry Pi 以搭配 使用 AWS IoT。如果您有另一個想要連接的裝置，Raspberry Pi 的指示會包括參考資料，其可以協助您調整這些指示以適用您的裝置。

這通常約需 20 分鐘，但是如果您有許多要安裝的系統軟體升級，則所需時間會更長。

**Topics**
+ [設定您的裝置](#gs-device-prereqs)
+ [安裝 AWS IoT 裝置 SDK 所需的工具和程式庫](#gs-device-sdk-tools)
+ [安裝 AWS IoT 裝置 SDK](#gs-device-install-sdk)
+ [安裝並執行範例應用程式](#gs-device-node-app-run)
+ [在 AWS IoT 主控台中檢視來自範例應用程式的訊息](#gs-device-view-msg)

**重要**  
調整這些指示以適用其他裝置和作業系統可能是一項艱鉅的挑戰。您必須充分了解您的裝置，才能解譯這些指示並將其套用至您的裝置。  
如果您在設定裝置時遇到困難 AWS IoT，可以嘗試其他裝置選項做為替代方案，例如 [使用 Amazon EC2 建立虛擬裝置](creating-a-virtual-thing.md)或 [使用您的 Windows 或 Linux PC 或 Mac 做為 AWS IoT 裝置](using-laptop-as-device.md)。

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

此步驟的目標就是收集您設定裝置所需的資訊，使其可以啟動作業系統 (OS)、連接至網際網路，並可讓您在命令列界面與其互動。

為了完成本教學，您需要以下項目：
+  AWS 帳戶。若您沒有帳戶，請完成 [設定 AWS 帳戶](setting-up.md) 所述的步驟，然後再繼續。
+ [Raspberry Pi 3 代 B 型](https://www.raspberrypi.com/products/)或更新的型號。這可能適用於較早版本的 Raspberry Pi，但尚未對其進行測試。
+ [Raspberry Pi OS (32 位元)](https://www.raspberrypi.com/software/operating-systems/) 或更新版本。我們建議您使用最新版本的 Raspberry Pi 作業系統。較早版本的 OS 可能適用，但尚未對其進行測試。

  若要執行此範例，您不需要安裝具有圖形使用者界面 (GUI) 的桌面；但是，如果您是初次使用 Raspberry Pi，而且您的 Raspberry Pi 支援它，使用具有 GUI 的桌面可能會更輕鬆。
+ 乙太網路或 Wi-Fi 連線。
+ 裝置所需的鍵盤、滑鼠、顯示器、纜線、電源供應器和其他硬體。

**重要**  
在您繼續下一個步驟之前，您的裝置必須已安裝、設定和執行作業系統。裝置必須連接至網際網路，而且您必須能夠使用其命令列界面存取裝置。可以透過直接連接的鍵盤、滑鼠和顯示器，或透過 SSH 終端機遠端界面存取命令列。

 如果您是在具有圖形使用者界面 (GUI) 的 Raspberry Pi 上執行作業系統，請在裝置上開啟終端機視窗，並在該視窗中執行下列指示。否則，如果您是使用遠端終端機 (例如 PuTTY) 連接到您的裝置，請開啟您裝置的遠端終端機並使用該終端機。

## 安裝 AWS IoT 裝置 SDK 所需的工具和程式庫
<a name="gs-device-sdk-tools"></a>

安裝 AWS IoT 裝置 SDK 和範本程式碼之前，請確定您的系統是最新的，並具有安裝 SDKs所需的工具和程式庫。

1. 

**更新作業系統並安裝必要的程式庫**  
安裝 AWS IoT 裝置 SDK 之前，請在裝置上的終端機視窗中執行這些命令，以更新作業系統並安裝所需的程式庫。

   ```
   sudo apt-get update
   ```

   ```
   sudo apt-get upgrade
   ```

   ```
   sudo apt-get install cmake
   ```

   ```
   sudo apt-get install libssl-dev
   ```

1. 

**安裝 Git**  
如果您裝置的作業系統未安裝 Git，您必須安裝它才能安裝適用於 JavaScript 的 AWS IoT 裝置 SDK。

   1. 執行此命令來測試看看是否已安裝 Git。

      ```
      git --version
      ```

   1. 如果上一個命令傳回 Git 版本，表示已安裝 Git，而且您可以跳到步驟 3。

   1. 若在執行 **git** 命令時顯示錯誤，請執行此命令來安裝 Git。

      ```
      sudo apt-get install git
      ```

   1. 執行此命令來再次測試看看是否已安裝 Git。

      ```
      git --version
      ```

   1. 如果已安裝 Git，請繼續進行下一節。如果未安裝，請在繼續之前疑難排解並更正錯誤。您需要 Git 才能安裝適用於 JavaScript 的 AWS IoT 裝置 SDK。

## 安裝 AWS IoT 裝置 SDK
<a name="gs-device-install-sdk"></a>

安裝 AWS IoT 裝置 SDK。

------
#### [ Python ]

在本節中，您將在裝置上安裝 Python、其開發工具和適用於 Python 的 AWS IoT 裝置 SDK。這些指示適用於執行最新 Raspberry Pi OS 的 Raspberry Pi。若有其他裝置或正在使用其他作業系統，您可能需要調整這些指示以適用您的裝置。

1. 

**安裝 Python 及其開發工具**  
適用於 Python 的 AWS IoT 裝置 SDK 需要在 Raspberry Pi 上安裝 Python v3.5 或更新版本。

   在裝置的終端機視窗中，執行這些命令。

   1. 執行此命令以判定您裝置上安裝的 Python 版本。

      ```
      python3 --version
      ```

      如果已安裝 Python，會顯示其版本。

   1. 如果顯示的版本為 `Python 3.5` 或更新版本，您可以跳到步驟 2。

   1. 如果顯示的版本小於 `Python 3.5`，您可以執行此命令來安裝正確的版本。

      ```
      sudo apt install python3
      ```

   1. 執行此命令以確認現在已安裝正確版本的 Python。

      ```
      python3 --version
      ```

1. 

**測試 pip3**  
在裝置的終端機視窗中，執行這些命令。

   1. 執行此命令以查看是否已安裝 **pip3**。

      ```
      pip3 --version
      ```

   1. 如果命令傳回版本編號，表示已安裝 **pip3**，而且您可以跳到步驟 3。

   1. 如果上一個命令傳回錯誤，請執行此命令來安裝 **pip3**。

      ```
      sudo apt install python3-pip
      ```

   1. 執行此命令以查看是否已安裝 **pip3**。

      ```
      pip3 --version
      ```

1. 

**安裝適用於 Python 的目前 AWS IoT 裝置 SDK**  
安裝適用於 Python 的 AWS IoT 裝置 SDK，並將範例應用程式下載至您的裝置。

   在您的裝置上，執行這些命令。

   ```
   cd ~
   python3 -m pip install awsiotsdk
   ```

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

------
#### [ JavaScript ]

在本節中，您將在裝置上安裝 Node.js、npm 套件管理員和適用於 JavaScript 的 AWS IoT 裝置開發套件。這些指示適用於執行 Raspberry Pi OS 的 Raspberry Pi。若有其他裝置或正在使用其他作業系統，您可能需要調整這些指示以適用您的裝置。

1. 

**安裝最新版本的 Node.js**  
適用於 JavaScript 的 AWS IoT 裝置 SDK 需要將 Node.js 和 npm 套件管理員安裝在 Raspberry Pi 上。

   1. 輸入此命令，下載最新版本的 Node 儲存庫。

      ```
      cd ~
      curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
      ```

   1. 安裝 Node 和 npm。

      ```
      sudo apt-get install -y nodejs
      ```

   1. 驗證 Node 的安裝。

      ```
      node -v
      ```

      確認命令顯示 Node 版本。本教學課程需要 Node v10.0 或更新版本。如果未顯示 Node 版本，請嘗試再次下載 Node 儲存庫。

   1. 驗證 npm 的安裝。

      ```
      npm -v
      ```

      確認命令顯示 npm 版本。如果未顯示 npm 版本，請嘗試再次安裝 Node 和 npm。

   1. 重新啟動裝置。

      ```
      sudo shutdown -r 0
      ```

      在裝置重新啟動之後繼續。

1. 

**安裝適用於 JavaScript 的 AWS IoT 裝置 SDK**  
在 Raspberry Pi 上安裝適用於 JavaScript 的 AWS IoT 裝置 SDK。

   1. 將適用於 JavaScript 的 AWS IoT 裝置 SDK 儲存庫複製到*主*`aws-iot-device-sdk-js-v2`目錄的 目錄中。在 Raspberry Pi 上，*home* 目錄是 `~/`，用作下列命令中的 *home* 目錄。如果您的裝置對 *home* 目錄使用不同的路徑，您必須在下列命令中將 `~/` 取代為您裝置的正確路徑。

      這些命令會建立 `~/aws-iot-device-sdk-js-v2` 目錄並將 SDK 程式碼複製到其中。

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

   1. 變更為您在上述步驟中建立的 `aws-iot-device-sdk-js-v2` 目錄，並執行 `npm install` 以安裝 SDK。命令 `npm install` 將會呼叫 `aws-crt` 程式庫建置，可能需要幾分鐘時間才能完成。

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

------

## 安裝並執行範例應用程式
<a name="gs-device-node-app-run"></a>

在本節中，您將安裝並執行 AWS IoT 裝置開發套件中找到`pubsub`的範例應用程式。此應用程式顯示您的裝置如何使用 MQTT 程式庫來發佈和訂閱 MQTT 訊息。範例應用程式會訂閱主題 `topic_1`、將 10 則訊息發佈至該主題，以及在從訊息代理程式接收訊息時顯示這些訊息。

**安裝憑證檔案**  
範例應用程式需要驗證裝置是否安裝在裝置上的憑證檔案。

**安裝範例應用程式的裝置憑證檔案**

1. 執行這些命令，在您的 *home* 目錄中建立 `certs` 子目錄。

   ```
   cd ~
   mkdir certs
   ```

1. 將私有金鑰、裝置憑證，以及您先前在 [建立 AWS IoT 資源](create-iot-resources.md) 中建立的根憑證授權機構憑證複製到 `~/certs` 目錄中。

   將憑證檔案複製到裝置的方式取決於裝置和作業系統，此處不會加以描述。不過，如果您的裝置支援圖形使用者界面 (GUI) 且具有網頁瀏覽器，您可以從裝置的網頁瀏覽器執行 [建立 AWS IoT 資源](create-iot-resources.md) 中所述的程序，將產生的檔案直接下載到您的裝置。

   下節命令假設您的金鑰和憑證檔案儲存在裝置上，如下表所示。  
**憑證檔案名稱**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/connecting-to-existing-device.html)

若要執行範例應用程式，您需要以下資訊：


**應用程式參數值**  

|  參數  |  可在哪裡找到值  | 
| --- | --- | 
| your-iot-endpoint |  於 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)中，依序選擇 **Manage** (管理) 和 **Things** (物件)。 在選單的設定**** AWS IoT 頁面上。您的端點會顯示在 **Device data endpoint** (裝置資料端點) 區段中。  | 

*your-iot-endpoint* 值的格式為：`endpoint_id-ats.iot.region.amazonaws.com`，例如 `a3qj468EXAMPLE-ats.iot.us-west-2.amazonaws.com`。

------
#### [ Python ]

**安裝並執行範例應用程式**

1. 導覽至範例應用程式目錄。

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

1. 在命令列視窗中，按照指示取代 *your-iot-endpoint* 並執行此命令。

   ```
   python3 pubsub.py --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

1. 請注意，範例應用程式：

   1. 連線至您帳戶的 AWS IoT 服務。

   1. 訂閱訊息主題 **topic\$11**，並顯示其收到關於該主題的訊息。

   1. 將 10 則訊息發佈至主題 **topic\$11**。

   1. 顯示類似下列內容的輸出：

   ```
   Connecting to a3qEXAMPLEffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-0c8ae2ff-cc87-49d2-a82a-ae7ba1d0ca5a'...
   Connected!
   Subscribing to topic 'topic_1'...
   Subscribed with QoS.AT_LEAST_ONCE
   Sending 10 message(s)
   Publishing message to topic 'topic_1': Hello World! [1]
   Received message from topic 'topic_1': b'Hello World! [1]'
   Publishing message to topic 'topic_1': Hello World! [2]
   Received message from topic 'topic_1': b'Hello World! [2]'
   Publishing message to topic 'topic_1': Hello World! [3]
   Received message from topic 'topic_1': b'Hello World! [3]'
   Publishing message to topic 'topic_1': Hello World! [4]
   Received message from topic 'topic_1': b'Hello World! [4]'
   Publishing message to topic 'topic_1': Hello World! [5]
   Received message from topic 'topic_1': b'Hello World! [5]'
   Publishing message to topic 'topic_1': Hello World! [6]
   Received message from topic 'topic_1': b'Hello World! [6]'
   Publishing message to topic 'topic_1': Hello World! [7]
   Received message from topic 'topic_1': b'Hello World! [7]'
   Publishing message to topic 'topic_1': Hello World! [8]
   Received message from topic 'topic_1': b'Hello World! [8]'
   Publishing message to topic 'topic_1': Hello World! [9]
   Received message from topic 'topic_1': b'Hello World! [9]'
   Publishing message to topic 'topic_1': Hello World! [10]
   Received message from topic 'topic_1': b'Hello World! [10]'
   10 message(s) received.
   Disconnecting...
   Disconnected!
   ```

   若在執行範例應用程式時發生問題，請檢閱 [對範例應用程式的問題進行故障診斷](gs-device-troubleshoot.md)。

   您也可以將 `--verbosity Debug` 參數新增至命令列，以便範例應用程式顯示有關其正在做什麼的詳細訊息。這些資訊可能會提供您更正問題所需的協助。

------
#### [ JavaScript ]

**安裝並執行範例應用程式**

1. 在命令列視窗中，導覽至 SDK 所建立的 `~/aws-iot-device-sdk-js-v2/samples/node/pub_sub` 目錄，然後使用這些命令來安裝範例應用程式。命令 `npm install` 將會呼叫 `aws-crt` 程式庫建置，可能需要幾分鐘時間才能完成。

   ```
   cd ~/aws-iot-device-sdk-js-v2/samples/node/pub_sub
   npm install
   ```

1. 在命令列視窗中，按照指示取代 *your-iot-endpoint* 並執行此命令。

   ```
   node dist/index.js --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

1. 請注意，範例應用程式：

   1. 連線至您帳戶的 AWS IoT 服務。

   1. 訂閱訊息主題 **topic\$11**，並顯示其收到關於該主題的訊息。

   1. 將 10 則訊息發佈至主題 **topic\$11**。

   1. 顯示類似下列內容的輸出：

   ```
   Publish received on topic topic_1
   {"message":"Hello world!","sequence":1}
   Publish received on topic topic_1
   {"message":"Hello world!","sequence":2}
   Publish received on topic topic_1
   {"message":"Hello world!","sequence":3}
   Publish received on topic topic_1
   {"message":"Hello world!","sequence":4}
   Publish received on topic topic_1
   {"message":"Hello world!","sequence":5}
   Publish received on topic topic_1
   {"message":"Hello world!","sequence":6}
   Publish received on topic topic_1
   {"message":"Hello world!","sequence":7}
   Publish received on topic topic_1
   {"message":"Hello world!","sequence":8}
   Publish received on topic topic_1
   {"message":"Hello world!","sequence":9}
   Publish received on topic topic_1
   {"message":"Hello world!","sequence":10}
   ```

   若在執行範例應用程式時發生問題，請檢閱 [對範例應用程式的問題進行故障診斷](gs-device-troubleshoot.md)。

   您也可以將 `--verbosity Debug` 參數新增至命令列，以便範例應用程式顯示有關其正在做什麼的詳細訊息。這些資訊可能會提供您更正問題所需的協助。

------

## 在 AWS IoT 主控台中檢視來自範例應用程式的訊息
<a name="gs-device-view-msg"></a>

您可以在範例應用程式的訊息透過訊息代理程式傳遞時看到這些訊臮，方法為使用 **AWS IoT 主控台**中的 **MQTT test client** (MQTT 測試用戶端)。

**檢視範例應用程式所發佈的 MQTT 訊息**

1. 檢閱 [使用 MQTT 用戶端檢視 AWS IoT MQTT 訊息](view-mqtt-messages.md)。這有助於您了解如何使用 **AWS IoT 主控台**中的 **MQTT 測試用戶端**，在 MQTT 訊息通過訊息代理程式時，檢視訊息。

1. 在 **AWS IoT 主控台**中開啟 **MQTT 測試用戶端**。

1. 訂閱主題 **topic\$11**。

1. 在您的命令列視窗中，再次執行範例應用程式，並在 **AWS IoT 主控台**的 **MQTT client** (MQTT 用戶端) 中觀看訊息。

------
#### [ Python ]

   ```
   cd ~/aws-iot-device-sdk-python-v2/samples
   python3 pubsub.py --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

------
#### [ JavaScript ]

   ```
   cd ~/aws-iot-device-sdk-js-v2/samples/node/pub_sub
   node dist/index.js --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

------

# 對範例應用程式的問題進行故障診斷
<a name="gs-device-troubleshoot"></a>

如果您在嘗試執行範例應用程式時遇到錯誤，以下是一些需要檢查的事項。

## 檢查憑證
<a name="gs-device-ts-step-1"></a>

如果憑證未處於作用中狀態， AWS IoT 將不會接受任何用於授權的連線嘗試。建立憑證時，很容易忽略 **Activate** (啟用) 按鈕。幸好，您可以從 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)啟用憑證。

**檢查您的憑證是否啟用**

1. 在 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home) 的左側選單中，依序選擇 **Secure** (安全) 和 **Certificates** (憑證)。

1. 在憑證清單中，找出您為練習建立的憑證，並在 **Status** (狀態) 欄位中檢查其狀態。

   如果您不記得憑證的名稱，請檢查是否有任何為 **Inactive** (非作用中) 的憑證，以查看它們是否可能是您正在使用的憑證。

   選擇清單中的憑證來開啟其詳細資訊頁面。在詳細資訊頁面中，您可以看到其 **Create date** (建立日期) 來協助您識別憑證。

1. **若要啟動非作用中的憑證**，請從憑證的詳細資訊頁面中，選擇 **Actions** (動作)，然後選擇 **Activate** (啟用)。

如果您找到正確的憑證且為作用中，但執行範例應用程式時仍有問題，請檢查其政策，如下一個步驟所述。

您也可以嘗試遵循 [建立物件](create-iot-resources.md#create-aws-thing) 中的步驟，建立新的物件和新的憑證。如果建立新的物件，您需要給它新的物件名稱，並將新的憑證檔案下載到您的裝置。

## 檢查連接至憑證的政策
<a name="gs-device-ts-step-2"></a>

政策授權 中的動作 AWS IoT。如果用來連接至 AWS IoT 的憑證沒有政策，或者沒有允許它連接的政策，則即使憑證處於作用中狀態，連線也會遭到拒絕。

**檢查連接至憑證的政策**

1. 按照上一個項目中所述尋找憑證，並開啟其詳細資訊頁面。

1. 於憑證詳細資訊頁面的左側選單中，選擇 **Policies (政策)**，查看連接至憑證的政策。

1. 如果沒有任何政策連接至憑證，請選擇 **Actions** (動作) 選單，然後選擇 **Attach policy** (連接政策) 來新增一個政策。

   選擇您先前在[建立 AWS IoT 資源](create-iot-resources.md)中建立的政策。

1. 若有連接的政策，請選擇政策圖標來開啟其詳細資訊頁面。

   在詳細資訊頁面中，檢閱 **Policy document** (政策文件)，以確定它與您在 [建立 AWS IoT 政策](create-iot-resources.md#create-iot-policy) 中建立的政策包含相同的資訊。

## 檢查命令列
<a name="gs-device-ts-step-3"></a>

確定您已針對系統使用正確的命令列。在 Linux 和 macOS 系統上使用的命令通常與在 Windows 系統上使用的命令不同。

## 檢查端點地址
<a name="gs-device-ts-step-4"></a>

檢閱您輸入的命令，然後仔細檢查命令中的端點地址是否為 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)中的端點地址。

## 檢查憑證檔案的檔案名稱
<a name="gs-device-ts-step-5"></a>

將您輸入至命令中的檔案名稱與 `certs` 目錄中的憑證檔案名稱進行比較。

有些系統可能需要以引號括住檔案名稱才能正常運作。

## 檢查 SDK 安裝
<a name="gs-device-ts-step-6"></a>

確定您的 SDK 安裝完成且正確。

如有疑問，請在裝置上重新安裝 SDK。在大多數情況下，尋找名為**安裝適用於 **SDK 語言**的 AWS IoT 裝置 SDK** 教學課程章節並再次遵循程序至關重要。

如果您是使用**適用於 JavaScript 的AWS IoT 裝置 SDK**，請記住先安裝範例應用程式，然後再嘗試執行它們。安裝 SDK 不會自動安裝範例應用程式。在安裝了 SDK 之後必須手動安裝範例應用程式。