生命周期事件 - AWS IoT Core

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

生命周期事件

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 客户端指示它将断开连接。客户端可以通过发送MQTTDISCONNECT控制数据包或在客户端使用 WebSocket 连接Close frame时发送控制数据包来实现此目的。 不是。
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 为 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", "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/clientId主题的连接授权消息中包含的JSON元素列表。

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

事件类型。有效值为 subscribedunsubscribed

principalIdentifier

用于执行身份验证的凭证。对于TLS相互身份验证证书,这是证书 ID。对于其他连接,这是 IAM 凭证。

sessionIdentifier

在会话生命周期中 AWS IoT 存在的全局唯一标识符。

timestamp

事件发生时间的近似值。

topics

客户已订阅的MQTT主题数组。

注意

生命周期消息可能不会按顺序发送。您可能会收到重复的消息。