啟動和監控命令執行 - AWS IoT FleetWise

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

啟動和監控命令執行

重要

某些 AWS IoT FleetWise 功能的存取目前受到鎖定。如需詳細資訊,請參閱AWSAWS IoT FleetWise 中的區域和功能可用性

建立命令資源後,您可以在目標車輛上啟動命令執行。車輛開始執行命令後,即可開始更新命令執行的結果,並將狀態更新和結果資訊發佈至MQTT預留主題。然後,您可以擷取命令執行的狀態,並監控您帳戶中的執行狀態。

本主題說明如何使用 將命令傳送至車輛 AWS CLI。它也說明如何監控和更新命令執行的狀態。

傳送遠端命令

您可以使用StartCommandExecution AWS IoT 資料平面API操作將命令傳送至車輛。接著,車輛會將命令轉送至汽車中介軟體服務 (例如 SOME/IP (透過 IP 的可擴展服務導向中介軟體)),或將其發佈至車輛網路 (例如控制器區域網路 (CAN) 裝置介面)。下列為使用 AWS CLI的範例。

傳送遠端命令時的考量事項

當您在 中啟動命令執行時 AWS IoT FleetWise:

  • 您必須為車輛佈建 AWS IoT 物件。如需詳細資訊,請參閱Provision AWS IoT FleetWise 車輛

  • 您必須已使用 建立 命令AWS-IoT-FleetWise做為命名空間role-Arn,並提供 授予您在 AWS IoT FleetWise 中建立和執行命令的許可。如需詳細資訊,請參閱建立命令資源

  • 如果您選擇在建立命令時使用任何為參數指定的預設值,則可以略過 parameters 欄位。如果mandatory-parameters未在建立時指定 ,或者如果您想要透過為參數指定自己的值來覆寫任何預設值,則必須指定 parameters 欄位。如需這些其他範例,請參閱 遠端命令使用案例

  • 您可以為 mandatory-parameters 欄位指定最多三個名稱值對。不過,在車輛上執行 命令時,只接受一個名稱/值對,而 name 欄位必須使用完整名稱與$actuatorPath.字首。

取得帳戶特定的資料平面端點

執行 API命令之前,您必須取得URL端點的帳戶特定iot:Jobs端點。例如,如果您執行此命令:

aws iot describe-endpoint --endpoint-type iot:Jobs

它會傳回帳戶特定的端點,URL如以下範例回應所示。

{ "endpointAddress": "<account-specific-prefix>.jobs.iot.<region>.amazonaws.com" }

傳送遠端命令範例

若要將遠端命令傳送至車輛,請執行下列命令。

  • 針對您要執行的命令command-arn,將 取代ARN為 。您可以從 create-commandCLI命令的回應取得此資訊。

  • target-arn 將 取代ARN為您要執行命令的目標裝置或 AWS IoT 物件。

    注意

    您可以指定 AWS IoT 物件ARN的目標 (AWS IoT FleetWise 車輛)。目前不支援物件群組和機群。

  • endpoint-url 以您在 中取得的帳戶特定端點取代 取得帳戶特定的資料平面端點,字首為 https://,例如 https://123456789012abcd.jobs.iot.ap-south-1.amazonaws.com

  • valuename和 取代為您使用 create-command 建立命令時指定的mandatory-parameters欄位CLI。

    name 欄位是訊號目錄中定義的完整名稱,字首$actuatorPath.為 。例如, name 可以是 $actuatorPath.Vehicle.Chassis.SteeringWheel.HandsOff.HandsOffSteeringModevalue也可以是 布林值,指出轉向模式狀態,例如 {"B": false}

  • (選用) 您也可以指定其他參數 executionTimeoutSeconds。此選用欄位指定裝置必須以執行結果回應的時間,以秒為單位。您可以將逾時設定為最大值 24 小時。

    建立命令執行後,計時器便會啟動。在計時器過期之前,如果命令執行狀態未變更為使其成為終端機的狀態,例如 SUCCEEDEDFAILED,則狀態會自動變更為 TIMED_OUT

    注意

    裝置也可以報告TIMED_OUT狀態,或將此狀態覆寫為 狀態FAILED,例如 SUCCEEDED、 或 REJECTED,且命令執行會變成終端機。如需詳細資訊,請參閱命令執行逾時狀態

aws iot-jobs-data start-command-execution \ --command-arn command-arn \ --target-arn target-arn \ --execution-timeout-seconds 30 \ --endpoint-url endpoint-url \ --parameters '[ { "name": name, "value": value } ]'

StartCommandExecution API 操作會傳回命令執行 ID。您可以使用此 ID 來查詢命令執行狀態、詳細資訊和命令執行歷史記錄。

{ "executionId": "07e4b780-7eca-4ffd-b772-b76358da5542" }

在您執行 命令之後,您的裝置將收到包含下列資訊的通知。issued_timestamp_ms 欄位對應至StartCommandExecutionAPI叫用 的時間。timeout_ms 對應至叫用 時使用 executionTimeoutSeconds 參數設定的逾時值StartCommandExecutionAPI。

timeout_ms: 9000000 issued_timestamp_ms: 1723847831317

更新命令執行結果

若要更新命令執行的狀態,您的裝置必須已建立MQTT連線並訂閱下列命令請求主題。

在此範例中,將 取代<device-id>為目標裝置的唯一識別符,可以是 VehicleId或物件名稱,並將 <execution-id>取代為命令執行的識別符。

注意
  • 承載必須使用 protobuf 格式。

  • 您的裝置可選擇性地訂閱 /accepted/rejected回應主題。即使您的裝置尚未明確訂閱,也會收到這些回應訊息。

// Request topic $aws/devices/<DeviceID>/command_executions/+/request/protobuf // Response topics (Optional) $aws/devices/<DeviceID>/command_executions/<ExecutionId>/response/accepted/protobuf $aws/devices/<DeviceID>/command_executions/<ExecutionId>/response/rejected/protobuf

您的裝置可以將訊息發佈至命令回應主題。處理 命令後,它會傳送 protobuf 編碼回應至此主題。<DeviceID> 欄位必須符合請求主題中的對應欄位。

$aws/devices/<DeviceID>/command_executions/<ExecutionId>/response/<PayloadFormat>

裝置發佈對本主題的回應後,您可以使用 GetCommandExecution 擷取更新的狀態資訊API。命令執行的狀態可以是此處列出的任何項目。

  • IN_PROGRESS

  • SUCCEEDED

  • FAILED

  • REJECTED

  • TIMED_OUT

請注意,任何狀態中的命令執行 SUCCEEDEDFAILEDREJECTED為終端機,且狀態是由裝置回報。當命令執行為終端機時,這表示不會對其狀態或相關欄位進行進一步更新。裝置或雲端可能會報告TIMED_OUT狀態。如果雲端回報,裝置稍後可能會更新狀態原因欄位。

例如,以下顯示 裝置發佈的範例MQTT訊息。

注意

針對命令執行狀態,如果您的裝置使用 statusReason 物件來發佈狀態資訊,您必須確定:

  • reasonCode 使用 模式 [A-Z0-9_-]+,長度不超過 64 個字元。

  • 長度reasonDescription不超過 1,024 個字元。它可以使用控制字元以外的任何字元,例如新行。

{ "deviceId": "", "executionId": "", "status": "CREATED", "statusReason": { "reasonCode": "", "reasonDescription": "" } }

如需示範如何使用 AWS IoT Core MQTT測試用戶端訂閱主題並查看命令執行訊息的範例,請參閱 AWS IoT Core 開發人員指南中的使用MQTT測試用戶端檢視命令更新

取得遠端命令執行

您可以使用GetCommandExecution AWS IoT 控制平面API操作來擷取命令執行的相關資訊。您必須已使用 StartCommandExecutionAPI操作執行此命令。

若要擷取已執行命令的中繼資料,請執行下列命令。

  • execution-id 將 取代為 命令的 ID。您可以從 start-command-executionCLI命令的回應取得此資訊。

  • target-arn 將 取代ARN為您要執行命令的目標車輛或 AWS IoT 物件。

aws iot get-command-execution --execution-id execution-id \ --target-arn target-arn

GetCommandExecution API 操作會傳回回應,其中包含命令執行ARN的 、執行狀態,以及命令開始執行的時間和完成時間的相關資訊。下列程式碼顯示請求的範例回應API。

為了提供每個命令執行狀態的其他內容,命令功能會提供 statusReason 物件。物件包含兩個欄位 reasonCodereasonDescription。使用這些欄位,您的裝置可以提供有關命令執行狀態的其他資訊。此資訊會覆寫任何預設 reasonDescription reasonCode和從雲端回報的 。

若要報告此資訊,您的裝置可以將更新的狀態資訊發佈至雲端。然後,當您使用 GetCommandExecution 擷取命令執行狀態時API,您會看到最新的狀態碼。

注意

執行回應中的 completedAt 欄位對應至裝置向雲端回報終端機狀態的時間。在TIMED_OUT狀態的情況下,只有在裝置回報 A 逾時時,才會設定此欄位。狀態由雲端設定TIMED_OUT時,TIMED_OUT狀態不會更新。如需逾時行為的詳細資訊,請參閱命令執行逾時狀態

{ "executionId": "07e4b780-7eca-4ffd-b772-b76358da5542", "commandArn": "arn:aws:iot:ap-south-1:123456789012:command/LockDoor", "targetArn": "arn:aws:iot:ap-south-1:123456789012:thing/myFrontDoor", "status": "SUCCEEDED", "statusReason": { "reasonCode": "65536", "reasonDescription": "SUCCESS" }, "createdAt": "2024-03-23T00:50:10.095000-07:00", "completedAt": "2024-03-23T00:50:10.095000-07:00", "Parameters": '{ "$actuatorPath.Vehicle.Chassis.SteeringWheel.HandsOff.HandsOffSteeringMode": { "B": true } }' }

列出您帳戶中的命令執行

使用ListCommandExecutions AWS IoT Core 控制平面HTTPAPI操作列出您帳戶中的所有命令執行。此範例使用 AWS CLI。

列出命令執行時的考量

以下是使用 ListCommandExecutions 時的一些考量API。

  • 您必須commandArn根據要列出特定命令targetArn或目標車輛的執行,至少指定 或 。API 請求不能為空,且不能包含相同請求中的兩個欄位。

  • 您必須僅提供 startedTimeFiltercompletedTimeFilter資訊。API 請求不能為空,且不能包含相同請求中的兩個欄位。您可以使用 物件的 beforeafter 欄位,列出在特定時間範圍內建立或完成的命令執行。

  • beforeafter 欄位不得大於目前時間。根據預設,如果您未指定任何值, before 欄位是目前時間, after 欄位是目前時間 - 6 個月。也就是說,根據您使用的篩選條件, API會列出過去六個月內建立或完成的所有執行。

  • 您可以使用 sort-order 參數來指定是否要以遞增順序列出執行。根據預設,如果您未指定此欄位,則執行會以遞減順序列出。

  • 當列出命令 的命令執行時,您無法根據命令執行的狀態來篩選命令執行ARN。

列出命令執行範例

下列範例示範如何在 中列出命令執行 AWS 帳戶。

執行 命令時,您必須指定是否要篩選清單,以僅顯示使用 為特定裝置建立的命令執行targetArn,還是使用 為特定命令指定的執行commandArn

在此範例中,取代:

  • <target-arn> 使用您以執行為目標之裝置的 Amazon Resource Number (ARN),例如 arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f

  • <target-arn> 使用您以執行為目標之裝置的 Amazon Resource Number (ARN),例如 arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f

  • <after> ,以及您希望列出建立之執行的時間,例如 2024-11-01T03:00

aws iot list-command-executions \ --target-arn <target-arn> \ --started-time-filter '{after=<after>}' \ --sort-order "ASCENDING"

執行此命令會產生回應,其中包含您建立的命令執行清單、執行開始執行的時間,以及執行完成的時間。它也提供狀態資訊,以及包含狀態額外資訊的statusReason物件。

{ "commandExecutions": [ { "commandArn": "arn:aws:iot:us-east-1:123456789012:command/TestMe002", "executionId": "b2b654ca-1a71-427f-9669-e74ae9d92d24", "targetArn": "arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f", "status": "TIMED_OUT", "createdAt": "2024-11-24T14:39:25.791000-08:00", "startedAt": "2024-11-24T14:39:25.791000-08:00" }, { "commandArn": "arn:aws:iot:us-east-1:123456789012:command/TestMe002", "executionId": "34bf015f-ef0f-4453-acd0-9cca2d42a48f", "targetArn": "arn:aws:iot:us-east-1:123456789012:thing/b8e4157c98f332cffb37627f", "status": "IN_PROGRESS", "createdAt": "2024-11-24T14:05:36.021000-08:00", "startedAt": "2024-11-24T14:05:36.021000-08:00" } ] }

刪除命令執行

如果您不想再使用命令執行,可以從您的帳戶永久移除它。

注意

命令執行只有在進入終端機狀態時,才能刪除,例如 SUCCEEDEDFAILEDREJECTED

下列範例示範如何使用 命令刪除delete-command-execution AWS CLI 命令執行。<execution-id> 將 取代為您要刪除之命令執行的識別符。

aws iot delete-command-execution --execution-id <execution-id>

如果API請求成功,則命令執行會產生 200 的狀態碼。您可以使用 GetCommandExecutionAPI來驗證命令執行是否不再存在於您的帳戶中。