生命週期事件 - AWS IoT Core

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

生命週期事件

AWS IoT 可以在MQTT主題上發佈生命週期事件。預設情況下,這些事件可用且無法停用。

注意

生命週期的訊息可能不會按照順序傳送。您可能會收到重複的訊息。

thingName 只有在用戶端使用獨家物件功能連線時,才會包含 。

連線/中斷連線事件

注意

透過 AWS IoT Device Management 機群索引,您可以搜尋物件、執行彙總查詢,並根據物件連線/中斷連線事件建立動態群組。如需詳細資訊,請參閱機群索引

AWS IoT 當用戶端連線或中斷連線時, 會將訊息發佈至下列MQTT主題:

  • $aws/events/presence/connected/clientId:用戶端已連接到訊息代理程式。

  • $aws/events/presence/disconnected/clientId:用戶端已與訊息代理程式中斷連線。

以下是發佈至$aws/events/presence/connected/clientId主題的連線/中斷連線訊息中包含的JSON元素清單。

clientId

連線或中斷連線之用戶端的用戶端 ID。

注意

包含 # 或 + IDs的用戶端不會接收生命週期事件。

thingName

您的 IoT 物件名稱。只有在用戶端使用獨家物件功能連線時,thingName才會包含 。

clientInitiatedDisconnect

如果用戶端已啟動中斷連線,則為 True。否則為 false。僅在中斷連線訊息中發現。

disconnectReason

用戶端中斷連線的原因。僅在中斷連線訊息中發現。下表包含有效值,以及代理程式是否會在中斷連線發生時傳送最後遺囑和遺囑 (LWT) 訊息

中斷連線原因 描述 代理程式將傳送訊息 LWT
AUTH_ERROR 用戶端驗證失敗或授權失敗。 是。如果裝置收到此錯誤之前有作用中連線。
CLIENT_INITIATED_DISCONNECT 用戶端表示將中斷連線。如果用戶端使用 WebSocket 連線,Close frame用戶端可以透過傳送MQTTDISCONNECT控制封包或 來執行此操作。 否.
CLIENT_ERROR 用戶端執行錯誤操作導致其中斷連線。例如,如果用戶端嘗試發佈承載超過承載限制,用戶端會在相同的連線上傳送超過 1 個MQTTCONNECT封包時中斷連線。 是。
CONNECTION_LOST 用戶端伺服器連線已中斷。這可能會在高網路延遲期間或網際網路連線中斷時發生。 是。
DUPLICATE_CLIENTID 用戶端使用已在使用中的用戶端 ID。在這種情況下,已經連線的用戶端會因為此中斷連線的原因而中斷連線。 是。
FORBIDDEN_ACCESS 用戶端不允許連線。例如,具有連線失敗的 IP 地址用戶端將無法連線。 是。如果裝置收到此錯誤之前有作用中連線。
MQTT_KEEP_ALIVE_TIMEOUT 如果用戶端持續作用時間的 1.5 倍沒有用戶端伺服器通訊,則用戶端會中斷連線。 是。
SERVER_ERROR 因未預期的伺服器問題而中斷連線。 是。
SERVER_INITIATED_DISCONNECT 因為操作原因導致伺服器故意中斷用戶端的連線。 是。
THROTTLED 因為超過調節限制導致用戶端中斷連線。 是。
WEBSOCKET_TTL_EXPIRATION 用戶端已中斷連線,因為 WebSocket 的連線時間超過其 time-to-live值。 是。
CUSTOMAUTH_TTL_EXPIRATION 用戶端已中斷連線,因為其連線時間超過 time-to-live其自訂授權方的值。 是。
eventType

事件的類型。有效值為 connecteddisconnected

ipAddress

連線用戶端的 IP 地址。這可以是 IPv4或 IPv6 格式。僅在連線訊息中發現。

principalIdentifier

用於身分驗證的憑證。對於TLS交互身分驗證憑證,這是憑證 ID。對於其他連線,此為 IAM 登入資料。

sessionIdentifier

在 中存在的全球唯一識別碼 AWS IoT ,在工作階段的生命週期內存在。

timestamp

事件發生的約略時間。

versionNumber

生命週期事件的版本號碼。這是每個用戶端 ID 連線的依序遞增長整數值。訂閱者戶可以使用版本號碼來推斷生命週期事件的順序。

注意

用戶端連線的連線和中斷連線訊息具有相同的版本號碼。

版本號碼可能會略過值,並且每個事件並不保證會以 1 為值持續增加。

如果用戶端約一小時未連線,則版本號碼將重設為 0。對於持久性工作階段,當用戶端中斷連線的時間超過持久性工作階段設定的 time-to-live (TTL) 之後,版本編號會重設為 0。

連線訊息具有以下結構。

{ "clientId": "186b5", "thingName": "exampleThing", "timestamp": 1573002230757, "eventType": "connected", "sessionIdentifier": "00000000-0000-0000-0000-000000000000", "principalIdentifier": "12345678901234567890123456789012", "ipAddress": "192.0.2.0", "versionNumber": 0 }

中斷連線訊息具有以下結構。

{ "clientId": "186b5", "thingName": "exampleThing", "timestamp": 1573002340451, "eventType": "disconnected", "sessionIdentifier": "00000000-0000-0000-0000-000000000000", "principalIdentifier": "12345678901234567890123456789012", "clientInitiatedDisconnect": true, "disconnectReason": "CLIENT_INITIATED_DISCONNECT", "versionNumber": 0 }

處理用戶端中斷連線

最佳實務是一律為生命週期事件實作等待狀態,包括 Last Will and Testament (LWT) 訊息。收到中斷連線的訊息時,您的程式碼會等待一段時間並驗證裝置是否仍然離線,才採取動作。其中一種方法是使用SQS延遲佇列。當用戶端收到 LWT或生命週期事件時,您可以佇列訊息 (例如 5 秒)。當該訊息變為可用並由 Lambda 或其他服務進行處理時,您可以在進行下一個動作前,先檢查該裝置是否仍處於離線狀態。

連線嘗試失敗事件

AWS IoT MQTT 當用戶端未獲授權連線,或設定最後一個遺囑和試驗,且用戶端未獲授權發佈至最後一個遺囑主題時, 會將訊息發佈至下列主題。

$aws/events/presence/connect_failed/clientId

以下是發佈至 $aws/events/presence/connect_failed/clientId主題的連線授權訊息中包含的JSON元素清單。

clientId

用戶端的用戶端 ID 已嘗試且無法連線。

注意

包含 # 或 + IDs的用戶端不會接收生命週期事件。

thingName

您的 IoT 物件名稱。只有在用戶端使用獨家物件功能連線時,thingName才會包含 。

timestamp

事件發生的約略時間。

eventType

事件的類型。有效值為 connect_failed

connectFailureReason

連線失敗的原因。有效值為 AUTHORIZATION_FAILED

principalIdentifier

用於身分驗證的憑證。對於TLS交互身分驗證憑證,這是憑證 ID。對於其他連線,此為 IAM 登入資料。

sessionIdentifier

在 中存在的全球唯一識別碼 AWS IoT ,在工作階段的生命週期內存在。

ipAddress

連線用戶端的 IP 地址。這可以是 IPv4或 IPv6 格式。僅在連線訊息中發現。

連線失敗訊息具有下列結構。

{ "clientId": "186b5", "thingName": "exampleThing", "timestamp": 1460065214626, "eventType": "connect_failed", "connectFailureReason": "AUTHORIZATION_FAILED", "principalIdentifier": "12345678901234567890123456789012", "sessionIdentifier": "00000000-0000-0000-0000-000000000000", "ipAddress" : "192.0.2.0" }

訂閱/取消訂閱事件

AWS IoT 當用戶端訂閱或取消訂閱MQTT主題時, 會將訊息發佈至下列MQTT主題:

$aws/events/subscriptions/subscribed/clientId

$aws/events/subscriptions/unsubscribed/clientId

其中 clientId 是連線至訊息代理程式的MQTT AWS IoT 用戶端 ID。

發佈至此主題的訊息具有以下結構:

{ "clientId": "186b5", "thingName": "exampleThing", "timestamp": 1460065214626, "eventType": "subscribed" | "unsubscribed", "sessionIdentifier": "00000000-0000-0000-0000-000000000000", "principalIdentifier": "12345678901234567890123456789012", "topics" : ["foo/bar","device/data","dog/cat"] }

以下是發佈至 和 $aws/events/subscriptions/subscribed/clientId$aws/events/subscriptions/unsubscribed/clientId主題的訂閱和取消訂閱訊息中包含的JSON元素清單。

clientId

訂閱或取消訂閱之用戶端的用戶端 ID。

注意

包含 # 或 + IDs的用戶端不會接收生命週期事件。

thingName

您的 IoT 物件名稱。只有在用戶端使用獨家物件功能連線時,thingName才會包含 。

eventType

事件的類型。有效值為 subscribedunsubscribed

principalIdentifier

用於身分驗證的憑證。對於TLS交互身分驗證憑證,這是憑證 ID。對於其他連線,此為 IAM 登入資料。

sessionIdentifier

在 中存在的全球唯一識別碼 AWS IoT ,在工作階段的生命週期內存在。

timestamp

事件發生的約略時間。

topics

用戶端訂閱MQTT的主題陣列。

注意

生命週期的訊息可能不會按照順序傳送。您可能會收到重複的訊息。