步驟 2:建立並執行作業 AWS IoT - AWS IoT Core

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

步驟 2:建立並執行作業 AWS IoT

本節中的程序會建立工作文件和 AWS IoT 工作資源。建立工作資源之後, AWS 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

    識別您存放在 Amazon S3 中的任務文件的任務文件是透過取代 URL 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 帳戶,例如使用瀏覽器。URL使用的 AWS IoT 作業引擎,它可以訪問該文件,默認情況下。在生產環境中,您需要確保 AWS IoT 服務擁有存取 Amazon S3 中存放的任務文件的權限。

儲存工作文件之後URL,請繼續執行執行工作 AWS IoT 適用於單一 IoT 裝置

執行工作 AWS IoT 適用於單一 IoT 裝置

本節中的程序啟動 AWS IoT Raspberry Pi 上的設備客戶端,以在設備上運行作業代理程序以等待作業運行。它也會建立工作資源 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 設備客戶端並顯示這些消息

    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件建立並存放任務的任務文件

    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 像這樣的設備客戶端。

    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 裝置用戶端正在執行並等待工作,您可以透過變更job-id值並create-job從步驟 1 重新執行來提交另一個工作。

完成執行作業後,在終端機視窗中輸入 ^C (Control-C) 以停止 AWS IoT 裝置用戶端。