生命週期事件 - AWS IoT Core

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

生命週期事件

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

注意

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

連線/中斷連線事件

注意

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

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

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

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

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

clientId

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

注意

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

客戶端 InitiatedDisconnect

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

disconnectReason

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

中斷連線原因 描述 代理程式將傳送 LWT 訊息
AUTH_ERROR 用戶端驗證失敗或授權失敗。 是。如果裝置收到此錯誤之前有作用中連線。
CLIENT_INITIATED_DISCONNECT 用戶端表示將中斷連線。用戶端可以傳送 MQTT DISCONNECT 控制封包,或者如果用戶端正在使用連線,Close frame則可以執行此操作 WebSocket 。 否.
CLIENT_ERROR 用戶端執行錯誤操作導致其中斷連線。例如,若在相同連線上傳送超過 1 個 MQTT CONNECT 封包,或者用戶端嘗試以超過承載限制的承載發佈,用戶端將會中斷連線。 是。
CONNECTION_LOST 用戶端伺服器連線已中斷。這可能會在高網路延遲期間或網際網路連線中斷時發生。 是。
DUPLICATE_CLIENTID 用戶端使用已在使用中的用戶端 ID。在這種情況下,已經連線的用戶端會因為此中斷連線的原因而中斷連線。 是。
FORBIDDEN_ACCESS 用戶端不允許連線。例如,具有連線失敗的 IP 地址用戶端將無法連線。 是。如果裝置收到此錯誤之前有作用中連線。
MQTT_KEEP_ALIVE_TIMEOUT 如果用戶端持續作用時間的 1.5 倍沒有用戶端伺服器通訊,則用戶端會中斷連線。 是。
SERVER_ERROR 因未預期的伺服器問題而中斷連線。 是。
SERVER_INITIATED_DISCONNECT 因為操作原因導致伺服器故意中斷用戶端的連線。 是。
THROTTLED 因為超過調節限制導致用戶端中斷連線。 是。
WEBSOCKET_TTL_EXPIRATION 用戶端 WebSocket 已中斷連線,因為 a 的連線時間超過其 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", "timestamp": 1573002230757, "eventType": "connected", "sessionIdentifier": "a4666d2a7d844ae4ac5d7b38c9cb7967", "principalIdentifier": "12345678901234567890123456789012", "ipAddress": "192.0.2.0", "versionNumber": 0 }

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

{ "clientId": "186b5", "timestamp": 1573002340451, "eventType": "disconnected", "sessionIdentifier": "a4666d2a7d844ae4ac5d7b38c9cb7967", "principalIdentifier": "12345678901234567890123456789012", "clientInitiatedDisconnect": true, "disconnectReason": "CLIENT_INITIATED_DISCONNECT", "versionNumber": 0 }

處理用戶端中斷連線

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

訂閱/取消訂閱事件

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

$aws/events/subscriptions/subscribed/clientId

$aws/events/subscriptions/unsubscribed/clientId

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

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

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

以下為發佈至 $aws/events/subscriptions/subscribed/clientId$aws/events/subscriptions/unsubscribed/clientId 主題之訂閱與取消訂閱訊息所包含的 JSON 元素。

clientId

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

注意

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

eventType

事件的類型。有效值為 subscribedunsubscribed

principalIdentifier

用於身分驗證的憑證。對於 TLS 交互身分驗證憑證,此為憑證 ID。對於其他連線,此為 IAM 憑證。

sessionIdentifier

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

timestamp

事件發生的約略時間。

topics

用戶端已訂閱的一系列 MQTT 主題。

注意

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