命令概念和狀態 - AWS IoT Core

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

命令概念和狀態

使用 AWS IoT 命令將指示從雲端傳送至連線的裝置。若要使用此功能:

  1. 建立具有承載的命令,其中包含在裝置上執行 所需的組態。

  2. 指定將接收承載並執行動作的目標裝置。

  3. 在目標裝置上執行 命令並擷取狀態資訊。若要疑難排解問題,請參閱 CloudWatch 日誌。

如需有關此工作流程的詳細資訊,請參閱 高階命令工作流程

命令關鍵概念

下列重要概念可協助您了解 命令功能。本文件中會持續使用術語:

  • 命令 - 可重複使用的範本,定義裝置指示

  • 執行 - 在裝置上執行之命令的執行個體

  • 物件名稱 - 在 IoT 登錄檔中註冊的裝置識別符

  • 用戶端 ID - 未註冊裝置的 MQTT 識別符

  • 承載 - 傳送至裝置的指令資料

  • 主題 - 命令通訊的 MQTT 頻道

命令

命令是以 MQTT 訊息形式從雲端傳送至 IoT 裝置的指示。收到承載後,裝置會處理指示並採取對應的動作,例如修改組態設定、傳輸感應器讀取或上傳日誌。裝置接著會將結果傳回至雲端,以啟用遠端監控和控制。

命名空間

建立命令時,請指定其命名空間。對於 AWS IoT Device Management 命令,請使用預設AWS-IoT命名空間,並提供承載或 payloadTemplate。對於 AWS IoT FleetWise 命令,請使用 AWS-IoT-FleetWise 命名空間。如需詳細資訊,請參閱《 AWS IoT FleetWise 開發人員指南》中的遠端命令

承載

建立命令時,請提供定義裝置必須執行之動作的靜態承載。承載可以使用任何支援的格式。為了確保裝置正確解譯承載,建議您指定承載格式類型。使用 MQTT5 通訊協定的裝置可以遵循 MQTT 標準來識別格式。JSON 或 CBOR 的格式指標可在命令請求主題中使用。

承載範本

承載範本會根據您提供的參數值,使用在執行時間產生不同承載的預留位置來定義命令承載。例如,不要為不同的溫度值建立單獨的承載,而是建立一個具有溫度預留位置的範本,並在執行期間指定該值。這可消除維護多個類似的承載。

目標裝置

若要執行命令,請使用物件名稱 (適用於向 註冊的裝置 AWS IoT) 或 MQTT 用戶端 ID (適用於未註冊的裝置) 指定目標裝置。用戶端 ID 是在用來連接裝置的MQTT通訊協定中定義的唯一識別符 AWS IoT。如需詳細資訊,請參閱目標裝置考量事項

命令主題

在執行命令之前,裝置必須訂閱命令請求主題。當您執行命令時,承載會傳送至本主題上的裝置。在執行之後,裝置會將結果和狀態發佈至命令回應主題。如需詳細資訊,請參閱命令主題

命令執行

執行是在目標裝置上執行的命令執行個體。當您開始執行時,承載會交付至裝置,並產生唯一的執行 ID。裝置會執行 命令並報告進度 AWS IoT。裝置端邏輯會決定保留主題的執行行為和狀態報告。

參數值條件

使用承載範本建立命令時,請定義值條件,以在執行之前驗證參數值。值條件可確保參數符合要求,防止無效的執行。

CommandParameterValue 類型支援的運算子

數值類型 (INTEGER、LONG、DOUBLE、UnSIGNEDLONG)
  • EQUALS - 值必須等於指定的數字

  • NOT_EQUALS - 值不得等於指定的數字

  • GREATER_THAN - 值必須大於指定的數字

  • GREATER_THAN_EQUALS - 值必須大於或等於指定的數字

  • LESS_THAN - 值必須小於指定的數字

  • LESS_THAN_EQUALS - 值必須小於或等於指定的數字

  • IN_RANGE - 值必須在指定的範圍內 (包含)

  • NOT_IN_RANGE - 值必須超出指定的範圍 (包含)

  • IN_SET - 值必須符合其中一個指定的數字

  • NOT_IN_SET - 值不得與任何指定的數字相符

字串類型 (STRING)
  • EQUALS - 值必須等於指定的字串

  • NOT_EQUALS - 值不得等於指定的字串

  • IN_SET - 值必須符合其中一個指定的字串

  • NOT_IN_SET - 值不得與任何指定的字串相符

布林值類型
  • 不支援值條件

二進位類型
  • 不支援值條件

範例:溫度控制命令

{ "commandId": "SetTemperature", "namespace": "AWS-IoT", "payloadTemplate": "{\"temperature\": \"${aws:iot:commandexecution::parameter:temperature}\"}", "parameters": [ { "name": "temperature", "type": "INTEGER", "valueConditions": [ { "comparisonOperator": "IN_RANGE", "operand": { "numberRange": { "min": "60", "max": "80" } } } ] } ] }

在此範例中, temperature 參數必須介於 60 到 80 (含) 之間。值超出此範圍的執行請求會失敗驗證。

注意

值條件會在叫用 StartCommandExecution API 時評估。失敗的驗證會傳回錯誤,並防止建立執行。

參數值優先順序和評估

使用承載範本啟動命令執行時,會使用下列優先順序解析參數值:

  1. 執行請求參數 - StartCommandExecution請求中提供的值具有最高優先順序

  2. 命令預設值 - 如果執行請求中未提供參數,defaultValue則會使用參數的

  3. 無值 - 如果未提供,則執行會失敗,因為產生執行請求所需的參數

值條件會根據上述衍生的最終參數值,在優先順序和建立執行之前進行評估。如果驗證失敗,執行請求會傳回錯誤。

範例:使用 的 SetTemperature 命令 defaultValue

{ "parameters": [ { "name": "temperature", "type": "INTEGER", "defaultValue": {"I": 72}, "valueConditions": [ { "comparisonOperator": "IN_RANGE", "operand": {"numberRange": {"min": "60", "max": "80"}} } ] } ] }

開始執行時:

  • 如果您在請求"temperature": {"I": 75}中提供 ,則會使用 75

  • 如果您省略溫度參數,則會使用預設值 72

  • 這兩個值都會根據範圍條件 【60,80】 驗證

命令狀態

您 中的命令 AWS 帳戶 可以處於三種狀態之一:可用已棄用待刪除

可用性

成功建立後,命令會處於可用狀態,並且可以在裝置上執行。

已棄用

不再需要時,將命令標記為棄用。已棄用的命令無法啟動新的執行,但待定執行會繼續完成。若要啟用新的執行,請將 命令還原為可用狀態。

待刪除

當您將命令標記為刪除時,如果取代的時間超過最大逾時 (預設值:12 小時),則會自動將其刪除。此動作為永久性。如果超過逾時仍未棄用或棄用,則命令會進入待定刪除狀態,並在逾時過期後移除。

命令執行狀態

當您在目標裝置上啟動執行時,它會進入 CREATED 狀態,並根據裝置報告轉換為其他狀態。您可以擷取狀態資訊和追蹤執行。

注意

您可以在裝置上同時執行多個命令。使用並行控制來限制每個裝置的執行,並防止過載。如需每個裝置的並行執行上限,請參閱AWS IoT Device Management 命令配額

下表顯示根據執行進度的執行狀態及其轉換。

命令執行狀態和來源
命令執行狀態 由裝置/雲端啟動? 終端機執行? 允許的狀態轉換
CREATED 雲端
  • IN_PROGRESS

  • SUCCEEDED (成功)

  • 失敗

  • REJECTED

  • TIMED_OUT

IN_PROGRESS 裝置
  • IN_PROGRESS

  • SUCCEEDED (成功)

  • 失敗

  • REJECTED

  • TIMED_OUT

TIMED_OUT 裝置和雲端
  • SUCCEEDED (成功)

  • 失敗

  • REJECTED

  • TIMED_OUT

SUCCEEDED 裝置 不適用
FAILED 裝置 不適用
REJECTED 裝置 不適用

裝置可以隨時使用命令預留 MQTT 主題來發佈狀態和結果更新。為了提供額外的內容,裝置可以使用 statusReason 物件中的 reasonCodereasonDescription 欄位。

下圖顯示執行狀態轉換。

顯示命令執行狀態如何在各種狀態之間轉換的影像。
注意

當 AWS IoT 偵測到逾時期間內沒有裝置回應時,它會將 TIMED_OUT設定為暫時狀態,以允許重試和狀態變更。如果您的裝置明確報告 TIMED_OUT,這會成為沒有進一步轉換的終端狀態。如需詳細資訊,請參閱非終端命令執行

下列各節說明終端機和非終端機執行及其狀態。

非終端命令執行

如果可以接受來自裝置的更新,則執行是非終端的。非終端執行會被視為作用中。下列狀態為非終端狀態:

  • CREATED (已建立)

    當您從 AWS IoT 主控台啟動執行或使用 StartCommandExecution API 時,成功的請求會將狀態變更為 CREATED。從此狀態,執行可以轉換為任何其他非終端或終端狀態。

  • IN_PROGRESS

    收到承載後,裝置可以開始執行指示和執行指定的動作。執行時,裝置可以將回應發佈至命令回應主題,並將狀態更新為 IN_PROGRESS。從 IN_PROGRESS,執行可以轉換到 以外的任何終端機或非終端機狀態CREATED

    注意

    您可以多次叫用 UpdateCommandExecution API 並顯示IN_PROGRESS狀態。使用 statusReason 物件指定其他執行詳細資訊。

  • TIMED_OUT

    雲端和裝置都可以觸發此狀態。CREATEDIN_PROGRESS 狀態的執行可能會TIMED_OUT因為下列原因而變更為 :

    • 傳送命令後,計時器會啟動。如果裝置未在指定的持續時間內回應,雲端會將狀態變更為 TIMED_OUT。在這種情況下,執行是非終端的。

    • 裝置可以將狀態覆寫為任何終端機狀態,或報告逾時並將狀態設定為 TIMED_OUT。在此情況下,狀態會保持 TIMED_OUT,但StatusReason物件欄位會根據裝置資訊而變更。執行會變成終端機。

    如需詳細資訊,請參閱逾時值和TIMED_OUT執行狀態

終端機命令執行

當執行不再接受來自裝置的更新時,就會變成終端機。下列狀態為終端機。執行可以從任何非終端狀態轉換為終端狀態:CREATEDIN_PROGRESSTIMED_OUT

  • SUCCEEDED (成功)

    如果裝置成功完成執行,則可以將回應發佈至命令回應主題,並將狀態更新為 SUCCEEDED

  • 失敗

    當裝置無法完成執行時,可以發佈回應至命令回應主題,並將狀態更新至 FAILED。使用 statusReason 物件中的 reasonCodereasonDescription 欄位或 CloudWatch 日誌,對失敗進行故障診斷。

  • REJECTED

    當裝置收到無效或不相容的請求時,它可以調用狀態為 的 UpdateCommandExecution APIREJECTED。使用 statusReason 物件中的 reasonCodereasonDescription 欄位或 CloudWatch 日誌來疑難排解問題。