準備 Raspberry Pi 以執行任務 - AWS IoT Core

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

準備 Raspberry Pi 以執行任務

本節中的程序說明如何使用 AWS IoT Device Client 準備 Raspberry Pi 執行任務。

注意

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

佈建 Raspberry Pi 來示範任務

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

建立和下載裝置憑證檔案以示範 AWS 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 來示範任務

建立 AWS IoT 資源以示範 AWS IoT 任務

建立此裝置 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" }
  2. Replace (取代) uniqueThingName 您的裝置的唯一名稱。如果想要使用多個裝置執行本教學課程,請賦予每個裝置自己的名稱。例如 TestDevice01TestDevice02 等等。

    輸入此命令,為您的 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" }
  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 使用 AWS 區域、冒號字元 (:) 和 12 位數字 AWS 帳戶 。

    4. 在編輯器中,在每個政策陳述式中,取代 uniqueThingName 您提供此物件資源的物件名稱。

    5. 將文字編輯器中的檔案儲存為 ~/policies/jobs_test_thing_policy.json

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

  4. Replace (取代) 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"
  5. Replace (取代) uniqueThingName 使用裝置的物件名稱certificateArn,以及您在此區段先前為此裝置儲存certificateArn的值,然後執行此命令以將政策連接至裝置憑證。

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

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

  6. Replace (取代) uniqueThingName 使用裝置的物件名稱取代為本節稍早儲存certificateArncertificateArn的值,然後執行此命令,將裝置憑證連接至 AWS IoT 物件資源。

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

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

在成功佈建 Raspberry Pi 之後,您就可以在測試中為另一 Raspberry Pi 重複本節程序;或者,如果所有裝置都已佈建,則繼續進行 設定 AWS IoT Device Client 以執行任務代理程式

設定 AWS IoT Device Client 以執行任務代理程式

此程序會為 AWS IoT Device Client 建立組態檔案,以執行任務代理程式:。

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

若要建立要測試 AWS IoT Device 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. 取代 endpoint 值,以及 AWS 帳戶 您在 中找到的 的裝置資料端點值在 中佈建您的裝置 AWS IoT Core

    4. Replace (取代) uniqueThingName 您用於此裝置的物件名稱。

    5. 將文字編輯器中的檔案儲存為 ~/dc-configs/dc-jobs-config.json

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

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

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

儲存組態檔之後,您就可以繼續進行 AWS IoT 使用 AWS IoT Device Client 在 中建立和執行任務