AWS IoT 使用 AWS IoT Device Client 在 中建立和執行任務 - AWS IoT Core

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

AWS IoT 使用 AWS IoT Device Client 在 中建立和執行任務

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

建立和存放 IoT 任務的任務文件

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

若要建立和儲存任務文件:
  1. 選取要儲存任務文件的 Amazon S3 儲存貯體。如果沒有可使用的現有 Amazon S3 儲存貯體,就需要建立一個。如需如何建立 Amazon S3 儲存貯體的詳細資訊,請參閱 Amazon S3 入門中的主題。

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

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

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

      { "operation": "echo", "args": ["Hello world!"] }
    3. 在本機主機電腦上,將編輯器的內容儲存至名為 hello-world-job.json 的檔案。

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

  3. 取代 path_to_file 使用 的路徑hello-world-job.json,如果它不在您目前的目錄中,請取代 s3_bucket_name 將 Amazon S3 儲存貯體路徑移至您選取的儲存貯體,然後執行此命令,將您的任務文件放入 Amazon S3 儲存貯體。

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

    URL 識別您存放在 Amazon S3 中任務文件的任務文件是由取代 s3_bucket_name 以及 AWS_region 在下列 中URL。將產生的 記錄為稍後URL使用的 job_document_path

    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 裝置執行任務

在 中 AWS IoT 為一個 IoT 裝置執行任務

本節中的程序會啟動 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
  2. 在終端機視窗中,確認 AWS IoT Device Client 並顯示這些訊息

    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
  3. 在終端機視窗中看到此訊息之後,請繼續執行下一個程序並建立任務資源。請注意,它可能不是清單中的最後一個項目。

    2021-11-15T18:45:56.785Z [INFO] {JobsFeature.cpp}: No pending jobs are scheduled, waiting for the next incoming job
若要建立 AWS IoT 任務資源
  1. 在本機主機電腦上:

    1. Replace (取代) job_document_url 任務文件URL建立和存放 IoT 任務的任務文件

    2. Replace (取代) thing_arn 使用您為裝置建立ARN的物件資源,然後執行此命令。

      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" }
  2. 在終端機視窗中,您應該會看到來自 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
  3. 當 AWS IoT Device Client 正在執行並等待任務時,您可以變更 job-id值,然後從create-job步驟 1 重新執行 來提交另一個任務。

當您完成執行任務時,請在終端機視窗中輸入 ^C(control-C) 以停止 AWS IoT Device Client。