生命週期事件 - 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。

注意

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

thingName

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

clientInitiatedDisconnect

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

disconnectReason

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

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

1如果裝置在接收此錯誤之前有作用中的連線。

2若要防止 Last Will and Testament (LWT) 訊息,請將 preventWillMessage=true 設定為覆寫 DeleteConnection API 的預設 LWT 傳送行為。

eventType

事件的類型。有效值為 connecteddisconnected

ipAddress

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

principalIdentifier

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

sessionIdentifier

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

timestamp

事件發生的約略時間。

versionNumber

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

注意

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

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

如果用戶端約一小時未連線,則版本號碼將重設為 0。若為持久工作階段,當用戶端中斷連線時間超過為持久工作階段所設的存留時間 (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。

注意

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

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 是連線至 AWS IoT 訊息代理程式的 MQTT 用戶端 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。

注意

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

thingName

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

eventType

事件的類型。有效值為 subscribedunsubscribed

principalIdentifier

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

sessionIdentifier

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

timestamp

事件發生的約略時間。

topics

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

注意

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