

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

# 使用 AWS IoT 裝置用戶端建置示範
<a name="iot-tutorials-dc-intro"></a>

此學習路徑中的教學課程將逐步引導您使用 AWS IoT 裝置用戶端開發示範軟體。 AWS IoT Device Client 提供在您的 IoT 裝置上執行的軟體，以測試和示範建置的 IoT 解決方案的各個層面 AWS IoT。

這些教學課程的目標是促進探索和實驗，讓您有信心在開發裝置軟體之前 AWS IoT 支援您的解決方案。

**您會在本教學課程中學到什麼：**
+ 如何準備 Raspberry Pi 以用作具有 的 IoT 裝置 AWS IoT
+ 如何在裝置上使用 AWS IoT 裝置用戶端示範 AWS IoT 功能

在此學習路徑中，您將在自己的 Raspberry Pi 上安裝 AWS IoT 裝置用戶端，並在雲端中建立 AWS IoT 資源以示範 IoT 解決方案想法。雖然此學習路徑中的教學課程會透過使用 Raspberry Pi 來示範功能，但它們會說明目標和程序，以便協助您調整它們來適應其他裝置。

## 使用 AWS IoT 裝置用戶端建置示範的先決條件
<a name="iot-dc-tutorial-overview"></a>

本節說明在此學習路徑中開始教學課程之前，您需要擁有的先決條件。

**若要完成此學習路徑中的教學課程，您需要：**
+ 

**一個 AWS 帳戶**  
如果您有現有 AWS 帳戶，您可以使用現有的 ，但您可能需要新增其他角色或許可，才能使用 AWS IoT 這些教學課程使用的功能。

  如果您需要建立新的 AWS 帳戶，請參閱 [設定 AWS 帳戶](setting-up.md)。
+ 

**Raspberry Pi 或兼容的 IoT 裝置**  
教學課程使用 [Raspberry Pi](https://www.raspberrypi.org/)，因為它有不同的形式，它無處不在，也是一個相對便宜的示範裝置。教學課程已在 [Raspberry Pi 3 Model B\$1](https://www.raspberrypi.com/products/raspberry-pi-3-model-b-plus/)、[Raspberry Pi 4 Model B](https://www.raspberrypi.com/products/raspberry-pi-4-model-b/)，以及在執行 Ubuntu Server 20.04 LTS (HVM) 的 Amazon EC2 執行個體上進行測試。若要使用 AWS CLI 並執行命令，建議您使用最新版的 Raspberry Pi OS ([Raspberry Pi OS (64 位元）](https://www.raspberrypi.com/software/operating-systems/) 或 OS Lite)。較早版本的作業系統可能適用，但我們尚未對其進行測試。
**注意**  
教學課程會說明每個步驟的目標，以便協助您調整它們來適應尚未嘗試過的 IoT 硬體；不過，這些教學課程並不會明確說明如何調整它們來適應其他裝置。
+ 

**熟悉 IoT 裝置的作業系統**  
這些教學課程中的步驟是假設您熟悉使用基本的 Linux 命令和操作 Raspberry Pi 支援的命令列介面。如果不熟悉這些作業，您就需要給自己更多時間來完成教學課程。

  若要完成這些教學課程，您必須了解如何：
  + 安全地執行基本裝置作業，例如組裝和連接元件、將裝置連接至所需電源，以及安裝和移除記憶卡。
  + 在裝置上上傳及下載系統軟體和檔案。如果裝置不使用卸除式儲存裝置 (例如 microSD 卡)，您必須要知道如何連接至裝置，並在裝置上上傳及下載系統軟體和檔案。
  + 將裝置連接至打算使用該裝置的網路上。
  + 使用 SSH 終端機或類似程式從其他電腦連接至裝置。
  + 使用命令列介面來建立、複製、移動、重新命名以及設定裝置上的檔案和目錄許可。
  + 在裝置上安裝新程式。
  + 使用 FTP 或 SCP 等工具在裝置之間傳輸檔案。
+ 

**IoT 解決方案的開發與測試環境**  
教學課程會說明所需的軟體和硬體；不過，教學課程會假設您可以執行可能未明確說明的作業。這類硬體和操作的範例包括：
  + 

**要下載並存放檔案的本機主機電腦**  
對於 Raspberry Pi，這通常是個人電腦或筆記型電腦，可以讀取和寫入 microSD 記憶卡。本機主機電腦必須：
    + 連線到網際網路。
    + 已安裝並設定妥 [AWS CLI](https://aws.amazon.com//cli/)。
    + 擁有支援 AWS 主控台的 Web 瀏覽器。
  + 

**將本機主機電腦連接到裝置，以便與裝置進行通訊、輸入命令及傳輸檔案的方式**  
在 Raspberry Pi 上，這通常是使用 SSH 和 SCP 從本機主機電腦完成。
  + 

**要連接至 IoT 裝置的顯示器和鍵盤**  
這些設備很有幫助，但不需要這些設備就能完成教學課程。
  + 

**本機主機電腦和 IoT 裝置連線至網際網路的方式**  
這可能是連接至網際網路的路由器或閘道的有線或無線網路連線。本機主機也必須能夠連接至 Raspberry Pi。這可能需要它們位於相同的區域網路上。教學課程無法示範如何針對特定裝置或裝置組態進行設定，但是會示範如何測試此連線。
  + 

**存取區域網路的路由器，檢視連網裝置**  
若要完成此學習路徑中的教學課程，您必須能夠找到 IoT 裝置的 IP 地址。

    在區域網路上，您可以透過存取裝置所連線之網路路由器的管理介面來完成這項操作。如果可以在路由器中為裝置指派固定 IP 地址，則可以在每次裝置重新啟動後簡化重新連線的流程。

    如果裝置連接了鍵盤和顯示器，**ifconfig** 可顯示出裝置的 IP 地址。

    如果這些都不可行，您必須在每次重新啟動裝置後找到一種方法來識別出裝置的 IP 地址。

在擁有所有材料之後，請繼續 [教學課程：為裝置用戶端準備 AWS IoT 裝置](iot-dc-prepare-device.md)。

**Topics**
+ [使用 AWS IoT 裝置用戶端建置示範的先決條件](#iot-dc-tutorial-overview)
+ [教學課程：為裝置用戶端準備 AWS IoT 裝置](iot-dc-prepare-device.md)
+ [教學課程：安裝和設定 AWS IoT 裝置用戶端](iot-dc-install-dc.md)
+ [教學課程：示範與 AWS IoT 裝置用戶端的 MQTT 訊息通訊](iot-dc-testconn.md)
+ [教學課程：使用 AWS IoT 裝置用戶端示範遠端動作 （任務）](iot-dc-runjobs.md)
+ [教學課程：執行 AWS IoT Device Client 教學課程後清除](iot-dc-cleanup.md)

# 教學課程：為裝置用戶端準備 AWS IoT 裝置
<a name="iot-dc-prepare-device"></a>

本教學課程會帶您逐步進行 Raspberry Pi 的初始化，準備好用於學習路徑的後續教學課程。

本教學課程的目標是安裝裝置作業系統的當前版本，並確保您可以在開發環境中與裝置進行通訊。

**先決條件**  
開始本教學課程之前，請確定您已備妥[使用 AWS IoT 裝置用戶端建置示範的先決條件](iot-tutorials-dc-intro.md#iot-dc-tutorial-overview)可用且可供使用的項目。

此教學課程約需 90 分鐘方能完成。

**於本教學課程中，您將會：**
+ 安裝和更新裝置的作業系統。
+ 安裝並驗證執行教學課程所需的任何其他軟體。
+ 測試裝置的連線能力並安裝必要的憑證。

完成本教學課程後，下一個教學課程將為使用 裝置用戶端的示範準備 AWS IoT 您的裝置。

**Topics**
+ [安裝和更新裝置的作業系統](iot-dc-prepare-device-sys.md)
+ [在裝置上安裝並驗證所需的軟體](iot-dc-prepare-device-sw.md)
+ [測試您的裝置並儲存 Amazon CA 憑證](iot-dc-prepare-device-test.md)

# 安裝和更新裝置的作業系統
<a name="iot-dc-prepare-device-sys"></a>

本節中的程序是描述如何將 Raspberry Pi 用於其系統磁碟機的 microSD 卡初始化。Raspberry Pi 的 microSD 卡包含其作業系統 (OS) 軟體及其應用程式檔案儲存的空間。如果不使用 Raspberry Pi，請依照裝置的指示安裝並更新裝置的作業系統軟體。

完成本節之後，您應該可以啟動 IoT 裝置，並從本機主機電腦上的終端機程式連線至該裝置。

**必要設備：**
+ 本機開發和測試環境
+ 可以連接至網際網路的 Raspberry Pi 或 IoT 裝置
+ 具有至少 8 GB 容量或足夠儲存作業系統和所需軟體的 microSD 記憶卡。
**注意**  
在為這些練習選取 microSD 卡時，請盡量選擇容量大但體積小的卡片。  
小型 SD 卡的備份和更新速度會更快。在 Raspberry Pi 上，完成這些教學課程不需要超過 8 GB 的 microSD 卡。如果特定應用程式需要更多空間，您在這些教學課程中儲存的較小映像檔案可以調整較大記憶卡上的檔案系統大小，以使用所選記憶卡的所有支援空間。

**選用設備：**
+ 連接到 Raspberry Pi 的 USB 鍵盤
+ HDMI 顯示器和將顯示器至 Raspberry Pi 的纜線

**Topics**
+ [將裝置的作業系統載入至 microSD 卡](#iot-dc-prepare-device-sys-step1)
+ [使用新的作業系統啟動 IoT 裝置](#iot-dc-prepare-device-sys-step2)
+ [將本機主機電腦連接至裝置](#iot-dc-prepare-device-sys-step3)

## 將裝置的作業系統載入至 microSD 卡
<a name="iot-dc-prepare-device-sys-step1"></a>

此程序會使用本機主機電腦，將裝置的作業系統載入至 microSD 卡。

**注意**  
如果裝置的作業系統未使用卸除式儲存媒體，請使用該裝置的程序安裝作業系統，然後繼續進行 [使用新的作業系統啟動 IoT 裝置](#iot-dc-prepare-device-sys-step2)。

**要在 Raspberry Pi 上安裝作業系統**

1. 在本機主機電腦上，下載並解壓縮要使用的 Raspberry Pi 作業系統映像。最新版本可從 [https://www.raspberrypi.com/software/operating-systems/](https://www.raspberrypi.com/software/operating-systems/) 上下載 

**選擇 Raspberry Pi 作業系統的版本**  
本教學課程會使用 **Raspberry Pi OS Lite** 版本，因為這是在此學習路徑中支援這些教學課程的最小版本。這個版本的 Raspberry Pi 作業系統只有一個命令列介面，沒有圖形使用者介面。具有圖形化使用者介面的最新 Raspberry Pi 作業系統版本也可以使用這些教學課程；不過，此學習路徑中描述的程序只會使用命令列介面，以便在 Raspberry Pi 上執行操作。

1. 請將 microSD 卡插入主機電腦。

1. 使用 SD 卡影像工具，將解壓縮的作業系統映像檔案寫入 microSD 卡。

1. 寫入 Raspberry Pi 作業系統映像至 microSD 卡後：

   1. 在命令列視窗或檔案總管視窗中，開啟 microSD 卡上的 BOOT 分割區。

   1. 在 microSD 卡的 BOOT 分割區中，於根目錄中建立一個名為 `ssh`且沒有檔案副檔名和內容的空白檔案。這樣會告知 Raspberry Pi 在它第一次啟動時啟用 SSH 通訊。

1. 退出 microSD 卡並安全地從本機主機電腦移除。

您的 microSD 記憶卡已準備進行 [使用新的作業系統啟動 IoT 裝置](#iot-dc-prepare-device-sys-step2)。

## 使用新的作業系統啟動 IoT 裝置
<a name="iot-dc-prepare-device-sys-step2"></a>

此程序會安裝 microSD 卡，並使用下載的作業系統首次啟動 Raspberry Pi。

**使用新的作業系統啟動 IoT 裝置**

1. 當電源與裝置斷開時，在上一個步驟中將 microSD 卡 ([將裝置的作業系統載入至 microSD 卡](#iot-dc-prepare-device-sys-step1)) 插入 Raspberry Pi。

1. 將裝置連線至有線網路。

1. 這些教學課程將使用 SSH 終端機與本機主機電腦的 Raspberry Pi 進行互動。

   如果也想直接與裝置互動，您可以：

   1. 在將 HDMI 顯示器連接至裝置來查看 Raspberry Pi 的主控台消息之前，您可以將本機主機電腦上的終端機視窗連接至 Raspberry Pi。

   1. 如果想直接與 Raspberry Pi 互動，請將 USB 鍵盤連接至裝置。

1. 連接電源至 Raspberry Pi，接著等待大約一分鐘來進行初始化。

   如果有顯示器連接至 Raspberry Pi，您可以觀看它的啟動過程。

1. 

   找出裝置的 IP 地址：
   + 如果將 HDMI 顯示器連接至 Raspberry Pi，IP 地址會出現在顯示器上的訊息中 
   + 如果能存取 Raspberry Pi 連接的路由器，您可以在路由器的管理介面中查看它的地址。

在取得 Raspberry Pi 的 IP 地址後，您已準備好進行 [將本機主機電腦連接至裝置](#iot-dc-prepare-device-sys-step3)。

## 將本機主機電腦連接至裝置
<a name="iot-dc-prepare-device-sys-step3"></a>

此程序會使用本機主機電腦上的終端程式連接至 Raspberry Pi，並更改其預設密碼。

**將本機主機電腦連接至裝置**

1. 

   在本機主機電腦上，開啟 SSH 終端程式：
   + Windows：`PuTTY`
   + Linux/macOS：`Terminal`
**注意**  
PuTTY 不會在 Windows 上自動安裝。如果電腦中沒有，您需要下載並安裝 PuTTY。

1. 將終端程式連接至 Raspberry Pi 的 IP 地址，並使用其預設憑證登入。

   ```
   username: pi
   password: raspberry
   ```

1. 登入至 Raspberry Pi 之後，變更 `pi` 使用者密碼。

   ```
   passwd
   ```

   依照提示變更密碼。

   ```
   Changing password for pi.
   Current password: raspberry
   New password: YourNewPassword
   Retype new password: YourNewPassword
   passwd: password updated successfully
   ```

在終端視窗收到 Raspberry Pi 命令列提示並更改密碼之後，即表示您已經準備好繼續進行 [在裝置上安裝並驗證所需的軟體](iot-dc-prepare-device-sw.md)。

# 在裝置上安裝並驗證所需的軟體
<a name="iot-dc-prepare-device-sw"></a>

本節中的程序會從[上一節](iot-dc-prepare-device-sys.md)繼續，讓 Raspberry Pi 的作業系統保持在最新狀態，並在 Raspberry Pi 上安裝軟體，該軟體將在下一節中用於建置和安裝 AWS IoT 裝置用戶端。

完成本節後， Raspberry Pi 會擁有最新的作業系統、本學習路徑教學課程所需的軟體，且會根據位置進行設定。

**必要設備：**
+ [上一節](iot-dc-prepare-device-sys.md)中的本機開發和測試環境
+ [上一節](iot-dc-prepare-device-sys.md)中使用的 Raspberry Pi
+ [上一節](iot-dc-prepare-device-sys.md)中的 microSD 記憶卡

**注意**  
Raspberry Pi Model 3\$1 和 Raspberry Pi Model 4 可執行此學習路徑中描述的所有命令。如果您的 IoT 裝置無法編譯軟體或執行 AWS Command Line Interface，您可能需要在本機主機電腦上安裝必要的編譯器，才能建置軟體，然後將其傳輸至 IoT 裝置。如需有關如何為裝置安裝和建置軟體的詳細資訊，請參閱裝置軟體的說明文件。

**Topics**
+ [更新作業系統軟體](#iot-dc-prepare-device-sw-step1)
+ [安裝必要的應用程式和程式庫](#iot-dc-prepare-device-sw-step2)
+ [(選用) 儲存 microSD 卡映像](#iot-dc-prepare-device-sw-step3)

## 更新作業系統軟體
<a name="iot-dc-prepare-device-sw-step1"></a>

此程序會更新作業系統軟體。

**更新 Raspberry Pi 上的作業系統軟體**

在本機主機電腦的終端機視窗中執行這些步驟。

1. 輸入這些命令來更新 Raspberry Pi 上的系統軟體。

   ```
   sudo apt-get -y update
   sudo apt-get -y upgrade
   sudo apt-get -y autoremove
   ```

1. 更新 Raspberry Pi 的地區設定和時區設定 (選用)。

   輸入此指令來更新裝置的地區設定和時區設定。

   ```
   sudo raspi-config
   ```

   1. 若要設定裝置的地區設定：

      1. 在 **Raspberry Pi Software Configuration Tool (raspi-config)** (Raspberry Pi 軟體組態工具 (raspi-config)) 畫面中，選擇選項 **5**。

         **`5 Localisation Options Configure language and regional settings`**

         使用 Tab 鍵來移動至 **<Select>** (選擇)，然後按 space bar。

      1. 在當地語系化選項選單中，選擇選項 **L1**。

         **`L1 Locale Configure language and regional settings`**

         使用 Tab 鍵來移動至 **<Select>** (選擇)，然後按 space bar。

      1. 在地區選項清單中，使用方向鍵捲動並使用 space bar 標記所需地區，選擇要在 Raspberry Pi 上安裝的地區設定。

         建議為美國選擇 **`en_US.UTF-8`**。

      1. 選取裝置的地區後，請使用 Tab 鍵選擇 **<OK>** (確定)，然後按 space bar 來顯示 **Configuring locales** (設定地區設定) 的確認頁面。

   1. 若要設定裝置的時區：

      1. 在 **raspi-config** 畫面中，選擇選項 **5**。

         **`5 Localisation Options Configure language and regional settings`**

         使用 Tab 鍵來移動至 **<Select>** (選擇)，然後按 space bar。

      1. 在當地語系化選項選單中，使用方向鍵選擇選項 **L2**：

         **`L2 time zone Configure time zone`**

         使用 Tab 鍵來移動至 **<Select>** (選擇)，然後按 space bar。

      1. 在 **Configuring tzdata** 選單中，從清單中選擇地理區域。

         使用 Tab 鍵來移動至 **<OK>** (確定)，然後按 space bar。

      1. 在城市清單中，使用方向鍵來選擇您所在時區的城市。

         若要設定時區，請使用 Tab 鍵來移動至 **<OK>** (確定)，然後按 space bar。

   1. 完成更新設定時，請使用 Tab 鍵來移動至 **<Finish>** (完成)，然後按 space bar 來關閉 **raspi-config** 應用程式。

1. 輸入此命令來重新啟動 Raspberry Pi。

   ```
   sudo shutdown -r 0
   ```

1. 等待 Raspberry Pi 重新啟動。

1. 待 Raspberry Pi 重新啟動後，請將本機主機電腦上的終端機視窗重新連接至 Raspberry Pi。

Raspberry Pi 系統軟體已設定完成，您已經準備好繼續進行 [安裝必要的應用程式和程式庫](#iot-dc-prepare-device-sw-step2)。

## 安裝必要的應用程式和程式庫
<a name="iot-dc-prepare-device-sw-step2"></a>

此程序會安裝後續教學課程使用的應用程式軟體和程式庫。

如果正在使用 Raspberry Pi，或者如果可以在 IoT 裝置上編譯所需軟體，請在本機主機電腦上的終端機視窗中執行這些步驟。如果必須在本機主機電腦上編譯 IoT 裝置的軟體，請檢閱 IoT 裝置的軟體說明文件，取得如何在裝置上執行這些步驟的相關資訊。

**在 Raspberry Pi 上安裝應用程式軟體和程式庫**

1. 輸入此指令來安裝應用程式軟體和程式庫。

   ```
   sudo apt-get -y install build-essential libssl-dev cmake unzip git python3-pip
   ```

1. 輸入這些指令來確認是否已安裝正確版本的軟體。

   ```
   gcc --version
   cmake --version
   openssl version
   git --version
   ```

1. 

   確認已安裝下列版本的應用程式軟體：
   + `gcc`：9.3.0 或更新版本
   + `cmake`：3.10.x 或更新版本
   + `OpenSSL`：1.1.1 或更新版本
   + `git`：2.20.1 或更新版本

如果 Raspberry Pi 有所需應用程式軟體的可接受版本，您就可以繼續進行 [(選用) 儲存 microSD 卡映像](#iot-dc-prepare-device-sw-step3)。

## (選用) 儲存 microSD 卡映像
<a name="iot-dc-prepare-device-sw-step3"></a>

在此學習路徑的整個教學課程中，您會遇到這些程序來將 Raspberry Pi 的 microSD 卡映像儲存至本機主機電腦上的檔案。雖然鼓勵這樣操作，但這不是必要任務。透過在建議位置上儲存 microSD 卡映像，您可以略過此學習路徑中儲存點之前的程序；若您發現需要重試某些項目，這就可以節省時間。未定期儲存 microSD 卡映像的結果是，當 microSD 卡損壞或意外錯誤設定應用程式或其設定時，您可能需要從頭開始重新開始學習路徑中的教學課程。

此時，Raspberry Pi 的 microSD 卡已經擁有更新的作業系統和加載的基本應用程式軟體。您現在可以將 microSD 卡的內容儲存至檔案，節省完成上述步驟所花費的時間。擁有裝置 microSD 卡映像目前的映像，可讓您從此開始繼續或重試教學課程或程序，無需從頭開始安裝和更新軟體。

**將 microSD 卡映像儲存至檔案**

1. 輸入此命令來關閉 Raspberry Pi。

   ```
   sudo shutdown -h 0
   ```

1. Raspberry Pi 完全關閉後，請移除其電源。

1. 從 Raspberry Pi 中取出 microSD 卡。

1. 在本機主機電腦上：

   1. 插入 microSD 卡。

   1. 使用 SD 卡映像工具，將 microSD 卡的映像儲存至檔案中。

   1. 儲存 microSD 卡的映像後，請從本機主機電腦中退出記憶卡。

1. 在 Raspberry Pi 斷開電源後，將 microSD 卡插入 Raspberry Pi。

1. 將電源連接至 Raspberry Pi。

1. 等待大約一分鐘後，在本機主機電腦上重新連線至連接至 Raspberry Pi 的本機主機電腦終端機視窗，然後登入 Raspberry Pi。

# 測試您的裝置並儲存 Amazon CA 憑證
<a name="iot-dc-prepare-device-test"></a>

本節中的程序會從[上一節](iot-dc-prepare-device-sw.md)繼續，安裝用於驗證您連線的 AWS Command Line Interface 和 Certificate Authority 憑證 AWS IoT Core。

完成本節後，您會知道 Raspberry Pi 具有安裝 AWS IoT 裝置用戶端所需的系統軟體，且其具有與網際網路的運作連線。

**必要設備：**
+ [上一節](iot-dc-prepare-device-sw.md)中的本機開發和測試環境
+ [上一節](iot-dc-prepare-device-sw.md)中使用的 Raspberry Pi
+ [上一節](iot-dc-prepare-device-sw.md)中的 microSD 記憶卡

**Topics**
+ [安裝 AWS Command Line Interface](#iot-dc-prepare-device-test-step1)
+ [設定您的 AWS 帳戶 登入資料](#iot-dc-prepare-device-test-step2)
+ [下載 Amazon 根憑證授權機構憑證](#iot-dc-prepare-device-test-step3)
+ [(選用) 儲存 microSD 卡映像](#iot-dc-prepare-device-test-step4)

## 安裝 AWS Command Line Interface
<a name="iot-dc-prepare-device-test-step1"></a>

此程序會將 安裝 AWS CLI 到您的 Raspberry Pi。

如果使用的是 Raspberry Pi，或者如果可以在 IoT 裝置上編譯軟體，請在本機主機電腦上的終端機視窗中執行這些步驟。如果必須在本機主機電腦上編譯 IoT 裝置的軟體，請檢閱 IoT 裝置的軟體說明文件，取得其所需之程式庫的相關資訊。

**在 Raspberry Pi AWS CLI 上安裝**

1. 執行這些命令來下載和安裝 AWS CLI。

   ```
   export PATH=$PATH:~/.local/bin # configures the path to include the directory with the AWS CLI
   git clone https://github.com/aws/aws-cli.git # download the AWS CLI code from GitHub
   cd aws-cli && git checkout v2 # go to the directory with the repo and checkout version 2
   pip3 install -r requirements.txt # install the prerequisite software
   ```

1. 執行此命令來安裝 AWS CLI。此命令最多需要 15 分鐘的時間即可完成。

   ```
   pip3 install . # install the AWS CLI 
   ```

1. 執行此命令以確認 AWS CLI 已安裝正確的 版本。

   ```
   aws --version
   ```

   的版本 AWS CLI 應為 2.2 或更新版本。

如果 AWS CLI 顯示其目前版本，您就可以繼續 [設定您的 AWS 帳戶 登入資料](#iot-dc-prepare-device-test-step2)。

## 設定您的 AWS 帳戶 登入資料
<a name="iot-dc-prepare-device-test-step2"></a>

在此程序中，您將取得登入資料並新增這些 AWS 帳戶 登入資料，以便在 Raspberry Pi 上使用。

**將 AWS 帳戶 登入資料新增至您的裝置**

1. 從 取得**存取金鑰 ID** 和**私密存取金鑰** AWS 帳戶 ，以驗證 AWS CLI 裝置上的 。

   如果您是初次使用 AWS IAM，https：//[https://aws.amazon.com/premiumsupport/knowledge-center/create-access-key/ ](https://aws.amazon.com/premiumsupport/knowledge-center/create-access-key/)會說明在 AWS 主控台中執行的程序，以建立 AWS 要在裝置上使用的 IAM 登入資料。

1. 在連接至 Raspberry Pi 的本機主機電腦終端機視窗上，以及裝置的 **Access Key ID** (存取金鑰 ID) 和 **Secret Access Key** (私密存取金鑰) 憑證：

   1. 使用此命令執行 AWS configure 應用程式：

      ```
      aws configure
      ```

   1. 出現提示時，請輸入憑證和組態資訊：

      ```
      AWS Access Key ID: your Access Key ID
      AWS Secret Access Key: your Secret Access Key
      Default region name: your AWS 區域 code
      Default output format: json
      ```

1. 執行此命令來測試裝置對 AWS 帳戶 和 AWS IoT Core 端點的存取。

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

   它應該會傳回您的 AWS 帳戶特定 AWS IoT 資料端點，例如此範例：

   ```
   {
       "endpointAddress": "a3EXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

如果您看到 AWS 帳戶特定的 AWS IoT 資料端點，您的 Raspberry Pi 具有繼續 的連線能力和許可[下載 Amazon 根憑證授權機構憑證](#iot-dc-prepare-device-test-step3)。

**重要**  
您的 AWS 帳戶 登入資料現在會存放在 Raspberry Pi 中的 microSD 卡上。雖然這可讓您在未來 AWS 輕鬆地與 互動，以及您將在這些教學課程中建立的軟體互動，但在預設情況下，它們也會儲存在您在此步驟之後建立的任何 microSD 卡映像中並複製。  
為了保護 AWS 帳戶 登入資料的安全性，在您儲存任何其他 microSD 卡映像之前，請考慮`aws configure`再次執行 並輸入**存取金鑰 ID** 和**私密存取金鑰**的隨機字元來清除登入資料，以防止您的 AWS 帳戶 登入資料洩露。  
如果您發現不小心儲存了 AWS 帳戶 登入資料，您可以在 IAM AWS 主控台中停用登入資料。

## 下載 Amazon 根憑證授權機構憑證
<a name="iot-dc-prepare-device-test-step3"></a>

此程序會下載並儲存 Amazon 根憑證憑證授權機構 (CA) 的憑證副本。下載並儲存此憑證以供後續教學課程使用，也可以測試裝置與 AWS 服務之間的連線能力。

**下載並儲存 Amazon 根憑證授權機構憑證**

1. 執行此命令，為憑證建立目錄。

   ```
   mkdir ~/certs
   ```

1. 執行此命令來下載 Amazon 根憑證授權機構憑證。

   ```
   curl -o ~/certs/AmazonRootCA1.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
   ```

1. 執行這些命令來設定憑證目錄及其檔案的存取權。

   ```
   chmod 745 ~
   chmod 700 ~/certs
   chmod 644 ~/certs/AmazonRootCA1.pem
   ```

1. 執行此命令來查看新目錄中的憑證授權機構憑證檔案。

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

   您應該會看到類似這樣的項目。日期和時間會有所不同；不過，檔案大小和所有其他資訊應該與此處所示相同。

   ```
   -rw-r--r-- 1 pi pi 1188 Oct 28 13:02 AmazonRootCA1.pem
   ```

   如果檔案大小不是 `1188`，請檢查 **curl** 命令參數。您可能下載了不正確的檔案。

## (選用) 儲存 microSD 卡映像
<a name="iot-dc-prepare-device-test-step4"></a>

此時，Raspberry Pi 的 microSD 卡已經擁有更新的作業系統和加載的基本應用程式軟體。

**將 microSD 卡映像儲存至檔案**

1. 在本機主機電腦上的終端機視窗中清除 AWS 憑證。

   1. 使用此命令執行 AWS configure 應用程式：

      ```
      aws configure
      ```

   1. 出現提示時，請取代憑證。您可以按 **Enter** 鍵，讓 **Default region name** (預設區域名稱) 和 **Default output format** (預設輸出格式) 保持不變。

      ```
      AWS Access Key ID [****************YT2H]: XYXYXYXYX
      AWS Secret Access Key [****************9plH]: XYXYXYXYX
      Default region name [us-west-2]: 
      Default output format [json]:
      ```

1. 輸入此命令來關閉 Raspberry Pi。

   ```
   sudo shutdown -h 0
   ```

1. Raspberry Pi 完全關閉之後，移除其電源連接器。

1. 從裝置中取出 microSD 卡。

1. 在本機主機電腦上：

   1. 插入 microSD 卡。

   1. 使用 SD 卡映像工具，將 microSD 卡的映像儲存至檔案中。

   1. 儲存 microSD 卡的映像後，請從本機主機電腦中退出記憶卡。

1. 在 Raspberry Pi 斷開電源後，將 microSD 卡插入 Raspberry Pi。

1. 將電源連接至裝置。

1. 大約一分鐘後，在本機主機電腦上重新啟動終端機視窗工作階段，然後登入裝置。

   **還不要重新輸入您的 AWS 帳戶 登入資料。**

在重新啟動並登入至 Raspberry Pi 之後，您就可以繼續進行 [教學課程：安裝和設定 AWS IoT 裝置用戶端](iot-dc-install-dc.md)。

# 教學課程：安裝和設定 AWS IoT 裝置用戶端
<a name="iot-dc-install-dc"></a>

本教學課程會逐步解說 AWS IoT 裝置用戶端的安裝和組態，以及您將在此和其他示範中使用的 AWS IoT 資源建立。

**若要開始此教學課程：**
+ 準備好[先前教學課程](iot-dc-prepare-device.md)中所述的本機主機電腦和 Raspberry Pi。

此教學課程約需 90 分鐘方能完成。

**完成此主題時：**
+ 您的 IoT 裝置已準備好在其他 AWS IoT 裝置用戶端示範中使用。
+ 您將會在 中佈建 IoT 裝置 AWS IoT Core。
+ 您會在裝置上下載並安裝 AWS IoT 裝置用戶端。
+ 您已經儲存了裝置 microSD 卡的映像，以供後續教學課程使用。

**必要設備：**
+ [上一節](iot-dc-prepare-device-test.md)中的本機開發和測試環境
+ [上一節](iot-dc-prepare-device-test.md)中使用的 Raspberry Pi
+ [上一節](iot-dc-prepare-device-test.md)中使用的 Raspberry Pi microSD 記憶卡

**Topics**
+ [下載並儲存 AWS IoT 裝置用戶端](iot-dc-install-download.md)
+ [在 中佈建 Raspberry Pi AWS IoT](iot-dc-install-provision.md)
+ [設定 AWS IoT 裝置用戶端以測試連線](iot-dc-install-configure.md)

# 下載並儲存 AWS IoT 裝置用戶端
<a name="iot-dc-install-download"></a>

本節中的程序會下載 AWS IoT 裝置用戶端、編譯裝置用戶端，並將其安裝在 Raspberry Pi 上。測試安裝後，您可以儲存 Raspberry Pi 的 microSD 卡映像，以便在再次嘗試教學課程時使用。

**Topics**
+ [下載並建置 AWS IoT 裝置用戶端](#iot-dc-install-dc-download)
+ [建立教學課程所使用的目錄](#iot-dc-install-dc-files)
+ [(選用) 儲存 microSD 卡映像](#iot-dc-install-dc-save)

## 下載並建置 AWS IoT 裝置用戶端
<a name="iot-dc-install-dc-download"></a>

此程序會在 Raspberry Pi 上安裝 AWS IoT 裝置用戶端。

在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中執行這些命令。

**在 Raspberry Pi 上安裝 AWS IoT 裝置用戶端**

1. 輸入這些命令，在您的 Raspberry Pi 上下載並建置 AWS IoT 裝置用戶端。

   ```
   cd ~
   git clone https://github.com/awslabs/aws-iot-device-client aws-iot-device-client
   mkdir ~/aws-iot-device-client/build && cd ~/aws-iot-device-client/build
   cmake ../
   ```

1. 執行此命令來建置 AWS IoT 裝置用戶端。此命令最多需要 15 分鐘的時間即可完成。

   ```
   cmake --build . --target aws-iot-device-client
   ```

   顯示為 AWS IoT Device Client 編譯的警告訊息可以忽略。

   這些教學課程已在 2021 年 10 月 30 日版本 Raspberry Pi OS (bullseye) 的 **gcc**2021 年 10 月 30 日版本 (Raspbian 8.3.0-6\$1rpi1) 8.3.0 的 Raspberry Pi OS (buster) 的 2021 年 5 月 7 日使用建置於 的 AWS IoT Device Client **gcc**(Raspbian 10.2.1-6\$1rpi1) 10.2.1 20210110 進行測試。

1.  AWS IoT 裝置用戶端完成建置後，請執行此命令來測試它。

   ```
   ./aws-iot-device-client --help
   ```

如果您看到 AWS IoT Device Client 的命令列說明， AWS IoT 表示 Device Client 已成功建置並準備好供您使用。

## 建立教學課程所使用的目錄
<a name="iot-dc-install-dc-files"></a>

此程序會在 Raspberry Pi 上建立目錄，用來存放教學課程在此學習路徑中使用的檔案。

**若要在此學習路徑中建立教學課程所使用的目錄：**

1. 執行這些命令來建立必要的目錄。

   ```
   mkdir ~/dc-configs
   mkdir ~/policies
   mkdir ~/messages
   mkdir ~/certs/testconn
   mkdir ~/certs/pubsub
   mkdir ~/certs/jobs
   ```

1. 執行這些命令來設定新目錄的許可。

   ```
   chmod 745 ~
   chmod 700 ~/certs/testconn
   chmod 700 ~/certs/pubsub
   chmod 700 ~/certs/jobs
   ```

建立這些目錄並設定其許可後，請繼續進行 [(選用) 儲存 microSD 卡映像](#iot-dc-install-dc-save)。

## (選用) 儲存 microSD 卡映像
<a name="iot-dc-install-dc-save"></a>

此時，Raspberry Pi 的 microSD 卡具有更新的作業系統、基本應用程式軟體和 AWS IoT 裝置用戶端。

如果想再次嘗試這些練習和教學課程，可以略過上述程序，方法是將隨此程序儲存的 microSD 卡映像寫入新的 microSD 卡，然後繼續進行 [在 中佈建 Raspberry Pi AWS IoT](iot-dc-install-provision.md)。

**若要將 microSD 記憶卡映像儲存至檔案中：**

在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中：

1. 確認您的 AWS 帳戶 登入資料尚未儲存。

   1. 使用此命令執行 AWS configure 應用程式：

      ```
      aws configure
      ```

   1. 如果憑證已儲存 (若顯示在提示中)，請在提示出現時輸入 **XYXYXYXYX** 字串，如下所示。將 **Default region name** (預設區域名稱) 和 **Default output format** (預設輸出格式) 保留為空白。

      ```
      AWS Access Key ID [****************YXYX]: XYXYXYXYX
      AWS Secret Access Key [****************YXYX]: XYXYXYXYX
      Default region name: 
      Default output format:
      ```

1. 輸入此命令來關閉 Raspberry Pi。

   ```
   sudo shutdown -h 0
   ```

1. Raspberry Pi 完全關閉之後，移除其電源連接器。

1. 從裝置中取出 microSD 卡。

1. 在本機主機電腦上：

   1. 插入 microSD 卡。

   1. 使用 SD 卡映像工具，將 microSD 卡的映像儲存至檔案中。

   1. 儲存 microSD 卡的映像後，請從本機主機電腦中退出記憶卡。

您可以在 [在 中佈建 Raspberry Pi AWS IoT](iot-dc-install-provision.md) 中繼續使用此 microSD 卡。

# 在 中佈建 Raspberry Pi AWS IoT
<a name="iot-dc-install-provision"></a>

本節中的程序會從已安裝 和 AWS IoT 裝置用戶端的已儲存 microSD AWS CLI 映像開始，並建立佈建 Raspberry Pi AWS IoT 的資源和裝置憑證 AWS IoT。

## 在 Raspberry Pi 中安裝 microSD 卡
<a name="iot-dc-install-dc-restore"></a>

此程序會安裝已載入 Raspberry Pi 並設定必要軟體的 microSD 卡，並設定您的 ， AWS 帳戶 以便您可以繼續此學習路徑中的教學課程。

使用 [(選用) 儲存 microSD 卡映像](iot-dc-install-download.md#iot-dc-install-dc-save) 中的 microSD 卡，其中包含此學習路徑中的練習和教學課程所需的軟體。

**在 Raspberry Pi 安裝 microSD 卡**

1. 在 Raspberry Pi 斷開電源後，將 microSD 卡插入 Raspberry Pi。

1. 將電源連接至 Raspberry Pi。

1. 大約一分鐘後，在本機主機電腦上重新啟動終端機視窗工作階段，然後登入 Raspberry Pi。

1. 在本機主機電腦的終端機視窗中，使用 Raspberry Pi 的 **Access Key ID** (存取金鑰 ID) 和 **Secret Access Key** (私密存取金鑰) 憑證：

   1. 使用此命令執行 AWS configure 應用程式：

      ```
      aws configure
      ```

   1. 出現提示時，輸入您的 AWS 帳戶 登入資料和組態資訊：

      ```
      AWS Access Key ID [****************YXYX]: your Access Key ID
      AWS Secret Access Key [****************YXYX]: your Secret Access Key
      Default region name [us-west-2]: your AWS 區域 code
      Default output format [json]: json
      ```

還原 AWS 帳戶 登入資料後，您就可以繼續 [在 中佈建您的裝置 AWS IoT Core](#iot-dc-install-dc-provision)。

## 在 中佈建您的裝置 AWS IoT Core
<a name="iot-dc-install-dc-provision"></a>

本節中的程序會建立佈建 Raspberry Pi AWS IoT 的資源 AWS IoT。建立這些資源時，系統會要求您記錄各種資訊。裝置 AWS IoT 用戶端組態會在下一個程序中使用此資訊。

若要讓您的 Raspberry Pi 使用 AWS IoT，必須進行佈建。佈建是建立和設定支援 Raspberry Pi 作為 IoT 裝置所需的 AWS IoT 資源的程序。

在 Raspberry Pi 開啟電源和重新啟動之後，請在本機主機電腦上的終端機視窗中連接至 Raspberry Pi 並完成這些程序。

**Topics**
+ [建立並下載裝置憑證檔案](#iot-dc-install-dc-provision-certs)
+ [建立 AWS IoT 資源](#iot-dc-install-dc-provision-resources)

### 建立並下載裝置憑證檔案
<a name="iot-dc-install-dc-provision-certs"></a>

此程序會建立此示範的裝置憑證檔案。

**為 Raspberry Pi 建立並下載裝置憑證檔案**

1. 在本機主機電腦的終端機視窗中，輸入這些命令來建立裝置的裝置憑證檔案。

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

   此命令會傳回類似以下的回應。記錄 `certificateArn` 值，供之後使用。

   ```
   {
       "certificateArn": "arn:aws:iot:us-west-2:57EXAMPLE833:cert/76e7e4edb3e52f52334be2f387a06145b2aa4c7fcd810f3aea2d92abc227d269",
       "certificateId": "76e7e4edb3e52f5233EXAMPLE7a06145b2aa4c7fcd810f3aea2d92abc227d269",
       "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgI_SHORTENED_FOR_EXAMPLE_Lgn4jfgtS\n-----END CERTIFICATE-----\n",
       "keyPair": {
           "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BA_SHORTENED_FOR_EXAMPLE_ImwIDAQAB\n-----END PUBLIC KEY-----\n",
           "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQE_SHORTENED_FOR_EXAMPLE_T9RoDiukY\n-----END RSA PRIVATE KEY-----\n"
       }
   }
   ```

1. 輸入下列命令來設定憑證目錄及其檔案的許可。

   ```
   chmod 745 ~
   chmod 700 ~/certs/testconn
   chmod 644 ~/certs/testconn/*
   chmod 600 ~/certs/testconn/private.pem.key
   ```

1. 執行此命令來檢閱憑證目錄和檔案的許可。

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

   命令的輸出應該與您在此處看到的相同，但檔案日期和時間會有所不同。

   ```
   -rw-r--r-- 1 pi pi 1220 Oct 28 13:02 device.pem.crt
   -rw------- 1 pi pi 1675 Oct 28 13:02 private.pem.key
   -rw-r--r-- 1 pi pi  451 Oct 28 13:02 public.pem.key
   ```

此時，您已在 Raspberry Pi 上安裝了裝置憑證檔案，可以繼續進行 [建立 AWS IoT 資源](#iot-dc-install-dc-provision-resources)。

### 建立 AWS IoT 資源
<a name="iot-dc-install-dc-provision-resources"></a>

此程序 AWS IoT 透過建立裝置存取 AWS IoT 功能和服務所需的資源，在 中佈建您的裝置。

**在 中佈建您的裝置 AWS IoT**

1. 在本機主機電腦的終端機視窗中輸入下列命令，取得 AWS 帳戶裝置資料端點的地址。

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

   先前步驟的命令會傳回類似以下的回應：記錄 `endpointAddress` 值，供之後使用。

   ```
   {
       "endpointAddress": "a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. 輸入此命令來建立 Raspberry Pi 的 AWS IoT 物件資源。

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

   如果您的 AWS IoT 物件資源已建立，命令會傳回類似這樣的回應。

   ```
   {
       "thingName": "DevCliTestThing",
       "thingArn": "arn:aws:iot:us-west-2:57EXAMPLE833:thing/DevCliTestThing",
       "thingId": "8ea78707-32c3-4f8a-9232-14bEXAMPLEfd"
   }
   ```

1. 在終端機視窗中：

   1. 開啟文字編輯器，例如 `nano`。

   1. 複製此 JSON 政策文件並將其貼入開啟的文字編輯器中。  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish",
                      "iot:Subscribe",
                      "iot:Receive",
                      "iot:Connect"
                  ],
                  "Resource": [
                      "*"
                  ]
              }
          ]
      }
      ```
**注意**  
本政策文件會慷慨地授予每個資源許可，以便進行連線、接收、發佈和訂閱。通常，政策只會授予特定資源許可，以便執行特定動作。不過，對於初始裝置連線能力測試，這個過度寬鬆的政策能夠在此測試期間盡力降低出現存取問題的機率。在後續教學課程中，將使用範圍較窄的政策文件來示範政策設計的更佳實務。

   1. 將文字編輯器中的檔案儲存為 **\$1/policies/dev\$1cli\$1test\$1thing\$1policy.json**。

1. 執行此命令以使用先前步驟的政策文件來建立 AWS IoT 政策。

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

   如果建立此政策，此命令會傳回類似以下的回應。

   ```
   {
       "policyName": "DevCliTestThingPolicy",
       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/DevCliTestThingPolicy",
       "policyDocument": "{\n    \"Version\": \"2012-10-17\",		 	 	 \n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"iot:Publish\",\n                \"iot:Subscribe\",\n                \"iot:Receive\",\n                \"iot:Connect\"\n            ],\n            \"Resource\": [\n                \"*\"\n            ]\n        }\n    ]\n}\n",
       "policyVersionId": "1"
   }
   ```

1. 執行此命令，將此政策連接至裝置憑證。使用之前儲存的 `certificateArn` 值來取代 `certificateArn`

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

   若成功，此命令不會傳回任何內容。

1. 執行此命令，將裝置憑證連接至 AWS IoT 物件資源。使用之前儲存的 `certificateArn` 值來取代 `certificateArn`

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

   若成功，此命令不會傳回任何內容。

成功在 中佈建裝置後 AWS IoT，您就可以繼續 [設定 AWS IoT 裝置用戶端以測試連線](iot-dc-install-configure.md)。

# 設定 AWS IoT 裝置用戶端以測試連線
<a name="iot-dc-install-configure"></a>

本節中的程序會將 AWS IoT 裝置用戶端設定為從 Raspberry Pi 發佈 MQTT 訊息。

**Topics**
+ [建立組態檔](#iot-dc-install-dc-configure-step1)
+ [開啟 MQTT 測試用戶端](#iot-dc-install-dc-configure-step2)
+ [執行 AWS IoT 裝置用戶端](#iot-dc-install-dc-configure-step3)

## 建立組態檔
<a name="iot-dc-install-dc-configure-step1"></a>

此程序會建立組態檔案來測試 AWS IoT 裝置用戶端。

**建立組態檔案以測試 AWS IoT 裝置用戶端**
+ 在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中：

  1. 輸入下列命令來建立組態檔的目錄，並設定目錄的許可：

     ```
     mkdir ~/dc-configs
     chmod 745 ~/dc-configs
     ```

  1. 開啟文字編輯器，例如 `nano`。

  1. 複製此 JSON 文件並將其貼入開啟的文字編輯器中。

     ```
     {
       "endpoint": "a3qEXAMPLEaffp-ats.iot.us-west-2.amazonaws.com",
       "cert": "~/certs/testconn/device.pem.crt",
       "key": "~/certs/testconn/private.pem.key",
       "root-ca": "~/certs/AmazonRootCA1.pem",
       "thing-name": "DevCliTestThing",
       "logging": {
         "enable-sdk-logging": true,
         "level": "DEBUG",
         "type": "STDOUT",
         "file": ""
       },
       "jobs": {
         "enabled": false,
         "handler-directory": ""
       },
       "tunneling": {
         "enabled": false
       },
       "device-defender": {
         "enabled": false,
         "interval": 300
       },
       "fleet-provisioning": {
         "enabled": false,
         "template-name": "",
         "template-parameters": "",
         "csr-file": "",
         "device-key": ""
       },
       "samples": {
         "pub-sub": {
           "enabled": true,
           "publish-topic": "test/dc/pubtopic",
           "publish-file": "",
           "subscribe-topic": "test/dc/subtopic",
           "subscribe-file": ""
         }
       },
       "config-shadow": {
         "enabled": false
       },
       "sample-shadow": {
         "enabled": false,
         "shadow-name": "",
         "shadow-input-file": "",
         "shadow-output-file": ""
       }
     }
     ```

  1. 將*端點*值取代為您 AWS 帳戶 在 中找到之 的裝置資料端點[在 中佈建您的裝置 AWS IoT Core](iot-dc-install-provision.md#iot-dc-install-dc-provision)。

  1. 將文字編輯器中的檔案儲存為 **\$1/dc-configs/dc-testconn-config.json**。

  1. 執行此命令來設定新組態檔的許可。

     ```
     chmod 644 ~/dc-configs/dc-testconn-config.json
     ```

儲存檔案之後，您就可以繼續進行 [開啟 MQTT 測試用戶端](#iot-dc-install-dc-configure-step2)。

## 開啟 MQTT 測試用戶端
<a name="iot-dc-install-dc-configure-step2"></a>

此程序會準備 AWS IoT 主控台中的 **MQTT 測試用戶端**，以訂閱 AWS IoT 裝置用戶端在執行時發佈的 MQTT 訊息。

**準備 **MQTT test client** (MQTT 測試用戶端) 來訂閱所有 MQTT 訊息**

1. 在 [AWS IoT 主控台](https://console.aws.amazon.com//iot/home#/test)的本機主機電腦上，選擇 **MQTT test client** (MQTT 測試用戶端)。

1. 在 **Subscribe to a topic** (訂閱主題) 索引標籤的 **Topic filter** (主題篩選條件) 中，輸入 **\$1** (單個井字符號)，然後選擇 **Subscribe** (訂閱)，即可訂閱每個 MQTT 主題。

1. 在 **Subscriptions** (訂閱) 標籤下方，請確認看到 **\$1** (單個井字符號)。

在繼續進行 [執行 AWS IoT 裝置用戶端](#iot-dc-install-dc-configure-step3) 時，請讓有 **MQTT test client** (MQTT 測試用戶端) 的視窗保持開啟。

## 執行 AWS IoT 裝置用戶端
<a name="iot-dc-install-dc-configure-step3"></a>

此程序會執行 AWS IoT Device Client，以便發佈 MQTT **測試用戶端接收和顯示的單一 MQTT** 訊息。

**從 AWS IoT 裝置用戶端傳送 MQTT 訊息**

1. 請確保這兩個連接到 Raspberry Pi 的終端機視窗和有 **MQTT test client** (MQTT 測試用戶端) 的視窗會在您執行此程序時顯示出來。

1. 在終端機視窗中，輸入這些命令，以使用在 中建立的組態檔案執行 AWS IoT 裝置用戶端[建立組態檔](#iot-dc-install-dc-configure-step1)。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-testconn-config.json
   ```

   在終端機視窗中， AWS IoT 裝置用戶端會顯示資訊訊息，以及執行時發生的任何錯誤。

   如果終端機視窗中未顯示任何錯誤，請檢閱 **MQTT test client** (MQTT 測試用戶端)。

1. 在 **MQTT test client** (MQTT 測試用戶端) 的 Subscriptions (訂閱) 視窗中，請參閱傳送至 `test/dc/pubtopic` 訊息主題的 *Hello World\$1* 訊息。

1. 如果 AWS IoT 裝置用戶端未顯示錯誤，而且您在 **MQTT 測試用戶端**中看到 *Hello World！* 傳送至`test/dc/pubtopic`訊息，表示連線成功。

1. 在終端機視窗中，輸入 **^C**(Ctrl-C) 以停止 AWS IoT 裝置用戶端。

在您示範 AWS IoT 裝置用戶端在 Raspberry Pi 上正確執行且可與 通訊之後 AWS IoT，您可以繼續前往 [教學課程：示範與 AWS IoT 裝置用戶端的 MQTT 訊息通訊](iot-dc-testconn.md)。

# 教學課程：示範與 AWS IoT 裝置用戶端的 MQTT 訊息通訊
<a name="iot-dc-testconn"></a>

本教學課程示範 AWS IoT 裝置用戶端如何訂閱和發佈 MQTT 訊息，這些訊息常用於 IoT 解決方案。

**若要開始此教學課程：**
+ 將本機主機電腦和 Raspberry Pi 設定成[上一節](iot-dc-install-dc.md)中的使用方式。

  如果您在安裝 AWS IoT 裝置用戶端後儲存 microSD 卡映像，則可以搭配 Raspberry Pi 使用該映像的 microSD 卡。
+ 如果您之前已執行過此示範，請檢閱 [步驟 2：使用 AWS IoT 裝置用戶端建置示範 AWS 帳戶 後清除您的](iot-dc-cleanup.md#iot-dc-cleanup-cloud) 以刪除先前執行中建立的所有 AWS IoT 資源，以避免重複的資源錯誤。

此教學課程約需 45 分鐘方能完成。

**完成此主題時：**
+ 您將示範 IoT 裝置從 訂閱 MQTT 訊息 AWS IoT 以及向其發佈 MQTT 訊息的不同方式 AWS IoT。

**必要設備：**
+ [上一節](iot-dc-install-dc.md)中的本機開發和測試環境
+ [上一節](iot-dc-install-dc.md)中使用的 Raspberry Pi
+ [上一節](iot-dc-install-dc.md)中使用的 Raspberry Pi microSD 記憶卡

**Topics**
+ [準備 Raspberry Pi 以示範 MQTT 訊息通訊](iot-dc-testconn-provision.md)
+ [示範使用 AWS IoT 裝置用戶端發佈訊息](iot-dc-testconn-publish.md)
+ [示範使用 AWS IoT 裝置用戶端訂閱訊息](iot-dc-testconn-subscribe.md)

# 準備 Raspberry Pi 以示範 MQTT 訊息通訊
<a name="iot-dc-testconn-provision"></a>

此程序會在 Raspberry Pi 中 AWS IoT 和 中建立資源，以使用 AWS IoT 裝置用戶端示範 MQTT 訊息通訊。

**Topics**
+ [建立憑證檔案來示範 MQTT 通訊](#iot-dc-testconn-provision-certs)
+ [佈建裝置來示範 MQTT 通訊](#iot-dc-testconn-provision-aws)
+ [設定 AWS IoT Device Client 組態檔案和 MQTT 測試用戶端，以示範 MQTT 通訊](#iot-dc-testconn-provision-dc-config)

## 建立憑證檔案來示範 MQTT 通訊
<a name="iot-dc-testconn-provision-certs"></a>

此程序會建立此示範的裝置憑證檔案。

**為 Raspberry Pi 建立並下載裝置憑證檔案**



1. 在本機主機電腦的終端機視窗中輸入下列命令，為裝置建立裝置憑證檔案。

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

   此命令會傳回類似以下的回應。儲存 `certificateArn` 值，供之後使用。

   ```
   {
   "certificateArn": "arn:aws:iot:us-west-2:57EXAMPLE833:cert/76e7e4edb3e52f52334be2f387a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificateId": "76e7e4edb3e52f5233EXAMPLE7a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgI_SHORTENED_FOR_EXAMPLE_Lgn4jfgtS\n-----END CERTIFICATE-----\n",
   "keyPair": {
       "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BA_SHORTENED_FOR_EXAMPLE_ImwIDAQAB\n-----END PUBLIC KEY-----\n",
       "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQE_SHORTENED_FOR_EXAMPLE_T9RoDiukY\n-----END RSA PRIVATE KEY-----\n"
   }
   }
   ```

1. 輸入下列命令來設定憑證目錄及其檔案的許可。

   ```
   chmod 700 ~/certs/pubsub
   chmod 644 ~/certs/pubsub/*
   chmod 600 ~/certs/pubsub/private.pem.key
   ```

1. 執行此命令來檢閱憑證目錄和檔案的許可。

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

   命令的輸出應該與您在此處看到的相同，但檔案日期和時間會有所不同。

   ```
   -rw-r--r-- 1 pi pi 1220 Oct 28 13:02 device.pem.crt
   -rw------- 1 pi pi 1675 Oct 28 13:02 private.pem.key
   -rw-r--r-- 1 pi pi  451 Oct 28 13:02 public.pem.key
   ```

1. 輸入這些命令來建立記錄檔案的目錄。

   ```
   mkdir ~/.aws-iot-device-client
   mkdir ~/.aws-iot-device-client/log
   chmod 745 ~/.aws-iot-device-client/log
   echo " " > ~/.aws-iot-device-client/log/aws-iot-device-client.log
   echo " " > ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   chmod 600 ~/.aws-iot-device-client/log/*
   ```

## 佈建裝置來示範 MQTT 通訊
<a name="iot-dc-testconn-provision-aws"></a>

本節會建立在 中佈建 Raspberry Pi AWS IoT 的資源 AWS IoT。

**若要在 AWS IoT中佈建裝置：**

1. 在本機主機電腦的終端機視窗中輸入下列命令，取得 AWS 帳戶裝置資料端點的地址。

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

   自您依照上一個教學課程執行此命令後，端點值便未發生變更。此處再次執行命令是為了輕鬆找到資料端點值並將其貼入本教學課程中使用的組態檔。

   先前步驟的命令會傳回類似以下的回應：記錄 `endpointAddress` 值，供之後使用。

   ```
   {
   "endpointAddress": "a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. 輸入此命令來為您的 Raspberry Pi 建立新的 AWS IoT 物件資源。

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

   由於 AWS IoT 物件資源是您在雲端中裝置的*虛擬*表示法，因此我們可以在 中建立多個物件資源 AWS IoT ，以用於不同的用途。這些資源都可以由同一個實體 IoT 裝置使用，用以代表裝置的不同面向。

   這些教學課程一次只會使用一個物件資源來表示 Raspberry Pi。如此一來，在這些教學課程中，它們代表不同的示範，因此在您為示範建立 AWS IoT 資源之後，您可以返回並使用您專門為每個示範建立的資源重複示範。

   如果您的 AWS IoT 物件資源已建立，命令會傳回類似這樣的回應。

   ```
   {
   "thingName": "PubSubTestThing",
   "thingArn": "arn:aws:iot:us-west-2:57EXAMPLE833:thing/PubSubTestThing",
   "thingId": "8ea78707-32c3-4f8a-9232-14bEXAMPLEfd"
   }
   ```

1. 在終端機視窗中：

   1. 開啟文字編輯器，例如 `nano`。

   1. 複製此 JSON 文件並將其貼入開啟的文字編輯器中。  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Connect"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:client/PubSubTestThing"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Subscribe"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Receive"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic"
                  ]
              }
          ]
      }
      ```

   1. 在編輯器中，在政策文件的每個`Resource`區段中，將 *us-west-2：57EXAMPLE833* 取代為 AWS 區域、冒號字元 (：) 和 12 位數字 AWS 帳戶 。

   1. 將文字編輯器中的檔案儲存為 **\$1/policies/pubsub\$1test\$1thing\$1policy.json**。

1. 執行此命令以使用先前步驟中的政策文件來建立 AWS IoT 政策。

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

   如果建立此政策，此命令會傳回類似以下的回應。

   ```
   {
                                       "policyName": "PubSubTestThingPolicy",
                                       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/PubSubTestThingPolicy",
                                       "policyDocument": "{\n\"Version\": \"2012-10-17\",		 	 	 \n\"Statement\": [\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Connect\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Publish\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Subscribe\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Receive\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n]\n}\n]\n}\n",
                                       "policyVersionId": "1"
                                       }
   ```

1. 執行此命令，將此政策連接至裝置憑證。使用之前在本節儲存的 `certificateArn` 值來取代 `certificateArn`

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

   若成功，此命令不會傳回任何內容。

1. 執行此命令，將裝置憑證連接至 AWS IoT 物件資源。使用之前在本節儲存的 `certificateArn` 值來取代 `certificateArn`

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

   若成功，此命令不會傳回任何內容。

成功在 中佈建裝置後 AWS IoT，您就可以繼續 [設定 AWS IoT Device Client 組態檔案和 MQTT 測試用戶端，以示範 MQTT 通訊](#iot-dc-testconn-provision-dc-config)。

## 設定 AWS IoT Device Client 組態檔案和 MQTT 測試用戶端，以示範 MQTT 通訊
<a name="iot-dc-testconn-provision-dc-config"></a>

此程序會建立組態檔案來測試 AWS IoT 裝置用戶端。

**建立組態檔案以測試 AWS IoT 裝置用戶端**

1. 在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中：

   1. 開啟文字編輯器，例如 `nano`。

   1. 複製此 JSON 文件並將其貼入開啟的文字編輯器中。

      ```
      {
        "endpoint": "a3qEXAMPLEaffp-ats.iot.us-west-2.amazonaws.com",
        "cert": "~/certs/pubsub/device.pem.crt",
        "key": "~/certs/pubsub/private.pem.key",
        "root-ca": "~/certs/AmazonRootCA1.pem",
        "thing-name": "PubSubTestThing",
        "logging": {
          "enable-sdk-logging": true,
          "level": "DEBUG",
          "type": "STDOUT",
          "file": ""
        },
        "jobs": {
          "enabled": false,
          "handler-directory": ""
        },
        "tunneling": {
          "enabled": false
        },
        "device-defender": {
          "enabled": false,
          "interval": 300
        },
        "fleet-provisioning": {
          "enabled": false,
          "template-name": "",
          "template-parameters": "",
          "csr-file": "",
          "device-key": ""
        },
        "samples": {
          "pub-sub": {
            "enabled": true,
            "publish-topic": "test/dc/pubtopic",
            "publish-file": "",
            "subscribe-topic": "test/dc/subtopic",
            "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
          }
        },
        "config-shadow": {
          "enabled": false
        },
        "sample-shadow": {
          "enabled": false,
          "shadow-name": "",
          "shadow-input-file": "",
          "shadow-output-file": ""
        }
      }
      ```

   1. 將*端點*值取代為您 AWS 帳戶 在 中找到之 的裝置資料端點[在 中佈建您的裝置 AWS IoT Core](iot-dc-install-provision.md#iot-dc-install-dc-provision)。

   1. 將文字編輯器中的檔案儲存為 **\$1/dc-configs/dc-pubsub-config.json**。

   1. 執行此命令來設定新組態檔的許可。

      ```
      chmod 644 ~/dc-configs/dc-pubsub-config.json
      ```

1. 若要準備 **MQTT test client** (MQTT 測試用戶端) 來訂閱所有 MQTT 訊息：

   1. 在 [AWS IoT 主控台](https://console.aws.amazon.com//iot/home#/test)的本機主機電腦上，選擇 **MQTT test client** (MQTT 測試用戶端)。

   1. 在 **Subscribe to a topic** (訂閱主題) 索引標籤的 **Topic filter** (主題篩選條件) 中，輸入 **\$1** (單個井字符號)，然後選擇 **Subscribe** (訂閱)。

   1. 在 **Subscriptions** (訂閱) 標籤下方，請確認看到 **\$1** (單個井字符號)。

   在繼續進行此教學課程時，請讓有 **MQTT test client** (MQTT 測試用戶端) 的視窗保持開啟。

在儲存檔案並設定 **MQTT test client** (MQTT 測試用戶端)之後，您就可以繼續進行 [示範使用 AWS IoT 裝置用戶端發佈訊息](iot-dc-testconn-publish.md)。

# 示範使用 AWS IoT 裝置用戶端發佈訊息
<a name="iot-dc-testconn-publish"></a>

本節中的程序示範 AWS IoT 裝置用戶端如何傳送預設和自訂 MQTT 訊息。

在上一個步驟為這些練習建立的此政策中的政策陳述式，會授予 Raspberry Pi 執行這些動作的許可：
+ 

**`iot:Connect`**  
提供名為 的用戶端`PubSubTestThing`進行連線，也就是執行 AWS IoT 裝置用戶端的 Raspberry Pi。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Connect"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing"
        ]
      }
  ```
+ 

**`iot:Publish`**  
授予 Raspberry Pi 許可來發佈擁有 `test/dc/pubtopic` MQTT 主題的訊息。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Publish"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic"
        ]
      }
  ```

  此 `iot:Publish` 動作會授予許可來發佈至資源陣列中列出的 MQTT 主題。這些訊息的*內容*不受政策陳述式的控制。

## 使用 AWS IoT 裝置用戶端發佈預設訊息
<a name="iot-dc-testconn-publish-default"></a>

此程序會執行 AWS IoT Device Client，以便發佈 MQTT **測試用戶端接收和顯示的單一預設 MQTT** 訊息。

**從 AWS IoT 裝置用戶端傳送預設 MQTT 訊息**

1. 請確保這兩個連接到 Raspberry Pi 的本機主機電腦終端機視窗和有 **MQTT test client** (MQTT 測試用戶端) 的視窗，會在您執行此程序時顯示出來。

1. 在終端機視窗中，輸入這些命令，以使用在 中建立的組態檔案執行 AWS IoT 裝置用戶端[建立組態檔](iot-dc-install-configure.md#iot-dc-install-dc-configure-step1)。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-config.json
   ```

   在終端機視窗中， AWS IoT 裝置用戶端會顯示資訊訊息，以及執行時發生的任何錯誤。

   如果終端機視窗中未顯示任何錯誤，請檢閱 **MQTT test client** (MQTT 測試用戶端)。

1. 在 **MQTT test client** (MQTT 測試用戶端) 的 **Subscriptions** (訂閱) 視窗中，請參閱傳送至 `test/dc/pubtopic` 訊息主題的 *Hello World\$1* 訊息。

1. 如果 AWS IoT Device Client 未顯示錯誤，而且您在 **MQTT 測試用戶端**看到 *Hello World！* 傳送至`test/dc/pubtopic`訊息，表示連線成功。

1. 在終端機視窗中，輸入 **^C**(Ctrl-C) 以停止 AWS IoT 裝置用戶端。

在您示範 AWS IoT Device Client 已發佈預設 MQTT 訊息之後，您可以繼續前往 [使用 AWS IoT 裝置用戶端發佈自訂訊息](#iot-dc-testconn-publish-custom)。

## 使用 AWS IoT 裝置用戶端發佈自訂訊息
<a name="iot-dc-testconn-publish-custom"></a>

本節中的程序會建立自訂 MQTT 訊息，然後執行 AWS IoT 裝置用戶端，以便它發佈一次自訂 MQTT 訊息，供 **MQTT test client** (MQTT 測試用戶端) 接收和顯示。

### 為 AWS IoT 裝置用戶端建立自訂 MQTT 訊息
<a name="iot-dc-testconn-publish-custom-create"></a>

在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中執行這些步驟。

**為 AWS IoT 要發佈的裝置用戶端建立自訂訊息**

1. 在終端機視窗中，開啟文字編輯器，例如 `nano`。

1. 在文字編輯器中複製並貼入以下 JSON 文件。這將是 AWS IoT 裝置用戶端發佈的 MQTT 訊息承載。

   ```
   {
     "temperature": 28,
     "humidity": 80,
     "barometer": 1013,
     "wind": {
       "velocity": 22,
       "bearing": 255
     }
   }
   ```

1. 將文字編輯器的內容儲存為 **\$1/messages/sample-ws-message.json**。

1. 輸入下列命令，為剛建立的訊息檔案設定許可。

   ```
   chmod 600 ~/messages/*
   ```

**為 AWS IoT 裝置用戶端建立組態檔案，以用來傳送自訂訊息**

1. 在終端機視窗中，在 等文字編輯器中`nano`，開啟現有的 AWS IoT Device Client 組態檔案：**\$1/dc-configs/dc-pubsub-config.json**。

1. 按如下所示編輯 `samples` 物件。無需變更此檔案的其他部分。

   ```
     "samples": {
       "pub-sub": {
         "enabled": true,
         "publish-topic": "test/dc/pubtopic",
         "publish-file": "~/messages/sample-ws-message.json",
         "subscribe-topic": "test/dc/subtopic",
         "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
   ```

1. 將文字編輯器的內容儲存為 **\$1/dc-configs/dc-pubsub-custom-config.json**。

1. 執行此命令來設定新組態檔的許可。

   ```
   chmod 644 ~/dc-configs/dc-pubsub-custom-config.json
   ```

### 使用 AWS IoT 裝置用戶端發佈自訂 MQTT 訊息
<a name="iot-dc-testconn-publish-custom-publish"></a>

此項變更只會影響 MQTT 訊息承載的*內容*，因此目前的政策會繼續運作。不過，如果 *MQTT 主題* (如 `~/dc-configs/dc-pubsub-custom-config.json` 中定義的 `publish-topic` 值) 已變更，`iot::Publish` 政策陳述式也需要進行修改，以允許 Raspberry Pi 發佈至新的 MQTT 主題。

**從 AWS IoT 裝置用戶端傳送 MQTT 訊息**

1. 請確保這兩個終端機視窗和有 **MQTT test client** (MQTT 測試用戶端) 的視窗，會在您執行此程序時顯示出來。此外，請確保 **MQTT test client** (MQTT 測試用戶端) 仍然訂閱了 **\$1** 主題篩選條件。如果未訂閱，請訂閱 **\$1** 主題篩選條件。

1. 在終端機視窗中輸入這些命令，使用在 [建立組態檔](iot-dc-install-configure.md#iot-dc-install-dc-configure-step1) 中建立的組態檔來執行 AWS IoT 裝置用戶端。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-custom-config.json
   ```

   在終端機視窗中， AWS IoT 裝置用戶端會顯示資訊訊息，以及執行時發生的任何錯誤。

   如果終端機視窗中未顯示任何錯誤，請檢閱 MQTT test client (MQTT 測試用戶端)。

1. 在 **MQTT test client** (MQTT 測試用戶端) 的 **Subscriptions** (訂閱) 視窗中，參閱傳送至 `test/dc/pubtopic` 訊息主題的自訂訊息承載。

1. 如果 AWS IoT Device Client 沒有顯示錯誤，而且您在 **MQTT 測試用戶端**中看到發佈至`test/dc/pubtopic`訊息的自訂訊息承載，表示您已成功發佈自訂訊息。

1. 在終端機視窗中，輸入 **^C**(Ctrl-C) 以停止 AWS IoT 裝置用戶端。

在您示範 AWS IoT Device Client 已發佈自訂訊息承載之後，您可以繼續 [示範使用 AWS IoT 裝置用戶端訂閱訊息](iot-dc-testconn-subscribe.md)。

# 示範使用 AWS IoT 裝置用戶端訂閱訊息
<a name="iot-dc-testconn-subscribe"></a>

在本節中，您會示範兩種類型的訊息訂閱：
+ 單一主題訂閱
+ 萬用字元主題訂閱

為這些練習建立的此政策中的政策陳述式會授予 Raspberry Pi 執行這些動作的許可：
+ 

**`iot:Receive`**  
授予 AWS IoT Device Client 許可，以接收符合`Resource`物件中名為 的 MQTT 主題。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Receive"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/subtopic"
        ]
      }
  ```
+ 

**`iot:Subscribe`**  
授予 AWS IoT Device Client 許可，以訂閱符合`Resource`物件中名為 的 MQTT 主題篩選條件。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Subscribe"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic"
        ]
      }
  ```

## 訂閱單一 MQTT 訊息主題
<a name="iot-dc-testconn-subscribe-simple-topic"></a>

此程序示範 AWS IoT 裝置用戶端如何訂閱和記錄 MQTT 訊息。

在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中，列出 **\$1/dc-configs/dc-pubsub-custom-config.json** 的內容或在文字編輯器中開啟檔案來檢閱其內容。找到 `samples` 物件，它應該如下所示。

```
  "samples": {
    "pub-sub": {
      "enabled": true,
      "publish-topic": "test/dc/pubtopic",
      "publish-file": "~/messages/sample-ws-message.json",
      "subscribe-topic": "test/dc/subtopic",
      "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
```

請注意 `subscribe-topic` 值是 MQTT 主題， AWS IoT 裝置用戶端會在執行時訂閱該主題。 AWS IoT Device Client 會將從此訂閱收到的訊息承載寫入 `subscribe-file`值中名為 的檔案。

**從 AWS IoT 裝置用戶端訂閱 MQTT 訊息主題**

1. 請確保這兩個終端機視窗和有 MQTT test client (MQTT 測試用戶端) 的視窗，會在您執行此程序時顯示出來。此外，請確保 **MQTT test client** (MQTT 測試用戶端) 仍然訂閱了 **\$1** 主題篩選條件。如果未訂閱，請訂閱 **\$1** 主題篩選條件。

1. 在終端機視窗中，輸入這些命令，以使用在 中建立的組態檔案執行 AWS IoT 裝置用戶端[建立組態檔](iot-dc-install-configure.md#iot-dc-install-dc-configure-step1)。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-custom-config.json
   ```

   在終端機視窗中， AWS IoT 裝置用戶端會顯示資訊訊息，以及執行時發生的任何錯誤。

   如果終端機視窗中未顯示任何錯誤，請在 AWS IoT 主控台中繼續進行。

1. 在 AWS IoT 主控台的 **MQTT 測試用戶端**中，選擇**發佈至主題**索引標籤。

1. 在 **Topic name** (主題名稱) 中輸入 **test/dc/subtopic**。

1. 在 **Message payload** (訊息承載) 中，檢閱郵件內容。

1. 請選擇 **Publish** (發佈) 來發佈 MQTT 訊息。

1. 在終端機視窗中，請留意從 AWS IoT Device Client *接收的訊息*項目，如下所示。

   ```
   2021-11-10T16:02:20.890Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 45 bytes
   ```

1. 在您看到顯示訊息已接收*的訊息*項目後，請輸入 **^C**(Ctrl-C) 以停止 AWS IoT 裝置用戶端。

1. 輸入此命令來檢視訊息日誌檔案的結尾，查看您從 **MQTT test client** (MQTT 測試用戶端) 發佈的訊息。

   ```
   tail ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   ```

藉由檢視日誌檔案中的訊息，您示範了 AWS IoT 裝置用戶端收到您從 MQTT 測試用戶端發佈的訊息。

## 使用萬用字元訂閱多個 MQTT 訊息主題
<a name="iot-dc-testconn-subscribe-wild-topic"></a>

這些程序示範 AWS IoT 裝置用戶端如何使用萬用字元訂閱和記錄 MQTT 訊息。若要做到這一點，您必須：

1. 更新 AWS IoT Device Client 用來訂閱 MQTT 主題的主題篩選條件。

1. 更新裝置所使用的政策，以允許新的訂閱。

1. 執行 AWS IoT 裝置用戶端，並從 MQTT 測試主控台發佈訊息。

**使用萬用字元 MQTT 主題篩選條件建立用於訂閱多個 MQTT 訊息主題的組態檔**

1. 在連接至 Raspberry Pi 本機主機電腦的終端機視窗中，開啟 **\$1/dc-configs/dc-pubsub-custom-config.json** 進行編輯，並找出 `samples` 物件。

1. 在文字編輯器中，找出 `samples` 物件並更新 `subscribe-topic` 值，如下所示。

   ```
     "samples": {
       "pub-sub": {
         "enabled": true,
         "publish-topic": "test/dc/pubtopic",
         "publish-file": "~/messages/sample-ws-message.json",
         "subscribe-topic": "test/dc/#",
         "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
   ```

   新 `subscribe-topic` 值是末尾具有 MQTT 萬用字元的 [MQTT 主題篩選條件](topics.md#topicfilters)。本節說明訂閱所有以 `test/dc/` 為開頭的 MQTT 主題。 AWS IoT Device Client 會將從此訂閱收到的訊息承載寫入 中名為 的檔案`subscribe-file`。

1. 將修改的組態檔儲存為 **\$1/dc-configs/dc-pubsub-wild-config.json**，然後退出編輯器。

**修改 Raspberry Pi 使用的政策，以允許訂閱和接收多個 MQTT 消息主題**

1. 在連接至 Raspberry Pi 的本機主機電腦上的終端機視窗中，於最喜歡的文字編輯器中開啟 **\$1/policies/pubsub\$1test\$1thing\$1policy.json** 進行編輯，然後找出檔案中的 `iot::Subscribe` 和 `iot::Receive` 政策陳述式。

1. 在 `iot::Subscribe` 政策陳述式中，更新資源物件中的字串，用 `*` 取代 `subtopic`，使其如下所示。

   ```
       {
         "Effect": "Allow",
         "Action": [
           "iot:Subscribe"
         ],
         "Resource": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*"
         ]
       }
   ```
**注意**  
此 [MQTT 主題篩選條件萬用字元](topics.md#topicfilters) 是 `+` (加號) 和 `#` (井號)。結尾帶有 `#` 的訂閱請求會訂閱所有以 `#` 字元前面的字串為開頭的主題 (例如本例中的 `test/dc/`)。  
不過，政策陳述式中授權此訂閱的資源值必須在主題篩選條件 ARN 中使用 `*` (星號) 取代 `#` (井號)。這是因為政策處理器使用的萬用字元與 MQTT 使用的不同。  
如需有關在政策中為主題和主題篩選條件使用萬用字元的詳細資訊，請參閱 [在 MQTT 和 AWS IoT Core 政策中使用萬用字元](pub-sub-policy.md#pub-sub-policy-cert)。

1. 在 `iot::Receive` 政策陳述式中，更新資源物件中的字串，用 `*` 取代 `subtopic`，使其如下所示。

   ```
       {
         "Effect": "Allow",
         "Action": [
           "iot:Receive"
         ],
         "Resource": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*"
         ]
       }
   ```

1. 將更新後的政策文件儲存為 **\$1/policies/pubsub\$1wild\$1test\$1thing\$1policy.json**，然後退出編輯器。

1. 輸入此指令來更新此教學課程的政策，以使用新的資源定義。

   ```
   aws iot create-policy-version \
   --set-as-default \
   --policy-name "PubSubTestThingPolicy" \
   --policy-document "file://~/policies/pubsub_wild_test_thing_policy.json"
   ```

   如果命令成功，它會傳回類似這樣的回應。請注意，`policyVersionId` 現在是 `2`，表示這是此政策的第二個版本。

   如果成功更新了政策，您可以繼續進行下一個程序。

   ```
   {
       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/PubSubTestThingPolicy",
       "policyDocument": "{\n  \"Version\": \"2012-10-17\",		 	 	 \n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Connect\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Publish\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Subscribe\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Receive\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n      ]\n    }\n  ]\n}\n",
       "policyVersionId": "2",
       "isDefaultVersion": true
   }
   ```

   如果收到因政策版本過多而無法儲存新政策的錯誤，請輸入此命令來列出政策的目前版本。檢閱此命令傳回的清單，找出可以刪除的政策版本。

   ```
   aws iot list-policy-versions --policy-name "PubSubTestThingPolicy"
   ```

   輸入此命令來刪除不再需要的版本。請注意，您無法刪除預設政策版本。預設政策版本的 `isDefaultVersion` 值為 `true`。

   ```
   aws iot delete-policy-version \
   --policy-name "PubSubTestThingPolicy" \
   --policy-version-id policyId
   ```

   刪除政策版本後，請重試此步驟。

使用更新的組態檔案和政策，您就可以使用 AWS IoT 裝置用戶端示範萬用字元訂閱。

**示範 AWS IoT 裝置用戶端如何訂閱和接收多個 MQTT 訊息主題**

1. 在 **MQTT test client** (MQTT 測試用戶端) 中，檢查訂閱。如果 **MQTT test client** (MQTT 測試用戶端) 訂閱了 **\$1** 主題篩選條件，請繼續下一個步驟。如果沒有，進入 **MQTT test client** (MQTT 測試用戶端)，在 **Subscribe to a topic** (訂閱主題) 索引標籤的 **Topic filter** (主題篩選條件) 中，輸入 **\$1** (井號字元)，然後選擇 **Subscribe** (訂閱) 進行訂閱。

1. 在連接至 Raspberry Pi 的本機主機電腦終端機視窗中，輸入這些命令來啟動 AWS IoT 裝置用戶端。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-wild-config.json
   ```

1. 在本機主機電腦上的終端機視窗中觀看 AWS IoT Device Client 輸出時，請返回 **MQTT 測試用戶端**。在 **Publish to a topic** (發佈至主題) 索引標籤中的 **Topic name** (主題名稱) 輸入 **test/dc/subtopic**，然後選擇 **Publish** (發佈)。

1. 在終端機視窗中，尋找如下訊息來確認已收到訊息：

   ```
   2021-11-10T16:34:20.101Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 76 bytes
   ```

1. 在本機主機電腦的終端機視窗中觀看 AWS IoT Device Client 輸出時，請返回 **MQTT 測試用戶端**。在 **Publish to a topic** (發佈至主題) 索引標籤中的 **Topic name** (主題名稱) 輸入 **test/dc/subtopic2**，然後選擇 **Publish** (發佈)。

1. 在終端機視窗中，尋找如下訊息來確認已收到訊息：

   ```
   2021-11-10T16:34:32.078Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 77 bytes
   ```

1. 在您看到確認收到兩個訊息的訊息後，請輸入 **^C**(Ctrl-C) 以停止 AWS IoT 裝置用戶端。

1. 輸入此命令來檢視訊息日誌檔案的結尾，查看您從 **MQTT test client** (MQTT 測試用戶端) 發佈的訊息。

   ```
   tail -n 20 ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   ```
**注意**  
記錄檔案僅包含訊息承載。訊息主題不會記錄在接收到的訊息日誌檔案中。  
您也可以在收到的日誌中看到 AWS IoT 裝置用戶端發佈的訊息。這是因為萬用字元主題篩選條件會包含該訊息主題，有時候，訂閱請求可能由訊息代理程式處理，然後才將發佈的訊息傳送給訂閱者。

日誌檔案中的項目會示範已收到訊息。您可以使用其他主題名稱重複此程序。所有主題名稱以 `test/dc/` 為開頭的訊息應該會被接收並記錄。主題名稱以任何其他文字為開頭的訊息都會被忽略。

在示範 AWS IoT 裝置用戶端如何發佈和訂閱 MQTT 訊息之後，請繼續 [教學課程：使用 AWS IoT 裝置用戶端示範遠端動作 （任務）](iot-dc-runjobs.md)。

# 教學課程：使用 AWS IoT 裝置用戶端示範遠端動作 （任務）
<a name="iot-dc-runjobs"></a>

在這些教學課程中，您要設定並部署任務至 Raspberry Pi，以此示範如何將遠程操作發送至 IoT 裝置。

**若要開始此教學課程：**
+ 將本機主機電腦和 Raspberry Pi 設定成[上一節](iot-dc-testconn.md)中的使用方式。
+ 如果您尚未完成上一節中的教學課程，您可以使用 Raspberry Pi 搭配 microSD 卡來嘗試本教學課程，該卡具有您在 中安裝 AWS IoT 裝置用戶端後儲存的影像[(選用) 儲存 microSD 卡映像](iot-dc-install-download.md#iot-dc-install-dc-save)。
+ 如果您之前已執行過此示範，請檢閱 [步驟 2：使用 AWS IoT 裝置用戶端建置示範 AWS 帳戶 後清除您的](iot-dc-cleanup.md#iot-dc-cleanup-cloud) 以刪除先前執行中建立的所有 AWS IoT 資源，以避免重複的資源錯誤。

此教學課程約需 45 分鐘方能完成。

**完成此主題時：**
+ 您將展示 IoT 裝置可以使用 AWS IoT Core 執行 管理之遠端操作的不同方式 AWS IoT 。

**必要設備：**
+ [上一節](iot-dc-install-dc.md)中測試的本機開發和測試環境
+ [上一節](iot-dc-install-dc.md)中測試的 Raspberry Pi
+ [上一節](iot-dc-install-dc.md)中測試的 Raspberry Pi microSD 記憶卡

**Topics**
+ [準備 Raspberry Pi 以執行任務](iot-dc-runjobs-prepare.md)
+ [AWS IoT 使用 AWS IoT 裝置用戶端在 中建立和執行任務](iot-dc-runjobs-prepare-define.md)

# 準備 Raspberry Pi 以執行任務
<a name="iot-dc-runjobs-prepare"></a>

本節中的程序說明如何使用 AWS IoT 裝置用戶端，讓您的 Raspberry Pi 準備好執行任務。

**注意**  
這些程序是裝置特定的程序。如果想要同時使用多個裝置執行本節中的程序，每個裝置都需要有自己的政策和唯一的裝置特定憑證及物件名稱。若要為每個裝置提供獨特資源，請在按程序所述變更裝置特定元素時，針對每個裝置執行此程序一次。

**Topics**
+ [佈建 Raspberry Pi 來示範任務](#iot-dc-runjobs-prepare-provision)
+ [設定 AWS IoT 裝置用戶端以執行任務代理程式](#iot-dc-runjobs-prepare-config)

## 佈建 Raspberry Pi 來示範任務
<a name="iot-dc-runjobs-prepare-provision"></a>

本節中的程序 AWS IoT 會透過為 Raspberry Pi 建立 AWS IoT 資源和裝置憑證，在 中佈建您的 Raspberry Pi。

**Topics**
+ [建立和下載裝置憑證檔案以示範 AWS IoT 任務](#iot-dc-runjobs-prepare-cert)
+ [建立 AWS IoT 資源以示範 AWS IoT 任務](#iot-dc-runjobs-prepare-iot)

### 建立和下載裝置憑證檔案以示範 AWS IoT 任務
<a name="iot-dc-runjobs-prepare-cert"></a>

此程序會建立此示範的裝置憑證檔案。

如果要準備一個以上的裝置，則必須在每個裝置上執行此程序。

**若要為 Raspberry Pi 建立並下載裝置憑證檔案：**

在連接至 Raspberry Pi 的本機主機電腦終端機視窗中，輸入這些命令。

1. 請輸入下列命令，為裝置建立裝置憑證檔案。

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

   此命令會傳回類似以下的回應。儲存 `certificateArn` 值，供之後使用。

   ```
   {
   "certificateArn": "arn:aws:iot:us-west-2:57EXAMPLE833:cert/76e7e4edb3e52f52334be2f387a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificateId": "76e7e4edb3e52f5233EXAMPLE7a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgI_SHORTENED_FOR_EXAMPLE_Lgn4jfgtS\n-----END CERTIFICATE-----\n",
   "keyPair": {
       "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BA_SHORTENED_FOR_EXAMPLE_ImwIDAQAB\n-----END PUBLIC KEY-----\n",
       "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQE_SHORTENED_FOR_EXAMPLE_T9RoDiukY\n-----END RSA PRIVATE KEY-----\n"
   }
   }
   ```

1. 輸入下列命令來設定憑證目錄及其檔案的許可。

   ```
   chmod 700 ~/certs/jobs
   chmod 644 ~/certs/jobs/*
   chmod 600 ~/certs/jobs/private.pem.key
   ```

1. 執行此命令來檢閱憑證目錄和檔案的許可。

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

   命令的輸出應該與您在此處看到的相同，但檔案日期和時間會有所不同。

   ```
   -rw-r--r-- 1 pi pi 1220 Oct 28 13:02 device.pem.crt
   -rw------- 1 pi pi 1675 Oct 28 13:02 private.pem.key
   -rw-r--r-- 1 pi pi  451 Oct 28 13:02 public.pem.key
   ```

在下載裝置憑證檔案至 Raspberry Pi 之後，您就可以繼續進行 [佈建 Raspberry Pi 來示範任務](#iot-dc-runjobs-prepare-provision)。

### 建立 AWS IoT 資源以示範 AWS IoT 任務
<a name="iot-dc-runjobs-prepare-iot"></a>

建立此裝置 AWS IoT 的資源。

如果要準備一個以上的裝置，則必須為每個裝置上執行此程序。



**若要在 AWS IoT中佈建裝置：**

在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中：

1. 輸入下列命令，取得 AWS 帳戶裝置資料端點地址。

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

   自您上一次執行此命令後，端點值便未發生變更。此處再次執行命令是為了輕鬆找出資料端點值並貼入本教學課程中使用的組態檔。

   **describe-endpoint** 命令會傳回類似以下的回應。記錄 `endpointAddress` 值，供之後使用。

   ```
   {
   "endpointAddress": "a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. 使用裝置的唯一名稱來取代 *uniqueThingName*。如果想要使用多個裝置執行本教學課程，請賦予每個裝置自己的名稱。例如 **TestDevice01**、**TestDevice02** 等等。

   輸入此命令來為您的 Raspberry Pi 建立新的 AWS IoT 物件資源。

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

   由於 AWS IoT 物件資源是雲端中裝置的*虛擬*表示法，因此我們可以在 中建立多個物件資源 AWS IoT ，以用於不同的用途。這些資源都可以由同一個實體 IoT 裝置使用，用以代表裝置的不同面向。
**注意**  
當您想要保護多個裝置的政策時，可以使用 `${iot:Thing.ThingName}` 來取代靜態物件名稱 `uniqueThingName`。

   這些教學課程每次只會使用一個物件資源。如此一來，在這些教學課程中，它們代表不同的示範，因此在您為示範建立 AWS IoT 資源之後，您可以使用您專門為每個示範建立的資源來返回並重複示範。

   如果您的 AWS IoT 物件資源已建立，命令會傳回類似這樣的回應。記錄 `thingArn` 值以供稍後在此裝置上建立要執行的任務時使用。

   ```
   {
   "thingName": "uniqueThingName",
   "thingArn": "arn:aws:iot:us-west-2:57EXAMPLE833:thing/uniqueThingName",
   "thingId": "8ea78707-32c3-4f8a-9232-14bEXAMPLEfd"
   }
   ```

1. 在終端機視窗中：

   1. 開啟文字編輯器，例如 `nano`。

   1. 複製此 JSON 文件並將其貼入開啟的文字編輯器中。  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Connect"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:client/uniqueThingName"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/job/*",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Subscribe"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Receive"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic",
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:DescribeJobExecution",
                      "iot:GetPendingJobExecutions",
                      "iot:StartNextPendingJobExecution",
                      "iot:UpdateJobExecution"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName"
                  ]
              }
          ]
      }
      ```

   1. 在編輯器的每個政策陳述式 `Resource` 區段中，使用 AWS 區域來取代 *us-west-2:57EXAMPLE833*、一個冒號字元 (:) 和 12 位數的 AWS 帳戶 編號。

   1. 在編輯器的在每個政策陳述式中，使用您賦予此物件資源的物件名稱來取代 *uniqueThingName*。

   1. 將文字編輯器中的檔案儲存為 **\$1/policies/jobs\$1test\$1thing\$1policy.json**。

      如果為多個裝置執行此程序，請在每個裝置上將檔案儲存為此檔案名稱。

1. 將 *uniqueThingName* 取代為裝置的物件名稱，然後執行此命令來建立為該裝置量身打造 AWS IoT 的政策。

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

   如果建立此政策，此命令會傳回類似以下的回應。  
****  

   ```
   {
       "policyName": "JobTestPolicyForuniqueThingName",
       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/JobTestPolicyForuniqueThingName",
       "policyDocument": "{\n\"Version\": \"2012-10-17\",\n\"Statement\": [\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Connect\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Publish\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Subscribe\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Receive\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n]\n}\n]\n}\n",
       "policyVersionId": "1"
   }
   ```

1. 使用裝置的物件名稱來取代 *uniqueThingName*，再使用稍早您在本節為此裝置儲存的 `certificateArn` 值來取代 `certificateArn`，然後執行此命令來將政策連接至裝置憑證。

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

   若成功，此命令不會傳回任何內容。

1.  將 *uniqueThingName* 取代為裝置的物件名稱，將 取代`certificateArn`為您稍早在本節中儲存`certificateArn`的值，然後執行此命令以將裝置憑證連接至 AWS IoT 物件資源。

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

   若成功，此命令不會傳回任何內容。

在成功佈建 Raspberry Pi 之後，您就可以在測試中為另一 Raspberry Pi 重複本節程序；或者，如果所有裝置都已佈建，則繼續進行 [設定 AWS IoT 裝置用戶端以執行任務代理程式](#iot-dc-runjobs-prepare-config)。

## 設定 AWS IoT 裝置用戶端以執行任務代理程式
<a name="iot-dc-runjobs-prepare-config"></a>

此程序會為 AWS IoT 裝置用戶端建立組態檔案，以執行任務代理程式：。

注意：如果要準備一個以上的裝置，則必須在每個裝置上執行此程序。

**若要建立組態檔案以測試 AWS IoT 裝置用戶端：**

1. 在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中：

   1. 開啟文字編輯器，例如 `nano`。

   1. 複製此 JSON 文件並將其貼入開啟的文字編輯器中。

      ```
      {
        "endpoint": "a3qEXAMPLEaffp-ats.iot.us-west-2.amazonaws.com",
        "cert": "~/certs/jobs/device.pem.crt",
        "key": "~/certs/jobs/private.pem.key",
        "root-ca": "~/certs/AmazonRootCA1.pem",
        "thing-name": "uniqueThingName",
        "logging": {
          "enable-sdk-logging": true,
          "level": "DEBUG",
          "type": "STDOUT",
          "file": ""
        },
        "jobs": {
          "enabled": true,
          "handler-directory": ""
        },
        "tunneling": {
          "enabled": false
        },
        "device-defender": {
          "enabled": false,
          "interval": 300
        },
        "fleet-provisioning": {
          "enabled": false,
          "template-name": "",
          "template-parameters": "",
          "csr-file": "",
          "device-key": ""
        },
        "samples": {
          "pub-sub": {
            "enabled": false,
            "publish-topic": "",
            "publish-file": "",
            "subscribe-topic": "",
            "subscribe-file": ""
          }
        },
        "config-shadow": {
          "enabled": false
        },
        "sample-shadow": {
          "enabled": false,
          "shadow-name": "",
          "shadow-input-file": "",
          "shadow-output-file": ""
        }
      }
      ```

   1. 將*端點*值取代為您 AWS 帳戶 在 中找到之 的裝置資料端點值[在 中佈建您的裝置 AWS IoT Core](iot-dc-install-provision.md#iot-dc-install-dc-provision)。

   1. 用此裝置使用的物件名稱取代 *uniqueThingName*。

   1. 將文字編輯器中的檔案儲存為 **\$1/dc-configs/dc-jobs-config.json**。

1. 執行此命令來設定新組態檔的檔案許可。

   ```
   chmod 644 ~/dc-configs/dc-jobs-config.json
   ```

您不必使用 **MQTT test client** (MQTT 測試用戶端) 進行此測試。雖然裝置將與 交換任務相關的 MQTT 訊息 AWS IoT，但任務進度訊息只會與執行任務的裝置交換。由於任務進度訊息只會與執行任務的裝置交換，因此您無法從其他裝置訂閱這些訊息，例如 AWS IoT 主控台。

儲存組態檔之後，您就可以繼續進行 [AWS IoT 使用 AWS IoT 裝置用戶端在 中建立和執行任務](iot-dc-runjobs-prepare-define.md)。

# AWS IoT 使用 AWS IoT 裝置用戶端在 中建立和執行任務
<a name="iot-dc-runjobs-prepare-define"></a>

本節中的程序會建立任務文件和 AWS IoT 任務資源。建立任務資源後， 會將任務文件 AWS IoT 傳送至任務代理程式將任務文件套用至裝置或用戶端的指定任務目標。

**Topics**
+ [建立和存放 IoT 任務的任務文件](#iot-dc-runjobs-prepare-define-jobdoc)
+ [AWS IoT 在一個 IoT 裝置的 中執行任務](#iot-dc-runjobs-prepare-define-job)

## 建立和存放 IoT 任務的任務文件
<a name="iot-dc-runjobs-prepare-define-jobdoc"></a>

此程序會建立簡單的任務文件，以包含在 AWS IoT 任務資源中。此任務文件會在任務目標上 顯示 "Hello world\$1"。

**若要建立和儲存任務文件：**

1. 選取要儲存任務文件的 Amazon S3 儲存貯體。如果沒有可使用的現有 Amazon S3 儲存貯體，就需要建立一個。如需如何建立 Amazon S3 儲存貯體的詳細資訊，請參閱 [Amazon S3 入門](https://docs.aws.amazon.com//AmazonS3/latest/userguide/GetStartedWithS3.html)中的主題。

1. 建立並儲存此任務的任務文件

   1. 在本機主機電腦上，開啟文字編輯器。

   1. 將此文字複製並貼入編輯器中。

      ```
      {
          "operation": "echo",
          "args": ["Hello world!"]
      }
      ```

   1. 在本機主機電腦上，將編輯器的內容儲存至名為 **hello-world-job.json** 的檔案。

   1. 請確認檔案已正確儲存。某些文字編輯器會在儲存文字檔案時自動附加 `.txt` 至檔案名稱。如果編輯器附加了 `.txt` 至檔案名稱，請更正檔案名稱後再繼續。

1. 使用 **hello-world-job.json** 路徑來取代 *path\$1to\$1file*；如果該路徑不在當前目錄中，則使用所選儲存貯體的 Amazon S3 儲存貯體路徑取代 *s3\$1bucket\$1name*，然後執行此命令將任務文件放入 Amazon S3 儲存貯體中。

   ```
   aws s3api put-object \
   --key hello-world-job.json \
   --body path_to_file/hello-world-job.json --bucket s3_bucket_name
   ```

   識別儲存在 Amazon S3 中的任務文件的任務文件 URL 是透過取代以下 URL 中 *s3\$1bucket\$1name* 和 *AWS\$1region* 來決定。記錄產生的 URL 以便稍後使用為 *job\$1document\$1path*

   ```
   https://s3_bucket_name.s3.AWS_Region.amazonaws.com/hello-world-job.json
   ```
**注意**  
AWS 安全性可防止您在 外部開啟此 URL AWS 帳戶，例如使用瀏覽器。根據預設，具有 檔案存取權 AWS IoT 的任務引擎會使用 URL。在生產環境中，您需要確保 AWS IoT 服務具有存取儲存在 Amazon S3 中任務文件的許可。

在儲存任務文件的 URL 之後，請繼續進行 [AWS IoT 在一個 IoT 裝置的 中執行任務](#iot-dc-runjobs-prepare-define-job)。

## AWS IoT 在一個 IoT 裝置的 中執行任務
<a name="iot-dc-runjobs-prepare-define-job"></a>

本節中的程序會啟動 Raspberry Pi 上的 AWS IoT Device Client，以在裝置上執行任務代理程式，以等待任務執行。它也會在 中建立任務資源 AWS IoT，將任務傳送至 IoT 裝置並在其上執行。

**注意**  
此程序只會在單一裝置上執行任務。

**若要啟動 Raspberry Pi 任務代理程式：**

1. 在本機主機電腦上連線至 Raspberry Pi 的終端機視窗中，執行此命令來啟動 AWS IoT 裝置用戶端。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-jobs-config.json
   ```

1. 在終端機視窗中，確認 AWS IoT 裝置用戶端並顯示這些訊息

   ```
   2021-11-15T18:45:56.708Z [INFO]  {Main.cpp}: Jobs is enabled
                         .
                         .
                         .
   2021-11-15T18:45:56.708Z [INFO]  {Main.cpp}: Client base has been notified that Jobs has started
   2021-11-15T18:45:56.708Z [INFO]  {JobsFeature.cpp}: Running Jobs!
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to startNextPendingJobExecution accepted and rejected
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to nextJobChanged events
   2021-11-15T18:45:56.708Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to updateJobExecutionStatusAccepted for jobId +
   2021-11-15T18:45:56.738Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToUpdateJobExecutionAccepted with code {0}
   2021-11-15T18:45:56.739Z [DEBUG] {JobsFeature.cpp}: Attempting to subscribe to updateJobExecutionStatusRejected for jobId +
   2021-11-15T18:45:56.753Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToNextJobChanged with code {0}
   2021-11-15T18:45:56.760Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToStartNextJobRejected with code {0}
   2021-11-15T18:45:56.776Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToStartNextJobAccepted with code {0}
   2021-11-15T18:45:56.776Z [DEBUG] {JobsFeature.cpp}: Ack received for SubscribeToUpdateJobExecutionRejected with code {0}
   2021-11-15T18:45:56.777Z [DEBUG] {JobsFeature.cpp}: Publishing startNextPendingJobExecutionRequest
   2021-11-15T18:45:56.785Z [DEBUG] {JobsFeature.cpp}: Ack received for StartNextPendingJobPub with code {0}
   2021-11-15T18:45:56.785Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

1. 在終端機視窗中看到此訊息之後，請繼續執行下一個程序並建立任務資源。請注意，它可能不是清單中的最後一個項目。

   ```
   2021-11-15T18:45:56.785Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

**建立 AWS IoT 任務資源**

1. 在本機主機電腦上：

   1. 使用來自 [建立和存放 IoT 任務的任務文件](#iot-dc-runjobs-prepare-define-jobdoc) 的任務文件 URL 來取代 *job\$1document\$1url*。

   1. 使用為裝置建立的物件資源 ARN 來取代 *thing\$1arn*，然後執行此命令。

      ```
      aws iot create-job \
      --job-id hello-world-job-1 \
      --document-source "job_document_url" \
      --targets "thing_arn" \
      --target-selection SNAPSHOT
      ```

      如果成功，命令會傳回類似以下的結果。

      ```
      {
        "jobArn": "arn:aws:iot:us-west-2:57EXAMPLE833:job/hello-world-job-1",
        "jobId": "hello-world-job-1"
      }
      ```

1. 在終端機視窗中，您應該會看到來自 AWS IoT Device Client 的輸出，如下所示。

   ```
   2021-11-15T18:02:26.688Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Job ids differ
   2021-11-15T18:10:24.890Z [INFO]  {JobsFeature.cpp}: Executing job: hello-world-job-1
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Attempting to update job execution status!
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Not including stdout with the status details
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Not including stderr with the status details
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Assuming executable is in PATH
   2021-11-15T18:10:24.890Z [INFO]  {JobsFeature.cpp}: About to execute: echo Hello world!
   2021-11-15T18:10:24.890Z [DEBUG] {Retry.cpp}: Retryable function starting, it will retry until success
   2021-11-15T18:10:24.890Z [DEBUG] {JobsFeature.cpp}: Created EphermalPromise for ClientToken 3TEWba9Xj6 in the updateJobExecution promises map
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Child process now running
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Child process about to call execvp
   2021-11-15T18:10:24.890Z [DEBUG] {JobEngine.cpp}: Parent process now running, child PID is 16737
   2021-11-15T18:10:24.891Z [DEBUG] {16737}: Hello world!
   2021-11-15T18:10:24.891Z [DEBUG] {JobEngine.cpp}: JobEngine finished waiting for child process, returning 0
   2021-11-15T18:10:24.891Z [INFO]  {JobsFeature.cpp}: Job exited with status: 0
   2021-11-15T18:10:24.891Z [INFO]  {JobsFeature.cpp}: Job executed successfully!
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Attempting to update job execution status!
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Not including stdout with the status details
   2021-11-15T18:10:24.891Z [DEBUG] {JobsFeature.cpp}: Not including stderr with the status details
   2021-11-15T18:10:24.892Z [DEBUG] {Retry.cpp}: Retryable function starting, it will retry until success
   2021-11-15T18:10:24.892Z [DEBUG] {JobsFeature.cpp}: Created EphermalPromise for ClientToken GmQ0HTzWGg in the updateJobExecution promises map
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Ack received for PublishUpdateJobExecutionStatus with code {0}
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Removing ClientToken 3TEWba9Xj6 from the updateJobExecution promises map
   2021-11-15T18:10:24.905Z [DEBUG] {JobsFeature.cpp}: Success response after UpdateJobExecution for job hello-world-job-1
   2021-11-15T18:10:24.917Z [DEBUG] {JobsFeature.cpp}: Ack received for PublishUpdateJobExecutionStatus with code {0}
   2021-11-15T18:10:24.918Z [DEBUG] {JobsFeature.cpp}: Removing ClientToken GmQ0HTzWGg from the updateJobExecution promises map
   2021-11-15T18:10:24.918Z [DEBUG] {JobsFeature.cpp}: Success response after UpdateJobExecution for job hello-world-job-1
   2021-11-15T18:10:25.861Z [INFO]  {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
   ```

1. 當 AWS IoT 裝置用戶端正在執行並等待任務時，您可以透過變更 `job-id`值，並從**create-job**步驟 1 重新執行 來提交另一個任務。

當您完成執行任務時，請在終端機視窗中輸入 ^C(control-C) 以停止 AWS IoT 裝置用戶端。

# 教學課程：執行 AWS IoT Device Client 教學課程後清除
<a name="iot-dc-cleanup"></a>

本教學課程中的程序會在完成此學習路徑中的教學課程時，逐步引導您移除所建立的檔案和資源。

**Topics**
+ [步驟 1：使用 裝置用戶端建置示範後清除 AWS IoT 裝置](#iot-dc-cleanup-devices)
+ [步驟 2：使用 AWS IoT 裝置用戶端建置示範 AWS 帳戶 後清除您的](#iot-dc-cleanup-cloud)

## 步驟 1：使用 裝置用戶端建置示範後清除 AWS IoT 裝置
<a name="iot-dc-cleanup-devices"></a>

本教學課程說明在此學習路徑中建置示範後，如何清除 microSD 卡的兩個選項。選擇提供所需安全等級的選項。

請注意，清除裝置的 microSD 卡不會移除您建立的任何 AWS IoT 資源。若要在清理裝置的 microSD 卡之後清除 AWS IoT 資源，您應該檢閱 上的教學課程[步驟 2：使用 AWS IoT 裝置用戶端建置示範 AWS 帳戶 後清除您的](#iot-dc-cleanup-cloud)。

### 選項 1：透過重新寫入 microSD 記憶卡進行清除
<a name="iot-dc-cleanup-devices-flash"></a>

在完成此學習路徑中的教學課程後，清除 microSD 卡最簡單且最徹底的方法是，使用您在第一次準備裝置時所建立的儲存映像檔案覆寫 microSD 卡。

此程序會使用本機主機電腦，將儲存的 microSD 卡映像寫入 microSD 卡。

**注意**  
如果裝置未針對其作業系統使用卸除式儲存媒體，請參閱該裝置的程序。

**若要將新映像寫入 microSD 卡**

1. 在本機主機電腦上，找出要寫入至 microSD 卡的儲存 microSD 卡映像。

1. 請將 microSD 卡插入主機電腦。

1. 使用 SD 卡映像工具，將選取的影像檔案寫入至 microSD 卡。

1. 寫入 Raspberry Pi 作業系統映像至 microSD 卡後，請退出 microSD 卡並安全地將其從本機主機電腦中移除。

您的 microSD 卡已可供使用。

### 選項 2：透過刪除使用者目錄進行清除
<a name="iot-dc-cleanup-devices-dirs"></a>

若要在完成教學課程後清理 microSD 卡而不重寫 microSD 卡映像，您可以個別刪除使用者目錄。這並不像從儲存映像重寫 microSD 卡那麼徹底，因為此操作不會移除任何可能已安裝的系統檔案。

如果移除使用者目錄足以滿足需求，您可以遵循此程序。

**從裝置刪除此學習路徑的使用者目錄**

1. 在連接至裝置的終端機視窗中，執行這些命令來刪除在此學習路徑中建立的使用者目錄、子目錄及其所有檔案。
**注意**  
在刪除這些目錄和檔案之後，您必須再次完成教學課程，才能執行示範。

   ```
   rm -Rf ~/dc-configs
   rm -Rf ~/policies
   rm -Rf ~/messages
   rm -Rf ~/certs
   rm -Rf ~/.aws-iot-device-client
   ```

1. 在連接至裝置的終端機視窗中，執行這些命令來刪除應用程式來源目錄和檔案。
**注意**  
這些命令不會解除安裝任何程式。它們只會刪除用於建置和安裝它們的來源檔案。刪除這些檔案後， AWS CLI 和 AWS IoT 裝置用戶端可能無法運作。

   ```
   rm -Rf ~/aws-cli
   rm -Rf ~/aws
   rm -Rf ~/aws-iot-device-client
   ```

## 步驟 2：使用 AWS IoT 裝置用戶端建置示範 AWS 帳戶 後清除您的
<a name="iot-dc-cleanup-cloud"></a>

這些程序可協助您識別和移除您在完成此學習路徑中的教學課程時建立 AWS 的資源。

### 清除 AWS IoT 資源
<a name="iot-dc-cleanup-cloud-iot"></a>

此程序可協助您識別和移除您在完成此學習路徑中的教學課程時建立 AWS IoT 的資源。


**AWS IoT 在此學習路徑中建立的資源**  

| 教學課程 | 物件資源 | 政策資源 | 
| --- | --- | --- | 
|  [教學課程：安裝和設定 AWS IoT 裝置用戶端](iot-dc-install-dc.md)  |  **DevCliTestThing**  | DevCliTestThingPolicy | 
|  [教學課程：示範與 AWS IoT 裝置用戶端的 MQTT 訊息通訊](iot-dc-testconn.md)  |  **PubSubTestThing**  | PubSubTestThingPolicy | 
|  [教學課程：使用 AWS IoT 裝置用戶端示範遠端動作 （任務）](iot-dc-runjobs.md)  | 使用者定義 (可能不止一個) |  *使用者定義* (可能不止一個)  | 

**若要刪除 AWS IoT 資源，請遵循您建立的每個物件資源的此程序**

1. 使用要刪除的物件資源名稱來取代 `thing_name`，然後執行此命令從本機主機電腦列出連接至物件資源的憑證。

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

   此命令會傳回像這樣的回應，其中會列出連接至 `thing_name` 的憑證。在大多數情況下，清單中只會有一個憑證。

   ```
   {
       "principals": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:cert/23853eea3cf0edc7f8a69c74abeafa27b2b52823cab5b3e156295e94b26ae8ac"
       ]
   }
   ```

1. 針對上一個命令列出的每個憑證：

   1. 使用上一個命令的憑證 ID 來取代 `certificate_ID`。憑證 ID 是上一個命令傳回的 ARN 中 `cert/` 後面的英數字元。然後執行此命令來停用憑證。

      ```
      aws iot update-certificate --new-status INACTIVE --certificate-id certificate_ID
      ```

      如果成功，此命令不會傳回任何內容。

   1. 使用之前傳回的憑證清單中的憑證 ARN 來取代 `certificate_ARN`，然後執行此命令來列出連接至此憑證的政策。

      ```
      aws iot list-attached-policies --target certificate_ARN
      ```

      此命令會傳回像這樣的回應，其中會列出連接至憑證的政策。在大多數情況下，清單中只會有一個政策。

      ```
      {
          "policies": [
              {
                  "policyName": "DevCliTestThingPolicy",
                  "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/DevCliTestThingPolicy"
              }
          ]
      }
      ```

   1. 每個連接至憑證的政策：

      1. 使用上一個命令的 `policyName` 值來取代 `policy_name`，使用憑證的 ARN 來取代 `certificate_ARN`，然後執行此命令從憑證分離政策。

         ```
         aws iot detach-policy --policy-name policy_name --target certificate_ARN
         ```

         如果成功，此命令不會傳回任何內容。

      1. 使用 `policyName` 值來取代 `policy_name`，然後執行此命令，查看政策是否已連接至任何憑證。

         ```
         aws iot list-targets-for-policy --policy-name policy_name
         ```

         如果命令傳回類似這樣的空白清單，代表政策未連接至任何憑證，您可以繼續列出政策版本。如果仍有連接至政策的憑證，請繼續進行 **detach-thing-principal** 步驟。

         ```
         {
             "targets": []
         }
         ```

      1. 使用 `policyName` 值來取代 `policy_name`，然後執行此命令來檢查政策版本。若要刪除政策，該政策必須只有一個版本。

         ```
         aws iot list-policy-versions --policy-name policy_name
         ```

         如果政策只有一個版本 (例如此範例)，您可以跳至 **delete-policy** 步驟，然後立即刪除政策。

         ```
         {
             "policyVersions": [
                 {
                     "versionId": "1",
                     "isDefaultVersion": true,
                     "createDate": "2021-11-18T01:02:46.778000+00:00"
                 }
             ]
         }
         ```

         如果政策具有多個版本 (例如此範例)，就必須先刪除具有 `isDefaultVersion` 值的 `false`，才能刪除政策。

         ```
         {
             "policyVersions": [
                 {
                     "versionId": "2",
                     "isDefaultVersion": true,
                     "createDate": "2021-11-18T01:52:04.423000+00:00"
                 },
                 {
                     "versionId": "1",
                     "isDefaultVersion": false,
                     "createDate": "2021-11-18T01:30:18.083000+00:00"
                 }
             ]
         }
         ```

         如果需要刪除政策版本，請使用 `policyName` 值來取代 `policy_name`，使用上一個命令的 `versionId` 值取代 `version_ID`，然後執行此命令來刪除政策版本。

         ```
         aws iot delete-policy-version --policy-name policy_name --policy-version-id version_ID
         ```

         如果成功，此命令不會傳回任何內容。

         刪除政策版本後，請重複此步驟，直到政策只有一個政策版本為止。

      1. 使用 `policyName` 值來取代 `policy_name`，然後執行此命令來刪除政策。

         ```
         aws iot delete-policy --policy-name policy_name
         ```

   1. 使用物件的名稱來取代 `thing_name`，再使用憑證的 ARN 來取代 `certificate_ARN`，然後執行此命令來從物件資源分離憑證。

      ```
      aws iot detach-thing-principal --thing-name thing_name --principal certificate_ARN
      ```

      如果成功，此命令不會傳回任何內容。

   1. 使用上一個命令的憑證 ID 來取代 `certificate_ID`。憑證 ID 是上一個命令傳回的 ARN 中 `cert/` 後面的英數字元。然後執行此命令來刪除憑證資源。

      ```
      aws iot delete-certificate --certificate-id certificate_ID
      ```

      如果成功，此命令不會傳回任何內容。

1. 使用物件的名稱來取代 `thing_name`，然後執行此命令來刪除該物件。

   ```
   aws iot delete-thing --thing-name thing_name
   ```

   如果成功，此命令不會傳回任何內容。

### 清除 AWS 資源
<a name="iot-dc-cleanup-cloud-aws"></a>

此程序可協助您識別和移除您在完成此學習路徑中的教學課程時建立的其他 AWS 資源。


**在此學習路徑中建立的其他 AWS 資源**  

| 教學課程 | Resource Type (資源類型) | 資源名稱或 ID | 
| --- | --- | --- | 
|  [教學課程：使用 AWS IoT 裝置用戶端示範遠端動作 （任務）](iot-dc-runjobs.md)  | Amazon S3 物件 | hello-world-job.json | 
|  [教學課程：使用 AWS IoT 裝置用戶端示範遠端動作 （任務）](iot-dc-runjobs.md)  |  AWS IoT 任務資源  | 使用者定義 | 

**刪除在此學習路徑中建立 AWS 的資源**

1. 刪除在此學習路徑中建立的任務

   1. 執行此命令以列出 中的任務 AWS 帳戶。

      ```
      aws iot list-jobs
      ```

      命令會傳回您 AWS 帳戶 和 AWS 區域 中看起來像這樣的 AWS IoT 任務清單。

      ```
      {
          "jobs": [
              {
                  "jobArn": "arn:aws:iot:us-west-2:57EXAMPLE833:job/hello-world-job-2",
                  "jobId": "hello-world-job-2",
                  "targetSelection": "SNAPSHOT",
                  "status": "COMPLETED",
                  "createdAt": "2021-11-16T23:40:36.825000+00:00",
                  "lastUpdatedAt": "2021-11-16T23:40:41.375000+00:00",
                  "completedAt": "2021-11-16T23:40:41.375000+00:00"
              },
              {
                  "jobArn": "arn:aws:iot:us-west-2:57EXAMPLE833:job/hello-world-job-1",
                  "jobId": "hello-world-job-1",
                  "targetSelection": "SNAPSHOT",
                  "status": "COMPLETED",
                  "createdAt": "2021-11-16T23:35:26.381000+00:00",
                  "lastUpdatedAt": "2021-11-16T23:35:29.239000+00:00",
                  "completedAt": "2021-11-16T23:35:29.239000+00:00"
              }
          ]
      }
      ```

   1. 對於您從清單中辨識為在此學習路徑中建立任務的每個任務，請將 `jobId`取代為要刪除的任務`jobId`值，然後執行此命令來刪除 AWS IoT 任務。

      ```
      aws iot delete-job --job-id jobId
      ```

      如果成功，此命令不會傳回任何內容。

1. 刪除儲存在此學習路徑 Amazon S3 儲存貯體中的任務文件

   1. 使用您採用的儲存貯體名稱來取代 `bucket`，然後執行此命令來列出您使用的 Amazon S3 儲存貯體中的物件。

      ```
      aws s3api list-objects --bucket bucket
      ```

      此命令會傳會儲存貯體中的 Amazon S3 物件清單，如下所示。

      ```
      {
          "Contents": [
              {
                  "Key": "hello-world-job.json",
                  "LastModified": "2021-11-18T03:02:12+00:00",
                  "ETag": "\"868c8bc3f56b5787964764d4b18ed5ef\"",
                  "Size": 54,
                  "StorageClass": "STANDARD",
                  "Owner": {
                      "DisplayName": "EXAMPLE",
                      "ID": "e9e3d6ec1EXAMPLEf5bfb5e6bd0a2b6ed03884d1ed392a82ad011c144736a4ee"
                  }
              },
              {
                  "Key": "iot_job_firmware_update.json",
                  "LastModified": "2021-04-13T21:57:07+00:00",
                  "ETag": "\"7c68c591949391791ecf625253658c61\"",
                  "Size": 66,
                  "StorageClass": "STANDARD",
                  "Owner": {
                      "DisplayName": "EXAMPLE",
                      "ID": "e9e3d6ec1EXAMPLEf5bfb5e6bd0a2b6ed03884d1ed392a82ad011c144736a4ee"
                  }
              },
              {
                  "Key": "order66.json",
                  "LastModified": "2021-04-13T21:57:07+00:00",
                  "ETag": "\"bca60d5380b88e1a70cc27d321caba72\"",
                  "Size": 29,
                  "StorageClass": "STANDARD",
                  "Owner": {
                      "DisplayName": "EXAMPLE",
                      "ID": "e9e3d6ec1EXAMPLEf5bfb5e6bd0a2b6ed03884d1ed392a82ad011c144736a4ee"
                  }
              }
          ]
      }
      ```

   1. 對於您從清單中辨識為在此學習路徑中建立的物件的每個物件，請使用儲存貯體名稱來取代 `bucket`，使用要刪除物件的鍵值來取代 `key`，然後執行此命令來刪除 Amazon S3 物件。

      ```
       aws s3api delete-object --bucket bucket --key key
      ```

      如果成功，此命令不會傳回任何內容。

刪除完成此學習路徑時建立的所有 AWS 資源和物件後，您可以重新開始並重複教學課程。