本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
生命周期事件
AWS IoT 可以发布有关MQTT主题的生命周期事件。这些事件在默认情况下可用,且不能被禁用。
注意
生命周期消息可能不会按顺序发送。您可能会收到重复的消息。
thingName
仅当客户端使用专有事物功能进行连接时才会包括在内。
连接/断开连接事件
注意
借助 AWS IoT 设备管理队列索引,您可以搜索事物、运行聚合查询,并根据事物 “连接/断开连接” 事件创建动态组。有关更多信息,请参阅实例集索引。
AWS IoT 当客户端连接或断开连接时,向以下MQTT主题发布消息:
-
$aws/events/presence/connected/
— 连接到消息代理的客户端。clientId
-
$aws/events/presence/disconnected/
— 与消息代理断开连接的客户端。clientId
以下是发布到该主题的连接/断开连接消息中包含的JSON元素列表。$aws/events/presence/connected/
clientId
- clientId
-
建立连接或断开连接的客户端的 ID。
注意
包IDs含 # 或 + 的客户端不会收到生命周期事件。
- thingName
-
你的物联网事物的名称。
thingName
仅当客户端使用专有事物功能进行连接时才会包括在内。 - clientInitiatedDisconnect
-
如果客户端启动断开连接,则为“True”。否则为 false。只能在断开连接消息中找到。
- disconnectReason
-
客户端断开连接的原因。只能在断开连接消息中找到。下表包含有效值,以及当断开连接时,经纪人是否会发送《遗嘱》和《遗嘱》(LWT) 消息。
断开连接原因 描述 经纪人将发送LWT消息 AUTH_ERROR
客户端无法进行身份验证或授权失败。 是。如果设备在收到此错误之前连接处于活动状态。 CLIENT_INITIATED_DISCONNECT
客户端指示它将断开连接。客户端可以通过发送MQTT DISCONNECT
控制数据包或在客户端使用 WebSocket 连接Close frame
时发送控制数据包来实现此目的。不是。 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
-
事件类型。有效值为
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 }
处理客户端断开连接
最佳做法是始终为生命周期事件(包括《遗嘱》和《遗嘱》(LWT) 消息)实施等待状态。收到断开连接消息后,您的代码应等待一段时间,并在采取措施之前验证设备是否仍处于脱机状态。实现此目的的一种方法是使用SQS延迟队列。当客户端收到LWT或生命周期事件时,您可以将消息排入队列(例如,5 秒钟)。当消息可用并被处理(通过 Lambda 或其它服务)时,您可以先检查设备是否仍处于离线状态,然后再采取进一步操作。
Connect 尝试失败事件
AWS IoT 当客户端无权连接,或者配置了遗嘱和遗嘱并且客户端无权发布到最后一个遗嘱MQTT主题时,会向以下主题发布消息。
$aws/events/presence/connect_failed/
clientId
以下是发布到该$aws/events/presence/connect_failed/
主题的连接授权消息中包含的JSON元素列表。clientId
- clientId
-
尝试连接但连接失败的客户端的客户端 ID。
注意
包IDs含 # 或 + 的客户端不会收到生命周期事件。
- thingName
-
你的物联网事物的名称。
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
连接到 AWS IoT
消息代理的MQTT客户端 ID 在哪里clientId
。
发布到该主题的消息具有以下结构:
{ "clientId": "186b5", "thingName": "exampleThing", "timestamp": 1460065214626, "eventType": "subscribed" | "unsubscribed", "sessionIdentifier": "00000000-0000-0000-0000-000000000000", "principalIdentifier": "12345678901234567890123456789012", "topics" : ["foo/bar","device/data","dog/cat"] }
以下是发布到和主题的已订阅和取消订阅消息中包含的JSON元素列表。$aws/events/subscriptions/subscribed/
clientId
$aws/events/subscriptions/unsubscribed/
clientId
- clientId
-
订阅或取消订阅的客户端的 ID。
注意
包IDs含 # 或 + 的客户端不会收到生命周期事件。
- thingName
-
你的物联网事物的名称。
thingName
仅当客户端使用专有事物功能进行连接时才会包括在内。 - eventType
-
事件类型。有效值为
subscribed
或unsubscribed
。 - principalIdentifier
-
用于执行身份验证的凭证。对于TLS相互身份验证证书,这是证书 ID。对于其他连接,这是 IAM 凭证。
- sessionIdentifier
-
在会话生命周期中 AWS IoT 存在的全局唯一标识符。
- timestamp
-
事件发生时间的近似值。
- topics
-
客户已订阅的MQTT主题数组。
注意
生命周期消息可能不会按顺序发送。您可能会收到重复的消息。