

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

# 配置您的设备
<a name="configure-device"></a>

本部分介绍如何配置设备以使其连接到 AWS IoT Core。如果你想开始使用 AWS IoT Core 但还没有设备，你可以使用 Amazon EC2 创建虚拟设备，也可以使用 Windows 电脑或 Mac 作为物联网设备。

选择最适合您尝试的设备选项 AWS IoT Core。当然，您可以尝试所有的内容，但一次只能尝试一项。如果您不确定哪个设备选项最适合您，请阅读有关如何选择[哪个设备选项最适合](iot-gs-first-thing.md#choosing-a-gs-system)的内容，然后返回此页。

**设备选项**
+ [使用 Amazon EC2 创建虚拟设备](creating-a-virtual-thing.md)
+ [使用你的 Windows、Linux 电脑或 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)
+ [安装适用于的 AWS IoT 设备 SDK JavaScript](#ec2-sdk)
+ [运行示例应用程序](#ec2-run-app)
+ [在 AWS IoT 控制台中查看来自示例应用程序的消息](#ec2-view-msg)

## 设置 Amazon EC2 实例
<a name="set-up-ec2"></a>

以下步骤介绍了如何创建一个 Amazon EC2 实例，以作为您的虚拟设备代替物理设备。

如果这是您首次创建 Amazon EC2 实例，您可能会发现 A [mazon EC2 Linux 实例入门](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. 在**应用程序和操作系统映像（Amazon 机器映像）**下，为您的实例选择一个 AMI 模板，例如 *Amazon Linux 2 AMI（HVM）*。请注意，此 AMI 标记为“符合条件的免费套餐”。

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. 在**实例**屏幕上，您可以查看启动状态。启动实例只需很短的时间。启动实例时，其初始状态为 `pending`。实例启动后，其状态变为 `running`，并且会收到一个公有 DNS 名称。（如果**公用 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. 选择实例，然后选择**连接**。

1. 依次选择 **Amazon EC2 Instance Connect**（Amazon EC2 实例连接）和 **Connect**（连接）。

您现在应该有一个 **Amazon EC2 Instance Connect** 窗口，该窗口将登录您的新 Amazon EC2 实例。

## 安装 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** 窗口中，使用以下命令安装节点版本管理器（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
   ```
**注意**  
这将安装最新 LTS 版本的 Node.js。

   安装 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 Root 证书颁发机构签名的客户端证书。此证书用于验证虚拟设备的身份。

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 C** onnect 窗口中，使用以下命令和上一个命令的响应*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"
   ```

   如果成功，此命令将不会显示任何输出。

## 安装适用于的 AWS IoT 设备 SDK JavaScript
<a name="ec2-sdk"></a>

在本节中，您将安装适用于 Device SDK JavaScript，其中包含应用程序可以用来与之通信的代码 AWS IoT 和示例程序。 AWS IoT 有关更多信息，请参阅[ JavaScript GitHub 存储库的AWS IoT 设备 SDK](https://github.com/aws/aws-iot-device-sdk-js-v2)。

**在您的 Linux 实例 JavaScript 上安装适用于的 AWS IoT 设备软件开发工具包**

1. 在您**的 Amazon EC2 Instance Connect** 窗口中，使用此命令将 JavaScript 存储库的 AWS IoT 设备软件开发工具包克隆到您的主目录目录中。`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`  | 

在本节中，您将安装并运行位于 AWS IoT 设备软件开发工具包`aws-iot-device-sdk-js-v2/samples/node`目录中的`pub-sub.js`示例应用程序 JavaScript。此应用程序显示设备（即您的 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** 窗口中，使用此命令*your-iot-endpoint*从中 AWS IoT 获取。

   ```
   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. 向主题 **topic\$11** 发布 10 条消息。

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 测试客户端**，在示例应用程序的消息通过消息代理时查看它们。

**要查看示例应用程序发布的 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 实例连接**窗口中，再次运行示例应用程序，然后在 **AWS IoT 控制台**的 **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 支持该协议的更多信息，请参阅 [MQ](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) TT。

# 使用你的 Windows、Linux 电脑或 Mac 作为 AWS IoT 设备
<a name="using-laptop-as-device"></a>

在本教程中，您将配置一台用于的个人计算机 AWS IoT。这些指令支持 Windows、Linux PCs 和 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 设备开发工具包
<a name="gs-pc-python-intall-sdk"></a>

**在电脑上安装适用于 Python 的 AWS IoT 设备 SDK**

1. 安装适用于 Python 的 AWS IoT 设备开发工具包的 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
   ```

------
**注意**  
如果你使用的是 Window PowerShell s 而不是**cmd.exe**，请使用以下命令。  

   ```
   echo $home
   ```

有关更多信息，请参阅适用于 [Python 的AWS IoT 设备 SDK GitHub 存储库](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) 中创建和注册事物对象时保存的私有密钥、设备证书和根 CA 证书文件。目标目录中每个文件的文件名应与表中的文件名匹配。

   下一部分中的命令假定您的密钥和证书文件均已存储在设备上，如下表中所示。

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

  运行此命令以创建您将在运行示例应用程序时使用的 `certs` 子目录。

  ```
  mkdir ~/certs
  ```

  进入新的子目录，将文件复制到下表所示的目标文件路径。  
**证书文件名**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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_cn/iot/latest/developerguide/using-laptop-as-device.html)

  运行此命令以列出 `certs` 目录中的文件，并将其与表中列出的文件进行比较。

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

------

## 设置策略并运行示例应用程序
<a name="gs-pc-python-app-run"></a>

在本部分中，您将设置策略并运行在 AWS IoT Device SDK for Python的 `aws-iot-device-sdk-python-v2/samples` 目录中找到的 `pubsub.py` 示例脚本。此脚本显示设备将如何使用 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_cn/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. 选择代表设备的事物资源**名称**链接来打开 **Thing details**（事物详细信息）页面。

1. 在**Thing details**（事物详细信息）页面，**Certificates**（证书）选项卡中，选择附加到事物资源的证书。列表中应只有一个证书。如果有多个证书，请选择文件安装在设备上并连接到 AWS IoT Core上的证书。

   在**Certificate**（证书）详细信息页面的**Policies**（策略）选项卡中，选择附加到该证书的策略。应该只有一个策略。如果有多个策略，请重复下一步，确保至少有一个策略授予所需的访问权限。

1. 在**策略**概述页面，找到 JSON 编辑器然后选择**编辑策略文档**，根据需要查看和编辑策略文档。

1. 下列示例中显示了 JSON 策略。在`"Resource"`元素 AWS 账户 中，将每个`Resource`值`region:account`替换为你的 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. 向主题 **test/topic** 发布 10 条消息。

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 测试客户端**，在示例应用程序的消息通过消息代理时查看它们。

**要查看示例应用程序发布的 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 客户端**中查看消息。

------
#### [ 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 支持该协议的更多信息，请参阅 [MQ](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) TT。

## 在 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_cn/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 电脑或 Mac 作为 AWS IoT 设备](using-laptop-as-device.md)。

## 设置您的设备
<a name="gs-device-prereqs"></a>

此步骤的目标是收集配置设备所需的信息，以便它可以启动操作系统（OS）、连接到互联网，并允许您在命令行界面与设备进行交互。

要完成本教程，您需要：
+ 一个 AWS 账户。如果您没有账户，请完成 [设置 AWS 账户](setting-up.md) 中介绍的步骤然后继续操作。
+ [Raspberry Pi 3 Model 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 的桌面可能会使操作更容易。
+ 以太网或 WiFi 连接。
+ 键盘、鼠标、显示器、电缆、电源和设备所需的其它硬件。

**重要**  
您的设备必须先安装、配置和运行操作系统，然后才能继续执行下一步。设备必须连接到互联网，并且您需要能够使用其命令行界面访问设备。命令行访问可以通过直接连接的键盘、鼠标和显示器，也可以使用 SSH 终端远程接口进行访问。

 如果您在 Raspberry Pi 上运行具有图形用户界面（GUI）的操作系统，请在设备上打开终端窗口，然后在该窗口中执行以下说明。否则，如果您使用远程终端（如 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，则必须安装该操作系统才能为其安装 AWS IoT 设备 SDK JavaScript。

   1. 通过运行此命令测试是否已安装 Git。

      ```
      git --version
      ```

   1. 如果上一个命令返回了 Git 版本，则表示 Git 已经安装，您可以跳到步骤 3。

   1. 如果在运行 **git** 命令时显示了错误，则请运行此命令来安装 Git。

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

   1. 再次运行此命令测试是否已安装 Git。

      ```
      git --version
      ```

   1. 如果已安装 Git，请跳到下一个部分。如果没有，请排除故障并更正错误，然后再继续。你需要 Git 来安装的 AWS IoT 设备软件开发工具包 JavaScript。

## 安装 AWS IoT 设备 SDK
<a name="gs-device-install-sdk"></a>

安装 AWS IoT 设备软件开发工具包。

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

在本节中，你将在你的设备上安装 Python、其开发工具和适用于 Python 的 AWS IoT 设备 SDK。这些说明适用于运行最新版本 Raspberry Pi 操作系统的 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 ]

在本节中，你将在你的设备 JavaScript 上安装 Node.js、npm 包管理器和 AWS IoT 设备软件开发工具包。这些说明适用于运行 Raspberry Pi 操作系统的 Raspberry Pi。如果您有其他设备或使用其它操作系统，则可能需要为设备对以下说明的操作进行调整。

1. 

**安装最新版本的 Node.js**  
的 AWS IoT 设备 SDK JavaScript 需要在你的 Raspberry Pi 上安装 Node.js 和 npm 包管理器。

   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. 

**安装适用于的 AWS IoT 设备 SDK JavaScript**  
在你的 Raspberry Pi JavaScript 上安装适用于的 AWS IoT 设备 SDK。

   1. 将 JavaScript存储库的 AWS IoT 设备 SDK 克隆到您的*home*目录目录中。`aws-iot-device-sdk-js-v2`在 Raspberr *home* y Pi 上`~/`，*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` 以安装开发工具包。`npm install` 命令将调用可能需要几分钟才能完成的 `aws-crt` 库构建。

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

------

## 安装并运行示例应用程序
<a name="gs-device-node-app-run"></a>

在本节中，您将安装并运行 AWS IoT 设备 SDK 中的`pubsub`示例应用程序。此应用程序将显示您的设备如何使用 MQTT 库发布和订阅 MQTT 消息。示例应用程序订阅了一个主题，`topic_1`，将 10 条消息发布到该主题，并在从消息代理收到这些消息时予以显示。

**安装证书文件**  
示例应用程序要求在设备上安装对设备进行身份验证的证书文件。

**要为示例应用程序安装设备证书文件**

1. 通过运行这些命令在您的*home*目录中创建一个`certs`子目录。

   ```
   cd ~
   mkdir certs
   ```

1. 将您之前在 [创建 AWS IoT 资源](create-iot-resources.md) 中创建的私有密钥、设备证书和根 CA 证书复制到 `~/certs` 目录中。

   如何将证书文件复制到设备取决于设备和操作系统，此处未予介绍。但是，如果您的设备支持图形用户界面（GUI）并且具有 Web 浏览器，则可以在设备的 Web 浏览器中执行 [创建 AWS IoT 资源](create-iot-resources.md) 中所述的流程，以将生成的文件直接下载到您的设备。

   下一节中的命令假定您的密钥和证书文件存储在设备上，如下表中所示。  
**证书文件名**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/connecting-to-existing-device.html)

要运行示例应用程序，您需要以下信息：


**应用程序参数值**  

|  参数  |  在何处查找值  | 
| --- | --- | 
| your-iot-endpoint |  在 [AWS IoT 控制台](https://console.aws.amazon.com/iot/home)中，选择 **All devices**（所有设备），然后选择 **Things**（事物）。 在 AWS IoT 菜单的**设置**页面上。端点会显示在**设备数据端点**部分。  | 

该*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. 向主题 **topic\$11** 发布 10 条消息。

   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. 向主题 **topic\$11** 发布 10 条消息。

   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 测试客户端**，在示例应用程序的消息通过消息代理时查看它们。

**要查看示例应用程序发布的 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 客户端**中查看消息。

------
#### [ 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 language**其安装 AWS IoT 设备 SDK” 的**部分，然后再次执行该过程即可。

如果您使用的是的 De **AWS IoT vice SDK JavaScript**，请记得在尝试运行示例应用程序之前安装它们。安装 SDK 不会自动安装示例应用程序。示例应用程序必须在安装 SDK 后手动安装。