本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
MQTT
MQTT
Amazon IoT Core 支持使用 MQTT 协议和基于 WSS 协议的 MQTT 且由客户端 ID 标识的设备连接。Amazon IoT 设备 SDKs 支持这两种协议,并且是将设备连接到 Amazon IoT Core的推荐方法。 Amazon IoT 设备 SDKs 支持设备和客户端连接和访问 Amazon IoT 服务所需的功能。设备 SDKs 支持 Amazon IoT 服务所需的身份验证协议以及 MQTT 协议和 MQTT over WSS 协议要求的连接 ID 要求。有关如何 Amazon IoT 使用 Amazon 设备连接的信息 SDKs以及支持的语言示例 Amazon IoT 的链接,请参阅使用设备与 MQTT 连接 Amazon IoT SDKs。有关 MQTT 消息的身份验证方法和端口映射的更多信息,请参阅协议、端口映射和身份验证。
虽然我们建议使用 Amazon IoT 设备 SDKs 进行连接 Amazon IoT,但这不是必需的。但是 SDKs,如果您不使用 Amazon IoT 设备,则必须提供必要的连接和通信安全。客户端必须在连接请求中发送服务器名称指示 (SNI) TLS 扩展
在您的客户端连接之后,您可以使用监控和管理其 MQTT 客户端连接。 APIs有关更多信息,请参阅 管理 MQTT 连接。
本主题内容:
使用设备与 MQTT 连接 Amazon IoT SDKs
本节包含指向 Amazon IoT 设备的链接 SDKs 和示例程序源代码的链接,这些程序说明了如何将设备连接到 Amazon IoT。此处链接的示例应用程序显示了如何 Amazon IoT 使用 MQTT 协议和通过 WSS 的 MQTT 进行连接。
注意
Amazon IoT 设备 SDKs 已经发布了 MQTT 5 客户端。
MQTT 服务质量 (QoS) 选项
Amazon IoT 并且 Amazon IoT 设备 SDKs 支持 MQTT 服务质量 (QoS) 0
1
MQTT 协议定义了第三级 QoS,即2
级别, Amazon IoT 但不支持。只有 MQTT 协议支持 QoS 特征。HTTPS 通过传递查询字符串参数 ?qos=qos
来支持 QoS,其值可以是 0 或 1。
下表描述了每个 QoS 级别如何影响发布到消息代理和由消息代理发布的消息。
QoS 级别为... |
消息为... |
评论 |
---|---|---|
QoS 级别 0 |
不发送或发送多次 |
此级别应该用于通过可靠通信链接发送的消息,或者可以毫无问题地错过的消息。 |
QoS 级别 1 |
至少发送一次,然后重复发送,直到收到 |
在发送方收到指示成功传递的 |
MQTT 持久性会话
持久性会话存储客户端尚未确认的服务质量(QoS)为 1 的客户端的订阅和消息。当设备重新连接到持久性会话时,该会话恢复,订阅恢复,并将在重新连接之前接收和存储的未确认的订阅消息发送到客户端。
存储消息的处理记录在 CloudWatch 指标和 CloudWatch 日志中。有关写入 CloudWatch 和 CloudWatch 日志的条目的信息,请参见消息代理指标和排队的日志条目。
创建持久性会话
在 MQTT 3 中,您可以通过发送 CONNECT
消息并将 cleanSession
标记设置为 0
来创建 MQTT 持久性会话。如果发送 CONNECT
消息的客户端不存在会话,则会创建一个新的持久性会话。如果客户端已存在会话,则客户端会恢复现有会话。要创建干净会话,您需要发送一条 CONNECT
消息,并将 cleanSession
标志设置为 1
,当客户端断开连接时,代理将不存储任何会话状态。
在 MQTT 5 中,您可以通过设置 Clean Start
标志和 Session Expiry Interval
来处理永久性会话。干净启动控制连接会话的开始和上一会话的结束。当您设置 Clean
Start
= 1
时,会创建一个新会话,如果之前的会话存在,将终止之前的会话。当您设置 Clean Start
= 0
时,连接会话将恢复之前的会话(如果存在之前的会话)。会话过期间隔控制连接会话的结束。会话过期间隔指定断开连接后会话将持续的时间(以秒为单位,4 字节整数)。设置 Session Expiry interval
=0
可使会话在断开连接后立即终止。如果未在 CONNECT 消息中指定会话过期间隔,默认值为 0。
属性值 | 描述 |
---|---|
Clean Start = 1 |
创建新会话并终止之前的会话(如果存在之前的会话)。 |
Clean Start = 0 |
如果存在之前的会话,则恢复会话。 |
Session Expiry Interval > 0 |
持续会话。 |
Session Expiry interval = 0 |
不持续会话。 |
在 MQTT 5 中,如果设置 Clean Start
= 1
和 Session
Expiry Interval
= 0
,这相当于 MQTT 3 清理会话。如果设置 Clean Start
= 0
和 Session Expiry Interval
> 0
,这相当于 MQTT 3 永久会话。
注意
不支持跨 MQTT 版本(MQTT 3 和 MQTT 5)的持久性会话。无法将 MQTT 3 持久性会话恢复为 MQTT 5 会话,反之亦然。
持久性会话期间的操作
客户端使用连接已确认 (CONNACK
) 消息中的 sessionPresent
属性确定是否存在持久性会话。如果 sessionPresent
为 1
,则存在持久性会话,并且在客户端收到 CONNACK
后将为客户端存储的所有消息传送给客户端,如重新连接到持久性会话后的消息流量中所述。如果 sessionPresent
是 1
,则客户端无需重新订阅。但是,如果 sessionPresent
为 0
,则不存在持久性会话,并且客户端必须重新订阅主题筛选条件。
客户端加入持久性会话后,它可以发布消息并订阅主题筛选条件,而无需在每个操作上附加任何标记。
重新连接到持久性会话后的消息流量
持久性会话表示客户端与 MQTT 消息代理之间的持续连接。当客户端使用持久性会话连接到消息代理时,消息代理会保存客户端在连接期间所做的所有订阅。当客户端断开连接时,消息代理将未确认的 QoS 1 消息和发布的新 QoS 1 消息存储到客户端订阅的主题。根据账户限制存储消息。超过限制的消息将被删除。有关持久消息限制的更多信息,请参阅 Amazon IoT Core 终端节点和配额。当客户端重新连接到其持久性会话时,将恢复所有订阅,并以每秒 10 条消息的最大速率将所有已存储消息发送到客户端。在 MQTT 5 中,如果具有消息到期间隔的出站 QoS 1 在客户端离线时过期,则在连接恢复后,客户端将不会收到过期的消息。
重新连接后,以每秒限制为 10 条已存储消息的速率将已存储消息与任何当前消息流量一起发送到客户端,直到达到 Publish
requests per second per connection
限制。由于已存储消息的传递速率受到限制,如果会话在重新连接后有超过 10 条已存储消息要传递,传递所有已存储的消息将需要几秒钟的时间。
对于共享订阅者,如果群组中至少有一个订阅者使用持续会话,并且没有订阅者在线接收 QoS 1 消息,则消息将排队。消息的出队速度为群组中每个活跃订阅者每秒 20 条消息。有关更多信息,请参阅共享订阅消息队列。
结束持久性会话
持久性会话可通过以下方式结束:
-
持久性会话到期时间已过。当消息代理检测到客户端已断开连接(通过客户端断开连接或连接超时)时,持久性会话到期计时器将启动。
-
客户端发送将
cleanSession
标记设置为1
的CONNECT
消息。 -
您可以手动断开客户端连接并使用
DeleteConnection
API 清除会话。有关更多信息,请参阅 管理 MQTT 连接。
在 MQTT 3 中,持久性会话过期时间的默认值为一小时,此设置适用于账户中的所有会话。
在 MQTT 5 中,您可以为 CONNECT 和 DISCONNECT 数据包上的每个会话设置会话过期间隔。
对于 DISCONNECT 数据包上的会话过期间隔:
-
如果当前会话的会话过期间隔为 0,则无法在 DISCONNECT 数据包上将会话过期间隔设置为大于 0。
-
如果当前会话的会话过期间隔大于 0,并且您在 DISCONNECT 数据包上将会话过期间隔设置为 0,会话将在 DISCONNECT 上结束。
-
否则,DISCONNECT 数据包的会话过期间隔将更新当前会话的会话过期间隔。
注意
会话结束时等待发送给客户端的已存储消息将被丢弃;但是,即使无法发送,也仍按标准消息传递费率计费。有关消息定价的更多信息,请参阅 Amazon IoT Core
定价
持久性会话到期后重新连接
如果客户端在其持久性会话到期之前未重新连接到该会话,则该会话结束并丢弃其存储的消息。当客户端在会话到期后重新连接并将 cleanSession
标记设置为 0
时,服务会创建一个新的持久性会话。上一个会话中的任何订阅或消息都不可用于此会话,因为它们在上一个会话到期时被丢弃。
持久性会话消息费用
Amazon Web Services 账户 当消息代理向客户端或离线持续会话发送消息时,将向您收取消息费用。当具有持久会话的离线设备重新连接并恢复其会话时,存储的消息将传递到设备并再次向您的账户收费。有关消息定价的更多信息,请参阅 Amazon IoT Core 定价 - 消息收发
通过使用标准限制增加过程,可以将默认的持久性会话到期时间延长 1 小时。请注意,增加会话过期时间可能会增加消息费用,因为额外的时间可能允许离线设备存储更多消息,而这些额外的消息费用将按标准消息收发费率计入您的账户。会话到期时间为大约时间,会话的持续时间最多可能比账户限制长 30 分钟;但是,会话时间不会短于账户限制。有关会话限制的更多信息,请参阅 Amazon Service Quotas。
MQTT 保留消息
Amazon IoT Core 支持 MQTT 协议中描述的RETAIN
标志。当客户端在其发布的 MQTT 消息上设置RETAIN
标志时, Amazon IoT Core 会保存该消息。然后可以将其发送给新的订阅者,通过调用 GetRetainedMessage
操作进行检索,并在 Amazon IoT 控制台
使用 MQTT 保留消息的示例
-
作为初始配置消息
客户端订阅主题后,MQTT 保留消息会被发送给客户端。如果您希望所有订阅主题的客户端在订阅后立即收到 MQTT 保留的消息,则可以发布设置了
RETAIN
标志的配置消息。只要发布新的配置消息,订阅客户端也会收到该配置更新。 -
作为最后一个已知的状态消息
设备可以在当前状态消息上设置
RETAIN
标记,以便将其 Amazon IoT Core 保存。当应用程序连接或重新连接时,它们可以订阅此主题并在订阅保留消息主题后立即获得上一次报告的状态。这样,它们就不必等到设备发出下一条消息才能看到当前状态。
将 MQTT 保留消息存储在 Amazon IoT Core中的常见任务
Amazon IoT Core 保存设置了RETAIN
标志的 MQTT 消息。这些 保留消息 被作为普通的 MQTT 消息发送给已订阅该主题的所有客户端,同时也被存储起来发送给该主题的新订阅者。
客户端需要特定的策略操作授权才能访问 MQTT 保留消息。获取有关使用保留消息策略的示例,请参阅 保留的消息策略示例。
本节介绍了涉及保留消息的常见操作。
-
创建保留消息
客户端在发布 MQTT 消息时确定是否保留消息。客户端可以在使用设备 SDK 发布消息时设置
RETAIN
标志。应用程序和服务可以在使用Publish
操作发布 MQTT 消息时设置RETAIN
标志。每个主题名称只保留一条消息。发布到主题的带有 RETAIN 标志设置的新消息将替换先前发送到该主题的任何现有保留消息。
注意
在设置了
RETAIN
标记的情况下,您无法发布到保留的话题。 -
订阅保留消息主题
客户端订阅保留消息主题,就像订阅任何其他 MQTT 消息主题一样。通过订阅保留的消息主题收到的保留消息已设置标
RETAIN
记。Amazon IoT Core 当客户端向保留的消息主题发布带有 0 字节消息负载的保留消息时,将删除保留的消息。已订阅保留消息主题的客户端也将收到该 0 字节消息。
订阅包含保留消息主题的通配符主题筛选条件可使客户端接收发布到保留消息主题的后续消息,但在订阅时不会传递保留消息。
注意
要在订阅后收到保留的消息,订阅请求中的主题筛选器必须与保留的消息主题完全匹配。
订阅保留消息主题时收到的保留消息已设置标
RETAIN
记。订阅客户端在订阅后收到的保留消息则没有。 -
检索保留消息
当客户端使用保留消息订阅主题时,保留消息会被自动发送给客户端。要让客户端在订阅时收到保留消息,必须订阅保留消息的确切主题名称。通过订阅包含保留消息主题的通配符主题筛选条件,客户端可以接收发布到保留消息主题的后续消息,但不会在订阅时传送保留消息。
服务和应用可以通过调用
ListRetainedMessages
和GetRetainedMessage
列出和检索保留消息。如果不设置
RETAIN
标志,则不会阻止客户端向保留的消息主题发布消息。这可能会导致意外结果,例如保留消息与订阅主题收到的消息不匹配。在 MQTT 5 中,如果保留消息设置了消息过期间隔且保留消息已过期,则订阅该主题的新订阅者在成功订阅后将不会收到该保留消息。
-
列出保留消息主题
您可以通过调用
ListRetainedMessages
列出保留消息,并且可以在 Amazon IoT 控制台中查看保留消息。 -
获取保留消息详细信息
您可以通过调用
GetRetainedMessage
获取保留消息的详细信息,并且可以在 Amazon IoT 控制台中查看这些信息。 -
保留 Will 消息
连接设备时创建的 MQTT Will 消息
可以通过设置 Connect Flag bits
字段中的Will Retain
标记保留。 -
删除保留消息
设备、应用程序和服务可以通过向要删除的保留消息的主题名称发布设置了
RETAIN
标记且消息负载为空(0 字节)的消息来删除保留的消息。此类消息会从中删除保留的消息 Amazon IoT Core,发送给订阅了该主题的客户端,但它们不会被保留 Amazon IoT Core。还可以通过访问 Amazon IoT 控制台
中的保留消息以交互的方式删除保留消息。通过 Amazon IoT 控制台 删除的保留消息也会向已订阅保留消息主题的客户端发送 0 字节的消息。 保留消息在删除后无法恢复。客户端需要发布新的保留消息才能取代已删除的消息。
-
保留消息的调试和故障排查
Amazon IoT 控制台
提供多个工具来帮助您进行保留消息故障排查: -
保留消息
页面 Amazon IoT 控制台中的 保留消息 页面提供您的账户在当前区域中存储的保留消息的分页列表。在此页面上,您可以:
-
查看每条保留消息的详细信息,例如消息负载、QoS、接收时间。
-
更新保留消息的内容。
-
删除保留消息。
-
-
打开 MQTT 测试客户端
Amazon IoT 控制台中的 MQTT 测试客户端 页面可以订阅并发布到 MQTT 主题。发布选项让您可以在发布的消息上设置 REATEIN 标志,以模拟设备的行为方式。您还可以使用 MQTT 测试客户端监控来自您通过客户端连接接口管理的已连接客户端的消息。有关管理客户端连接的更多信息,请参见管理 MQTT 连接。
一些意想不到的结果可能是这些方面实现保留消息的结果 Amazon IoT Core。
-
保留消息限制
当一个账户存储了最大数量的保留消息时,会对设置了 RETAIN 且有效负载大于 0 字节的消息 Amazon IoT Core 返回限制响应,直到某些保留的消息被删除并且保留的消息数量降至限制以下。
-
保留消息传递顺序
不保证保留消息和订阅消息传递的顺序。
-
账单和保留消息
从客户端、使用 Amazon IoT
控制台或通过调用发布带有RETAIN
标记的消息会Publish
产生Amazon IoT Core 定价-消息传送中所述的额外消息
客户端、使用 Amazon IoT 控制台或通过调用检索保留的消息除了需要支付正常的 API 使用费外,还会GetRetainedMessage
产生消息收费。Amazon IoT Core
定价-消息收发
在设备意外断开连接时发布的 MQTT Will消息
有关消息传递定价的更多信息,请参阅 Amazon IoT Core 定价 - 消息传递
比较 MQTT 保留消息和 MQTT 持久会话
保留消息和持久性会话是 MQTT 的标准特征,使设备能够接收离线时发布的消息。持久会话中可以发布保留消息。本节介绍这些特征的主要方面及其如何协作。
保留消息 |
持久会话 |
|
---|---|---|
主要特征 |
在连接大量设备后,保留消息可用于配置或通知这些设备。 如果您希望设备仅接收重新连接后发布到主题的最后一条消息,也可以使用保留消息。 |
持久会话对于间歇性连接而可能错过多条重要消息的设备非常有用。 设备可以连接持久会话来接收离线时发送的消息。 |
示例 |
保留消息可以在设备上线时提供有关其环境的配置信息。初始配置可以包括应该订阅的其他消息主题的列表,或者如何配置本地时区的相关信息。 |
通过间歇连接的蜂窝网络连接的设备可以使用持久会话,避免丢失在设备超出网络覆盖范围或需要关闭其蜂窝无线电时发送的重要消息。 |
初始订阅主题时收到的消息 |
订阅带有保留消息的主题后,会收到最近的保留消息。 |
在订阅没有保留消息的主题后,向该主题发布消息之前不会收到任何消息。 |
重新连接后订阅的主题 |
如果没有持久会话,客户端必须在重新连接后订阅主题。 |
重新连接后,将恢复订阅的主题。 |
重新连接后收到的消息 |
订阅带有保留消息的主题后,会收到最近的保留消息。 |
在设备断开连接时,所有以 QOS = 1 发布并使用 QOS =1 订阅的消息都将在设备重新连接后发送。 |
数据会话过期 |
在 MQTT 3 中,保留消息不会过期。它们将被存储,直至被替换或删除。在 MQTT 5 中,保留的消息将在您设置的消息到期时间间隔之后过期。有关更多信息,请参阅消息过期。 |
如果未在超时期限内重新连接客户端,持久会话将过期。持久会话过期后,在设备断开连接时以 QOS = 1 发布并使用 QOS =1 订阅的客户端订阅和保存消息将被删除。将不会传送已过期的消息。获取有关持久会话的会话过期时间的更多信息,请参阅 MQTT 持久性会话。 |
有关持久性存储的信息,请参阅 MQTT 持久性会话。
使用保留消息,发布客户端可确定是否应在连接后保留消息并将其传送到设备,是否有上一个会话。存储消息的选择由发布者决定,存储的消息将传递给订阅 QoS 0 或 QoS 1 订阅的所有当前和将来的客户端。保留消息一次只保存一条给定主题的消息。
当帐户存储了最大数量的保留消息时, Amazon IoT Core 将对使用 RETAIN 集和大于 0 字节的有效负载发布的消息返回限制响应,直到删除一些保留消息且保留消息数不超过限制。
MQTT 保留了消息和 Amazon IoT 设备影子
保留消息和 Device Shadows 都保留来自设备的数据,但它们的行为不同,用途也不同。本节介绍它们的相似之处和不同之处。
保留消息 |
设备影子 |
|
---|---|---|
消息有效负载具有预定义的结构或架构 |
正如实施所定义的。MQTT 没有为其消息负载指定结构或架构。 |
Amazon IoT 支持特定的数据结构。 |
更新消息负载会生成事件消息 |
发布保留消息会将消息发送到订阅的客户端,但不会生成其他更新消息。 |
更新 Device Shadow会出现更新描述更改的消息。 |
消息更新已编号 |
保留消息不会自动编号。 | Device Shadow 文档具有自动版本号和时间戳。 |
消息有效负载附加到事物资源上 |
保留消息不会附加到事物资源。 |
Device Shadows 附加到事物资源。 |
更新消息有效负载的单个元素 |
如果不更新整个消息负载,就无法更改消息的单个元素。 |
可以更新 Device Shadow 文档的各个元素,而无需更新整个 Device Shadow 文档。 |
客户端在订阅时收到消息数据 |
客户端在订阅带有保留消息的主题后,会自动收到一条保留的消息。 |
客户端可以订阅 Device Shadow 更新,但他们必须故意请求当前状态。 |
索引和可搜索性 |
保留消息不会编制索引进行搜索。 |
实例集索引 Device Shadow 数据进行搜索和聚合。 |
MQTT Last Will and Testament(LWT)消息
Last Will and Testament(LWT)是 MQTT 中的一项特征。借助 LWT,客户端可以指定一条消息,当出现未启动的断开连接时,代理将该消息发布到客户定义的主题,并发送给订阅该主题的所有客户端。客户端指定的消息称为 LWT 消息或 Will 消息,客户端定义的主题称为 Will 主题。您可以指定当设备连接到代理时的 LWT 消息。通过在连接期间在 Connect Flag bits
字段中设置 Will
Retain
标志,可以保留这些消息。例如,如果 Will Retain
标志设置为 1
,则 Will 消息将存储在代理中的关联 Will 主题中。有关更多信息,请参阅 Will 消息
管理客户端连接时,您可以控制在断开客户端连接时是否发布 LWT 消息。有关更多信息,请参阅 管理 MQTT 连接。
代理将存储 Will 消息,直到出现未启动的断开连接。发生这种情况时,代理将向所有订阅 Will 主题的客户端发布消息以通知断开连接。如果客户端使用 MQTT DISCONNECT 消息通过客户端启动的断开连接来断开与代理的连接,则代理不会发布存储的 LWT 消息。在所有其它情况下,将分派 LWT 消息。有关代理发送 LWT 消息时的断开连接场景的完整列表,请参阅连接/断开连接事件。
使用 ConnectAttributes
ConnectAttributes
允许您在 IAM policy 中指定要在连接消息中使用的属性,如 PersistentConnect
和 LastWill
。借助 ConnectAttributes
,您可以构建默认情况下不允许设备访问新特征的策略,这在设备受到威胁时很有帮助。
connectAttributes
支持以下特征:
PersistentConnect
-
当客户端和代理之间的连接中断时,使用
PersistentConnect
特征可以保存客户端在连接期间所做的所有订阅。 LastWill
-
当客户端意外断开连接时,使用
LastWill
特征可以向LastWillTopic
发布消息。
默认情况下,您的策略具有非持久性连接,并且没有为此连接传递任何属性。如果您想要具有持久连接,则必须在 IAM 策略中指定持久连接。
管理客户端连接时,您可以查看已连接客户端的连接属性和会话配置。有关更多信息,请参阅 管理 MQTT 连接。
有关 ConnectAttributes
示例,请参阅连接策略示例。
MQTT 5 支持的特征
Amazon IoT Core 对 MQTT 5 的支持基于 MQTT v5.0 规范
Amazon IoT Core 支持以下 MQTT 5 功能:
共享订阅
Amazon IoT Core 支持 MQTT 3.1.1 和 MQTT 5 的共享订阅。共享订阅允许多个客户端共享一个主题的订阅,并且只有一个客户端会收到使用随机分布发布到该主题的消息。共享订阅可以有效地在多个订阅者之间对 MQTT 消息进行负载平衡。例如,假设您有 1000 台设备发布到同一个主题,有 10 个后端应用程序正在处理这些消息。在这种情况下,后端应用程序可以订阅同一个主题,并且每个应用程序都将随机接收设备向共享主题发布的消息。这实际上是“共享”这些消息的负载。共享订阅还可以提高弹性。当任何后端应用程序断开连接时,代理会将负载分配给组中剩余的订阅用户。当所有订阅者断开连接时,消息将排队。
消息队列功能可用于 MQTT 3.1.1 和 MQTT 5 连接上的共享订阅,以增强消息传输的可靠性。
要使用共享订阅,客户需要按如下方式订阅共享订阅的主题过滤器:
$share/{ShareName}/{TopicFilter}
-
$share
是一个文本字符串,用于表示共享订阅的主题筛选条件,该筛选条件必须以$share
开头。 -
{ShareName}
是一个字符串,用于指定一组订阅用户使用的共享名称。共享订阅的主题筛选器必须包含ShareName
和后跟字/
符。{ShareName}
不得包含以下字符:/
、+
或#
。的最大大小{ShareName}
为 128 个 UTF-8 字符。 -
{TopicFilter}
遵循与非共享订阅相同的主题筛选器语法。的最大大小{TopicFilter}
为 256 个 UTF-8 字符。 -
$share/{ShareName}/{TopicFilter}
所需的两个斜杠(/
)不包括在主题和主题筛选条件中的最大斜杠数限制中。
具有相同内容的订阅{ShareName}/{TopicFilter}
属于同一个共享订阅组。您可以创建多个共享订阅组,并且不要超过每个群组的共享订阅限制。有关更多信息,请参阅 Amazon 一般参考中的 Amazon IoT Core 端点和配额。
下表比较了非共享订阅和共享订阅:
订阅 | 描述 | 主题筛选条件示例 |
---|---|---|
非共享订阅 | 每个客户端创建单独的订阅以接收已发布的消息。当消息发布到某个主题时,该主题的所有订阅用户都会收到该消息的副本。 |
|
共享订阅 | 多个客户端可以共享对一个主题的订阅,并且只有一个客户端会收到以随机分布方式发布到该主题的消息。 |
|
非共享订阅流程 | 共享订阅流程 |
---|---|
![]() |
![]() |
使用共享订阅的重要注意事项
-
如果共享订阅者组由任何持续会话订阅者组成,当共享组中的所有订阅者都断开连接时,或者任何订阅者违反了每连接每秒发布请求数限制时,发布到共享订阅组的所有未确认的 QoS 1 消息和未送达 QoS 1 消息都将进入队列。有关更多信息,请参阅共享订阅消息队列。
-
如果出现任何故障,发布到共享订阅组的 QoS 0 消息将被丢弃。
-
作为共享订阅者群组的一部分订阅主题模式时,共享订阅不会收到保留的消息。在具有共享订阅者且设置了
RETAIN
标记的主题上发布的消息将像任何其他发布消息一样传递给共享订阅者。 -
当共享订阅包含通配符(# 或 +)时,一个主题可能有多个匹配的共享订阅。如果发生这种情况,消息代理会复制发布消息,并将其发送给每个匹配的共享订阅中的随机客户端。下图可以解释共享订阅的通配符行为。
在此示例中,发布的 MQTT 主题
sports/tennis
有三个匹配的共享订阅。消息代理复制已发布的消息,并将消息发送给每个匹配组中的随机客户端。客户端 1 和客户端 2 共享订阅:
$share/consumer1/sports/tennis
客户端 3 和客户端 4 共享订阅:
$share/consumer1/sports/#
客户端 5 和客户端 6 共享订阅:
$share/consumer2/sports/tennis
有关共享订阅限制的更多信息,请参阅《Amazon 一般参考》中的Amazon IoT Core 终端节点和配额。要在Amazon IoT 控制台
共享订阅消息队列
为了增强消息传送的可靠性,共享订阅包括消息队列功能,可在没有在线订阅者可用时存储消息。当共享订阅组中至少包含一个具有持续会话的成员时,将为该群组启用队列功能。分发邮件时,会选择在线成员作为收件人。当找不到在线成员或订阅者超过限制时,QoS 1 消息将排队。Publish requests per second per connection
当现有成员恢复其持续会话或新成员加入群组时,就会传送排队的消息。每个活跃的群组订阅者以每秒最多 20 条排队消息的速度传送排队的消息,以及根据订阅向订阅者传送的任何其他消息。
默认情况下,排队的消息保留遵循Persistent Session expiry period
配额。但是,如果在入站发布消息中设置了消息到期间隔 (MEI),则 MEI 优先。如果存在 MEI,则无论持续会话的到期时间长短,它都会确定消息的保留期。
消息队列速率受Queued messages per second per account
配额限制,消息数量受Maximum number of queued messages per shared subscription group
配额限制。
当超过这些限制时,仅保留在达到限制之前已经排队的消息。超过限制的新传入消息将被丢弃。系统不会将较旧的队列消息替换为较新的消息。
消息队列记录在 CloudWatch 指标和 CloudWatch 日志中。有关写入 CloudWatch 和 CloudWatch 日志的条目的信息,请参见消息代理指标和排队的日志条目。排队的消息仍按标准消息费率计费。有关消息定价的更多信息,请参阅 Amazon IoT Core 定价
共享订阅组中的会话生命周期
当一个干净的会话订阅群组时,它就会成为该群组的在线成员。当它取消订阅或断开连接时,干净的会话就会离开群组。
当持续会话订阅群组时,它就会成为该群组的在线成员。断开连接后,它仍保留在群组中,但会成为群组的脱机成员。当它重新连接时,它会再次成为在线会员。永久会话在群组明确取消订阅或断开连接后过期时会离开群组。
干净启动和会话过期
您可以使用“干净启动”和“会话过期”来更灵活地处理持久性会话。干净启动标志指示是否应在不使用现有会话的情况下启动会话。会话过期间隔指示断开连接后会话保持多长时间。可以在断开连接后修改会话过期间隔。有关更多信息,请参阅 MQTT 持久性会话。
全部显示原因代码 ACKs
您可以使用原因代码更轻松地调试或处理错误消息。消息代理根据与代理的交互类型(订阅、发布、确认)返回原因代码。有关更多信息,请参阅 MQTT 原因代码。有关 MQTT 原因代码的完整列表,请参阅 MQTT v5 规范
话题别名
您可以将主题名称替换为主题别名,主题别名是一个双字节整数。使用主题别名可以优化主题名称的传输,从而有可能降低计量数据服务的数据成本。 Amazon IoT Core 默认限制为 8 个主题别名。有关更多信息,请参阅 Amazon 一般参考中的 Amazon IoT Core 端点和配额。
消息到期
您可以向已发布的消息添加消息过期值。这些值表示以秒为单位的消息到期间隔 (MEI)。如果未在该间隔内将消息发送给订阅者,该消息将过期并被删除。如果不设置消息过期值,消息会过期。
在出站时,订阅者将收到一条消息,其中包含到期间隔内的剩余时间。例如,如果入站发布消息的消息过期间隔为 30 秒,并且在 20 秒后路由到订阅者,则消息过期字段将更新为 10。订阅者收到的消息的更新后的 MEI 可能为 0。这是因为只要剩余时间为 999 毫秒或更短,它就会更新为 0。
在中 Amazon IoT Core,最小 MEI 为 1。如果从客户端将间隔设置为 0,则间隔将调整为 1。最长消息过期间隔为 604800(7 天)。高于此值的任何值都将调整为最大值。
在跨版本通信中,消息过期的行为由入站发布消息的 MQTT 版本决定。例如,对于订阅会话的设备,通过连接的会话发送的带有 MQTT3消息到期的消息 MQTT5 可能会过期。下表列出了消息过期如何支持以下类型的发布消息:
发布消息类型 | 消息过期间隔 |
---|---|
定期发布 | 如果服务器未能在指定时间内传送消息,则过期的消息将被删除,订阅者将无法收到该消息。这包括设备未发布确诊其 QoS 1 消息等情况。 |
保留 | 如果保留消息过期,而新客户端订阅了该主题,则该客户端在订阅后将不会收到该消息。 |
最后遗嘱 | 最后遗嘱消息间隔是在客户端断开连接,并且服务器尝试向其订阅者传送最后遗嘱消息之后开始的。 |
已排队消息 | 如果具有消息到期间隔的出站 QoS 1 在客户端离线时过期,则在持续会话恢复后,客户端将不会收到过期的消息。 |
其它 MQTT 5 特征
服务器断开连接
断开连接时,服务器可以主动向客户端发送 DISCONNECT,以通知连接关闭,同时发送断开连接的原因代码。
请求/响应
发布者可以请求接收方在收到时向发布者指定的主题发送响应。
最大数据包大小
客户端和服务器可以独立指定它们支持的最大数据包大小。
负载格式和内容类型
发布消息时,您可以指定负载格式(二进制、文本)和内容类型。这些消息将被转发给消息的接收者。
MQTT 5 属性
MQTT 5 属性是 MQTT 标准的重要补充,用于支持 MQTT 5 的新功能,例如会话到期和模式。 Request/Response 在中 Amazon IoT Core,您可以创建可以转发出站消息中的属性的规则,或者使用 HTTP Publis h 发布带有某些新属性的 MQTT 消息。
下表列出了所有 Amazon IoT Core 支持的 MQTT 5 属性。
属性 | 描述 | 输入类型 | 数据包 |
---|---|---|---|
负载格式指示符 | 一个布尔值,用于指示有效负载是否格式化为 UTF-8。 | 字节 | PUBLISH、CONNECT |
内容类型 | 一个描述负载内容的 UTF-8 字符串。 | UTF-8 字符串 | PUBLISH、CONNECT |
回复主题 | 一个 UTF-8 字符串,描述接收方作为请求-响应流程的一部分应发布到的主题。主题不得包含通配符。 | UTF-8 字符串 | PUBLISH、CONNECT |
关联数据 | 请求消息的发送者用来指示回复消息回复哪个请求的二进制数据。 | 二元 | PUBLISH、CONNECT |
用户属性 | 一对 UTF-8 字符串。此属性可以在一个数据包中出现多次。接收者将按照键-值对的发送顺序接收键-值对。 | UTF-8 字符串对 | CONNECT、PUBLISH、Will Properties、SUBSCRIBE、DISCONNECT、UNSUBSCRIBE |
消息过期间隔 | 一个 4 字节的整数,表示消息到期时间间隔(以秒为单位)。如果此数值不存在,消息永远不会过期。 | 4 字节整数 | PUBLISH、CONNECT |
会话过期间隔 |
一个 4 字节的整数,表示会话到期时间间隔(以秒为单位)。 Amazon IoT Core 最多支持 7 天,默认最长为 1 小时。如果您设置的值超过了账户的最大值,则 Amazon IoT Core 会在 CONNACK 中返回调整后的值。 |
4 字节整数 | CONNECT、CONNACK、DISCONNECT |
分配的客户端标识符 | 设备未指定客户端 ID Amazon IoT Core 时生成的随机客户端 ID。随机客户端 ID 必须是代理当前管理的任何其他会话都未使用的新客户端标识符。 | UTF-8 字符串 | CONNACK |
服务器保持活动 | 一个 2 字节整数,表示服务器分配的保持活动时间。如果客户端处于非活动状态的时间超过保持活状态的动时间,服务器将断开客户端的连接。 | 2 字节整数 | CONNACK |
请求问题信息 | 一个布尔值,用于指示在失败时是发送原因字符串还是用户属性。 | 字节 | CONNECT |
接收最大值 | 一个 2 字节整数,表示在未收到 PUBACK 的情况下可以发送的 PUBLISH QOS > 0 数据包的最大数量。 | 2 字节整数 | CONNECT、CONNACK |
主题别名最大值 | 此值表示将被接受作为主题别名的最大值。默认值为 0。 | 2 字节整数 | CONNECT、CONNACK |
最大 QoS 数 | 支持的 QoS 的最大值。 Amazon IoT Core 默认值为 1。 Amazon IoT Core 不支持 QoS 2。 | 字节 | CONNACK |
保留可用 |
一个布尔值,用于指示 Amazon IoT Core 消息代理是否支持保留的消息。默认 为 1。 |
字节 | CONNACK |
最大数据包大小 | Amazon IoT Core 接受和发送的最大数据包大小。不能超过 128 KB。 | 4 字节整数 | CONNECT、CONNACK |
通配符订阅可用 |
一个布尔值,用于指示 Amazon IoT Core 消息代理是否支持可用的通配符订阅。默认 为 1。 |
字节 | CONNACK |
订阅标识符可用 |
一个布尔值,用于指示 Amazon IoT Core 消息代理是否支持可用订阅标识符。默认值是 0。 |
字节 | CONNACK |
MQTT 原因代码
MQTT 5 引入了改进的错误报告和原因代码响应。 Amazon IoT Core 可以返回原因代码,包括但不限于以下按数据包分组的内容。有关 MQTT 支持的原因代码的完整列表,请参阅 MQTT 5 规范
值 | 十六进制 | 原因代码名称 | 描述 |
---|---|---|---|
0 | 0x00 | 成功 | 连接被接受。 |
128 | 0x80 | 未指定的错误 | 服务器不希望透露失败的原因,或者其他原因代码都不适用。 |
133 | 0x85 | 客户端标识符无效 | 客户端标识符是有效的字符串,但服务器不允许使用。 |
134 | 0x86 | 用户名或密码错误 | 服务器不接受客户端指定的用户名或密码。 |
135 | 0x87 | 未授权 | 客户端无权连接。 |
144 | 0x90 | 主题名称无效 | 遗嘱主题名称格式正确,但未被服务器接受。 |
151 | 0x97 | 超出配额 | 已超出实施或管理施加的限制。 |
155 | 0x9B | 不支持 QoS | 服务器不支持遗嘱 QoS 中设置的 QoS。 |
值 | 十六进制 | 原因代码名称 | 描述 |
---|---|---|---|
0 | 0x00 | 成功 | 该消息已被接受。继续发布 QoS 1 消息。 |
128 | 0x80 | 未指定的错误 | 接收者不接受发布,但要么不想透露原因,要么与其他值不匹配。 |
135 | 0x87 | 未授权 | PUBLISH 未经授权。 |
144 | 0x90 | 主题名称无效 | 主题名称格式正确,但不被客户端或服务器接受。 |
145 | 0x91 | 正在使用数据包标识符 | 数据包标识符已在使用中。这可能表示客户端和服务器之间的会话状态不匹配。 |
151 | 0x97 | 超出配额 | 已超出实施或管理施加的限制。 |
值 | 十六进制 | 原因代码名称 | 描述 |
---|---|---|---|
129 | 0x81 | 数据包格式不正确 | 收到的数据包不符合此规范。 |
130 | 0x82 | 协议错误 | 收到意外或无序的数据包。 |
135 | 0x87 | 未授权 | 请求未经授权。 |
139 | 0x8B | 服务器正在关闭 | 服务器正在关闭。 |
141 | 0x8D | 保持活动状态超时 | 连接已关闭,因为在 1.5 倍的保持活动状态时间内没有收到任何数据包。 |
142 | 0x8E | 会话已接管 | 使用相同 ClientID 的另一个连接已连接,导致此连接关闭。 |
143 | 0x8F | 主题筛选条件无效 | 主题筛选条件格式正确,但未被服务器接受。 |
144 | 0x90 | 主题名称无效 | 主题名称格式正确,但未被该客户端或服务器接受。 |
147 | 0x93 | 超出最大接收数 | 客户端或服务器收到的发布数超过了未发送 PUBACK 或 PUBCOMP 的最大接收数。 |
148 | 0x94 | 主题别名无效 | 客户端或服务器收到了一个 PUBLISH 数据包,其中包含的主题别名大于其在 CONNECT 或 CONNACK 数据包中发送的最大主题别名。 |
151 | 0x97 | 超出配额 | 已超出实施或管理施加的限制。 |
152 | 0x98 | 管理操作 | 由于管理操作,连接已关闭。 |
155 | 0x9B | 不支持 QoS | 客户端指定的 QoS 大于 CONNACK 的“最大 QoS”中指定的 QoS。 |
161 | 0xA1 | 不支持订阅标识符 | 服务器不支持订阅标识符;不接受订阅。 |
值 | 十六进制 | 原因代码名称 | 描述 |
---|---|---|---|
0 | 0x00 | 授予的 QoS 0 | 接受订阅,发送的最大 QoS 将为 QoS 0。这可能比请求的 QoS 低。 |
1 | 0x01 | 授予的 QoS 1 | 接受订阅,发送的最大 QoS 将为 QoS 1。这可能比请求的 QoS 低。 |
128 | 0x80 | 未指定的错误 | 未接受订阅,要么服务器不希望透露原因,要么其他原因代码都不适用。 |
135 | 0x87 | 未授权 | 客户端无权进行此订阅。 |
143 | 0x8F | 主题筛选条件无效 | 主题筛选条件格式正确,但不允许此客户端使用。 |
145 | 0x91 | 正在使用数据包标识符 | 指定的数据包标识符已在使用中。 |
151 | 0x97 | 超出配额 | 已超出实施或管理施加的限制。 |
值 | 十六进制 | 原因代码名称 | 描述 |
---|---|---|---|
0 | 0x00 | 成功 | 订阅将被删除。 |
128 | 0x80 | 未指定的错误 | 无法完成取消订阅,要么服务器不希望透露原因,要么其他原因代码都不适用。 |
143 | 0x8F | 主题筛选条件无效 | 主题筛选条件格式正确,但不允许此客户端使用。 |
145 | 0x91 | 正在使用数据包标识符 | 指定的数据包标识符已在使用中。 |
Amazon IoT 与 MQTT 规格的区别
尽管消息代理的实施基于 MQTT v3.1.1 规范
-
Amazon IoT 不支持 MQTT 3 的以下数据包:PUBREC、PUBREL 和 PUBCOMP。
-
Amazon IoT 不支持 MQTT 5 的以下数据包:PUBREC、PUBREL、PUBCOMP 和 AUTH。
-
Amazon IoT 不支持 MQTT 5 服务器重定向。
-
Amazon IoT 仅支持 MQTT 服务质量 (QoS) 级别 0 和 1。 Amazon IoT 不支持以 QoS 级别 2 发布或订阅。在请求 QoS 级别 2 时,消息代理不会发送 PUBACK 或 SUBACK。
-
在中 Amazon IoT,订阅 QoS 级别为 0 的主题意味着消息的传送次数为零次或多次。消息可能会多次发送。多次发送的消息在发送时可能会使用不同的数据包 ID。在这些情况下,不会设置 DUP 标志。
-
在响应连接请求时,消息代理将发送 CONNACK 消息。此消息包含一个标志,用于指明该连接是否会恢复上一个会话。
-
在发送其它控制数据包或断开连接请求之前,客户端必须等待从 Amazon IoT 消息代理发送到设备的 CONNACK 消息。
-
当客户端订阅主题时,在消息代理开始发送 SUBACK 和客户端开始收到新的匹配消息之间存在时间延迟。
-
当客户端在订阅主题的主题过滤条件中使用通配符
#
时,主题层次结构中处于及其级别以下的所有字符串均会匹配。但是,父主题不匹配。例如,订阅主题sensor/#
接收发布到主题sensor/
、sensor/temperature
、sensor/temperature/room1
的消息,但不是发布到sensor
的消息。有关通配符的更多信息,请参阅 主题名称过滤器。 -
消息代理使用客户端 ID 标识每个客户。客户端 ID 作为 MQTT 负载的一部分从客户端传递到消息代理。客户端 ID 相同的两个客户端无法同时连接到消息代理。当某个客户端使用另一客户端正在使用的客户端 ID 连接到消息代理时,会接受新的客户端连接,而之前连接的客户端会断开连接。您也可以使用手动断开客户端连接 APIs。有关更多信息,请参阅 管理 MQTT 连接。
-
在极少数情况下,消息代理可能会使用不同的数据包 ID 再次发送相同的逻辑 PUBLISH 消息。
-
订阅包含通配符的主题筛选条件无法接收保留消息。要接收保留消息,订阅请求必须包含与保留消息主题完全匹配的主题筛选条件。
-
消息代理并不保证收到消息和 ACK 的顺序。
-
Amazon IoT 可能有与规格不同的限制。有关更多信息,请参阅《Amazon IoT 参考指南》中的Amazon IoT Core 消息代理和协议限制与限额。
-
不支持 MQTT DUP 标志。
管理 MQTT 连接
Amazon IoT Core APIs 提供帮助您管理 MQTT 连接,包括断开客户端连接和管理其会话的功能。这些功能使您可以更好地控制 Amazon IoT 客户机群,并帮助解决连接问题。
DeleteConnection API
使用 DeleteConnection
API Amazon IoT Core 通过指定 MQTT 设备的客户端 IDs,将其与 MQTT 设备断开连接。断开客户端 Amazon IoT Core 连接时,会断开客户端与 Amazon IoT Core 消息代理的连接,并且可以选择清理会话状态并隐藏 “遗嘱” (LWT) 消息。
当您调用 DeleteConnection
API 时, Amazon IoT Core 会执行多项操作以确保断开连接。 Amazon IoT Core 首先向客户端发送 MQTT 断开连接消息以终止 MQTT 会话。然后,该服务会关闭底层 TCP/TLS 套接字。
消息代理向设备发送DISCONNECT
数据包,并发布带有断开连接原因的生命周期事件API_INITIATED_DISCONNECT
。这可以帮助您确定何时断开连接是通过 API 发起的,而不是由客户端发起的,或者是由于网络问题引起的。您可以监控这些事件,以实现可见性、故障排除和审计目的。例如,您可以使用 Amazon IoT 规则来处理这些事件,以跟踪客户端断开连接的时间和原因。
如果将cleanSession
参数设置为true
,则会 Amazon IoT Core 移除客户端的会话状态,包括所有订阅和排队消息。如果您清理会话,则永久会话将终止。如果客户端是持久会话并且preventWillMessage
参数设置为false
,则服务会调度 LWT 消息(如果有),这在计划的维护操作中很有用。
当您调用 DeleteConnection
API 时,断开连接过程会立即开始,但是客户端识别断开连接的确切时间可能会因网络条件和客户端实现而异。大多数客户端会在几秒钟内检测到断开连接,但在某些情况下,如果网络连接不佳,客户端可能需要更长的时间才能识别出已断开连接。
注意
通过强制断开连接,客户端必须重新进行身份验证并使用新的会话状态重新授权。API 调用本身并不能阻止客户端的重新连接。如果需要这样做,那么在发出 DeleteConnection
API 调用之前,还必须修改客户的凭据或策略。
有关定价的信息,请参阅 Amazon IoT Core 定价
使用案例
该 DeleteConnection
API 可用于管理表现出问题行为或消耗过多资源的行为不端的客户端。通过强制断开连接,可以确保客户端通过适当的身份验证和授权重新建立连接,这有助于解决资源消耗问题。
客户端重定向场景也受益于此 API。当你需要将客户端重定向到不同的终端节点时 Amazon Web Services 区域,你可以通过编程方式断开它们的连接,然后通过更改 DNS 设置让它们重新连接到不同的 Amazon IoT Core 终端节点。此 API 可以帮助解决连接卡住问题或清除可能阻碍正常操作的有问题的会话状态。
API 参数
DeleteConnection
API 接受以下参数:
- 客户端 ID(必填)
-
要断开连接的 MQTT 客户端的唯一标识符。这是在 URL 路径中指定的。客户端 ID 不能以美元符号 ($) 开头。
注意
MQTT 客户端 IDs 可能包含在 HTTP 请求中无效的字符。使用
DeleteConnection
API 时,您必须对客户端 ID 中任何在 MQTT 中有效但在 HTTP 中无效的字符进行网址编码(百分比编码)。这包括特殊字符,例如空格、正斜杠 (/) 和 UTF-8 字符。例如,空格变成 %20,正斜杠变成 %2F,UTF-8 字符 u 变成 %C 3% BC。正确的编码可确保在基于 HTTP IDs 的 API 调用中正确传输 MQTT 客户端。 - 清理会话(可选)
-
指定在断开连接时是否删除客户端的会话状态。设置
true
为可删除所有会话信息,包括订阅和排队消息。设置false
为可保留会话状态。默认情况下,此值设置为false
(保留会话状态)。对于干净的会话,此参数将被忽略。 - preventWillMessage (可选)
-
控制是否在 Amazon IoT Core 断开连接时发送遗嘱与遗嘱 (LWT) 消息(如果有)。设置为可
true
防止发送 LWT 消息。设置为false
允许调度。默认情况下,此值设置为false
(如果可用,则调度 LWT)。
API 语法
该 DeleteConnection
API 使用以下 HTTP 请求格式:
DELETE /connections/<clientId>?cleanSession=<cleanSession>&preventWillMessage=<preventWillMessage> HTTP/1.1
请求示例:
// Basic disconnect (preserves session, allows LWT message) DELETE /connections/myDevice123 HTTP/1.1 // Disconnect and clear session DELETE /connections/myDevice123?cleanSession=TRUE HTTP/1.1 // Disconnect, clear session, and prevent LWT message DELETE /connections/myDevice123?cleanSession=TRUE&preventWillMessage=TRUE HTTP/1.1
成功的请求会返回 HTTP 200 OK,但没有响应正文。
注意
Amazon 签名版本 4 用于签署请求的服务名称是:iot devicegategateway。您可以使用aws iot describe-endpoint --endpoint-type iot:Data-ATS
命令找到您的终端节点。
所需的权限
要使用该 DeleteConnection
API,您需要获得以下 IAM 权限:
iot:DeleteConnection
您可以使用基于资源的策略将此权限范围限定到特定的客户端 IDs 。例如:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:DeleteConnection", "Resource": "arn:aws:iot:region:account:client/myDevice*" } ] }
重要注意事项
除非您已实现其他逻辑来防止重新连接,否则已断开连接的客户端可以立即尝试重新连接。断开连接操作仅终止当前连接,不会阻止连接重新连接。如果您需要防止重新连接,请考虑实现客户端逻辑或禁用设备的凭证。
作为标准 API 速率限制的一部分,速率限制适用于 Amazon IoT Core API。在计划批量断开连接操作时,请确保考虑这些限制,并实施适当的重试逻辑和批处理策略以避免限制。有关更多信息,请参阅 Amazon IoT Core 终端节点和限额。
错误响应
DeleteConnection
API 可以返回以下错误响应:
- InvalidRequestException
-
请求无效。如果客户端 ID 格式无效、包含美元符号 ($) 前缀或者缺少必需的参数,则可能会发生这种情况。
- ResourceNotFoundException
-
指定的客户端 ID 不存在或当前未连接,并且没有持续会话。
- UnauthorizedException
-
您没有权限执行此操作。确保您拥有所需的
iot:DeleteConnection
权限。 - ForbiddenException
-
来电者无权提出请求。这可能是由于 IAM 权限不足或基于资源的策略限制而发生的。
- ThrottlingException
-
速率超过限制。降低 API 调用的频率,并通过指数退避实现适当的重试逻辑。
- InternalFailureException
-
出现意外错误。稍等片刻后重试请求。
- ServiceUnavailableException
-
服务暂时不可用。稍等片刻后重试请求。