本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
生命週期事件
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/
主題的連線/中斷連線訊息中包含的JSON元素清單。clientId
- clientId
-
連線或中斷連線之用戶端的用戶端 ID。
注意
包含 # 或 + IDs的用戶端不會接收生命週期事件。
- thingName
-
您的 IoT 物件名稱。只有在用戶端使用獨家物件功能連線時,
thingName
才會包含 。 - clientInitiatedDisconnect
-
如果用戶端已啟動中斷連線,則為 True。否則為 false。僅在中斷連線訊息中發現。
- disconnectReason
-
用戶端中斷連線的原因。僅在中斷連線訊息中發現。下表包含有效值,以及代理程式是否會在中斷連線發生時傳送最後遺囑和遺囑 (LWT) 訊息。
中斷連線原因 描述 代理程式將傳送訊息 LWT AUTH_ERROR
用戶端驗證失敗或授權失敗。 是。如果裝置收到此錯誤之前有作用中連線。 CLIENT_INITIATED_DISCONNECT
用戶端表示將中斷連線。如果用戶端使用 WebSocket 連線, Close frame
用戶端可以透過傳送MQTTDISCONNECT
控制封包或 來執行此操作。否. 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 的連線時間超過其 time-to-live值。 是。 CUSTOMAUTH_TTL_EXPIRATION
用戶端已中斷連線,因為其連線時間超過 time-to-live其自訂授權方的值。 是。 - eventType
-
事件的類型。有效值為
connected
或disconnected
。 - 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/
主題的連線授權訊息中包含的JSON元素清單。clientId
- 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/
主題的訂閱和取消訂閱訊息中包含的JSON元素清單。clientId
- clientId
-
訂閱或取消訂閱之用戶端的用戶端 ID。
注意
包含 # 或 + IDs的用戶端不會接收生命週期事件。
- thingName
-
您的 IoT 物件名稱。只有在用戶端使用獨家物件功能連線時,
thingName
才會包含 。 - eventType
-
事件的類型。有效值為
subscribed
或unsubscribed
。 - principalIdentifier
-
用於身分驗證的憑證。對於TLS交互身分驗證憑證,這是憑證 ID。對於其他連線,此為 IAM 登入資料。
- sessionIdentifier
-
在 中存在的全球唯一識別碼 AWS IoT ,在工作階段的生命週期內存在。
- timestamp
-
事件發生的約略時間。
- topics
-
用戶端訂閱MQTT的主題陣列。
注意
生命週期的訊息可能不會按照順序傳送。您可能會收到重複的訊息。