步骤 1:准备 Raspberry Pi 运行任务 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

步骤 1:准备 Raspberry Pi 运行任务

本节中的步骤介绍了如何使用Amazon IoT Device Client 准备 Raspberry Pi 运行任务。

注意

这些过程是特定于设备的。如果要同时对多个设备执行本节中的步骤,每个设备将需要自己的策略和唯一的、特定于设备的证书和设备名称。要为每台设备提供独特的资源,请对每台设备执行一次此过程,同时按照过程中所述更改特定于设备的元素。

提供您的 Raspberry Pi 来演示任务

本节中的过程通过创建 Amazon IoT资源和设备证书在 Amazon IoT中预调配 Raspberry Pi。

创建并下载设备证书文件演示 Amazon IoT任务

此过程为此演示创建设备证书文件。

如果准备了多台设备,必须在每台设备上执行此过程。

要为 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" } }
  2. 输入以下命令设置证书目录及其文件的权限。

    chmod 700 ~/certs/jobs chmod 644 ~/certs/jobs/* chmod 600 ~/certs/jobs/private.pem.key
  3. 运行此命令可查看证书目录和文件的权限。

    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 来演示任务

创建要演示 Amazon IoT任务的 Amazon IoT资源

创建此设备的 Amazon IoT资源。

如果准备了多台设备,必须在每台设备上执行此过程。

在 Amazon IoT中预调配您的设备:

在连接到 Raspberry Pi 的本地主机的终端窗口中:

  1. 输入以下命令获取您的设备数据端点的地址:Amazon Web Services 账户。

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

    自上次运行此命令以来,端点值未发生更改。再次在此处运行该命令可以轻松查找数据端点值并将其粘贴到本教程中使用的配置文件中。

    describe-endpoint命令会返回类似以下内容的响应:记录 endpointAddress值以供将来使用。

    { "endpointAddress": "a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com" }
  2. uniqueThingName 替换为您的设备提供唯一的名称。如果要使用多台设备执行本教程,请为每台设备指定自己的名称。例如,TestDevice01TestDevice02 等等。

    输入此命令为 Raspberry Pi 创建新的 Amazon IoT事物资源。

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

    因为一个 Amazon IoT事物资源是您的设备在云中的虚拟表示,所以我们可以在 Amazon IoT中创建多个事物资源用于不同的目的。它们都可以由同一物理 IoT 设备使用来表示设备的不同方面。

    注意

    当您想要保护多台设备的策略时,可以使用 ${iot:Thing.ThingName} 而不是静态事物名称 uniqueThingName

    这些教程每台设备一次只能使用一件事资源。这样,在这些教程中,它们代表不同的演示,以便在为演示创建 Amazon IoT资源后,可以使用专门为每个演示创建的资源返回并重复演示。

    如果您的 Amazon IoT事物资源创建后,命令会返回类似此响应。记录 thingArn值以供稍后创建要在此设备上运行的任务时使用。

    { "thingName": "uniqueThingName", "thingArn": "arn:aws:iot:us-west-2:57EXAMPLE833:thing/uniqueThingName", "thingId": "8ea78707-32c3-4f8a-9232-14bEXAMPLEfd" }
  3. 在终端窗口中:

    1. 打开文本编辑器,例如 nano

    2. 复制此 JSON 文档并将其粘贴到打开的文本编辑器中。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:client/uniqueThingName" ] }, { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic", "arn:aws:iot:us-west-2:57EXAMPLE833:topic/$aws/events/job/*", "arn:aws:iot:us-west-2:57EXAMPLE833:topic/$aws/events/jobExecution/*", "arn:aws:iot:us-west-2:57EXAMPLE833:topic/$aws/things/uniqueThingName/jobs/*" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic", "arn:aws:iot:us-west-2:57EXAMPLE833:topic/$aws/events/jobExecution/*", "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/$aws/things/uniqueThingName/jobs/*" ] }, { "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/subtopic", "arn:aws:iot:us-west-2:57EXAMPLE833:topic/$aws/things/uniqueThingName/jobs/*" ] }, { "Effect": "Allow", "Action": [ "iot:DescribeJobExecution", "iot:GetPendingJobExecutions", "iot:StartNextPendingJobExecution", "iot:UpdateJobExecution" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topic/$aws/things/uniqueThingName" ] } ] }
    3. 在编辑器中,在策略文档的每个 Resource部分中,将 us-west-2:57EXAMPLE833 替换为您的 Amazon Web Services 区域、冒号字符 (:) 和 12 位 Amazon Web Services 账户数字。

    4. 在编辑器中,在每个策略语句中,将 uniqueThingName 替换为您提供给此事物资源的事物名称。

    5. 将文本编辑器中的文件保存为 ~/policies/jobs_test_thing_policy.json

      如果要为多台设备运行此过程,请将文件保存为每台设备上的此文件名。

  4. uniqueThingName 替换为设备的名称,然后运行此命令创建为该设备定制的 Amazon 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"
  5. uniqueThingName 替换为设备 和 certificateArn的事物名称以及您在本节之前为此设备保存的 certificateArn值,然后运行此命令将策略附加到设备证书。

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

    如果成功,该命令不返回任何内容。

  6. uniqueThingName 替换为设备的事物名称,将 certificateArn替换为本节之前保存的 certificateArn值,然后运行此命令将设备证书附加到 Amazon IoT事物资源。

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

    如果成功,该命令不返回任何内容。

成功预调配 Raspberry Pi 之后,您可以在测试中为另一个 Raspberry Pi 重复此部分,或者,如果所有设备均已预调配,请继续 配置 Amazon IoTDevice Client 运行任务代理

配置 Amazon IoTDevice Client 运行任务代理

此过程为 Amazon IoTDevice Client 创建配置文件运行任务代理:

注意:如果准备多台设备,必须在每台设备上执行此过程。

要创建配置文件测试 Amazon IoTDevice Client :

  1. 在连接到 Raspberry Pi 的本地主机的终端窗口中:

    1. 打开文本编辑器,例如 nano

    2. 复制此 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": "" } }
    3. 端点替换为您在 Amazon Web Services 账户中找到的 在 Amazon IoT Core中配置您的设备设备数据端点值。

    4. uniqueThingName 替换为此设备使用的事物名称。

    5. 将文本编辑器中的文件保存为 ~/dc-configs/dc-jobs-config.json

  2. 运行此命令设置新配置文件的文件权限。

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

此测试没有使用 MQTT 测试客户端。虽然设备将与 Amazon IoT交换任务相关的 MQTT消息,但任务进度消息仅与运行任务的设备交换。由于任务进度消息仅与运行任务的设备交换,因此您无法从其他设备订阅(例如 Amazon IoT控制台。

保存配置文件后,您已准备继续 步骤 2:在 Amazon IoT中创建并运行任务