你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
消息队列遥测传输(MQTT)是为受约束环境设计的发布-订阅消息传送传输协议。 MQTT 高效、可缩放且可靠,因此在物联网(IoT)方案中很受欢迎。 MQTT 代理支持通过 MQTT v3.1.1、MQTT v3.1.1、基于 WebSocket、MQTT v5 和 MQTT v5 通过 WebSocket 发布和订阅消息的客户端。 MQTT 代理还支持跨 MQTT 版本(MQTT 3.1.1 和 MQTT 5)的通信。
Azure 事件网格中的 MQTT 中转站还支持通过 HTTPS 发送 MQTT 消息的设备和服务,从而简化与非 MQTT 客户端的集成。 事件网格允许将 MQTT 消息发送到云以分析、存储和可视化数据,此外还支持其他用例。 此功能目前处于预览状态。
MQTT v5 在 MQTT v3.1.1 的基础上引入了许多改进,提供更加无缝、透明和高效的通信。 其中新增了:
- 更完善的 bug 报告。
- 通过用户属性和内容类型等功能与客户端进行更透明的通信。
- 客户端可以通过消息和会话过期等功能更好地控制通信。
- 请求-响应模式等重要标准模式。
连接流程
MQTT 客户端 必须 通过传输层安全性 (TLS) 1.2 或 TLS 1.3 进行连接。 尝试跳过此步骤会导致连接失败。
连接到 MQTT 代理时,在通过 MQTT 通信期间使用以下端口:
- 对于 MQTT v3.1.1 和 MQTT v5,请使用 TCP 端口 8883
- TCP 端口 443 上的基于 WebSocket 和 MQTT v5 的 MQTT v3.1.1
CONNECT 数据包应包含以下属性:
- 该
ClientId字段是必需的,它应包含客户端的会话名称。 该会话名称需在整个命名空间中唯一。 如果每个客户端使用一个会话,则你可以使用客户端身份验证名称作为会话名称。 如果一个客户端使用多个会话,则需要为每个ClientId会话使用不同的值。 - 如果在创建命名空间期间未选择值,
Username则需要alternativeAuthenticationNameSources该字段。 在这种情况下,需要在字段中提供客户端的身份验证名称Username。 该名称需要匹配提供的身份验证名称以及创建客户端资源期间指定的客户端证书字段中的值。
详细了解 客户端身份验证。
多会话支持
多会话支持使应用程序 MQTT 客户端能够同时连接到具有多个活动会话的 MQTT 中转站,实现更具可缩放性且更可靠的实现。
命名空间配置
在使用此功能之前,需要配置命名空间以允许每个客户端多个会话。 若要在 Azure 门户中为每个客户端配置多个会话,请执行以下步骤:
- 在 Azure 门户中转到你的命名空间。
- 在 “配置”下,将 每个身份验证名称的最大客户端会话 数更改为所需的每个客户端的会话数。
- 选择“应用”。
注意
对于 Azure CLI 配置,请使用所需的值更新 MaxClientSessionsPerAuthenticationName 命名空间有效负载中的属性。
连接流程
每个会话的 CONNECT 数据包应包含以下属性:
-
Username提供 CONNECT 数据包中的属性以表示客户端身份验证名称。 -
ClientID提供 CONNECT 数据包中的属性来表示会话名称,例如,如果每个用户名的客户端 ID 有一个或多个值。
例如,CONNECT 数据包中的以下组合UsernameClientId使客户端Mgmt-application可以通过三个独立的会话连接到 MQTT 中转站:
-
第一个会话:
-
Username:Mgmt-application -
ClientId:Mgmt-Session1
-
-
第二个会话:
-
Username:Mgmt-application -
ClientId:Mgmt-Session2
-
-
第三个会话:
-
Username:Mgmt-application -
ClientId:Mgmt-Session3
-
有关详细信息,请参阅 为单个客户端建立多个会话。
处理会话
- 如果某个客户端尝试通过使用不同的身份验证名称表示其会话名称来接管另一个客户端的活动会话,则其连接请求将被拒绝并出现未授权错误。 例如,如果客户端 B 尝试连接到当时为客户端 A 分配的会话 123 ,客户端 B 的连接请求将被拒绝。 但是,如果同一客户端尝试重新连接相同的会话名称和相同的身份验证名称,则可以接管其现有会话。
- 如果在未结束客户端资源会话的情况下删除该资源,则在会话过期之前,其他客户端将无法它的会话名称。 例如,如果客户端 B 创建会话名称 为 123 的会话,然后客户端 B 被删除,则客户端 A 在会话过期之前无法连接到会话 123 。
- 每个客户端的会话数限制适用于任何时间点的联机和脱机会话。 例如,请考虑每个身份验证名称设置为 1 的最大客户端会话的命名空间。 客户端 A 使用永久性会话 123 进行连接,然后断开连接。 客户端 A 无法连接到新会话 456 ,因为它的会话 123 仍然处于活动状态,即使它处于脱机状态也是如此。 因此,建议同一客户端始终使用相同的静态会话名称重新连接,而不是每次重新连接时生成新的会话名称。
MQTT 功能
事件网格 MQTT 代理支持以下 MQTT 功能。
服务质量
MQTT 中转站支持服务质量(QoS)级别 0 和 1,用于定义客户端与 MQTT 代理之间的 PUBLISH 和 SUBSCRIBE 数据包上的消息传送保证。
- QoS 0 保证最多一次传递:订阅者不确认具有 QoS 0 的消息,发布者不会重新传输它们。
- QoS 1 保证至少传递一次:订阅者会确认消息,如果消息未得到确认,发布者会重新传输它们。
QoS 使客户端能够控制通信的效率和可靠性。
持久会话
MQTT 中转站支持 MQTT v3.1.1 的持久会话,以便 MQTT 中转站在断开连接时保留有关客户端会话的信息,以确保通信的可靠性。 此信息包括客户端的订阅,以及错过或未确认的 QoS 1 消息。 客户端可以通过将
全新启动和会话过期
MQTT v5 引入了全新启动和会话过期功能,作为对 MQTT v3.1.1 在处理会话持久性方面的改进。 清理启动允许客户端在放弃任何以前的会话数据后,使用 MQTT 中转站启动新会话。 会话过期允许客户端在非活动会话被视为已过期并自动删除时通知 MQTT 代理。
在 CONNECT 数据包中,客户端可以将标志设置为 Clean Starttrue。 客户端还可以出于安全原因设置较短的会话到期间隔,或避免在上一个会话期间可能发生的任何潜在数据冲突。 客户端还可以将 Clean Start 标志 false 设置为或长时间会话过期间隔,以确保持久性会话的可靠性与效率。
最大会话过期间隔配置
可以为连接到事件网格命名空间的所有客户端配置允许的最大会话到期间隔。 对于 MQTT v3.1.1 客户端,配置的限制将应用为为所有持久会话的默认会话过期间隔。 对于 MQTT v5 客户端,配置的限制将作为 CONNECT 数据包中会话过期间隔属性的最大值应用。 调整超出限制的任何值。 此命名空间属性的默认值为 1 小时,最多可以扩展到 8 小时。 若要在 Azure 门户中配置最大会话到期间隔,请执行以下步骤:
- 在 Azure 门户中转到你的命名空间。
- 在 “配置”下,将 最大会话到期间隔的值(以小时为单位 )更改为所需的限制。
- 选择“应用”。
会话溢出
MQTT 中转站为未连接的每个活动 MQTT 会话维护消息队列,直到客户端再次与 MQTT 代理连接,以接收队列中的消息。 如果客户端未连接到接收排队的 QoS 1 消息,会话队列将累积消息,直到达到 100 条消息或 1 MB 的限制。 在会话的生命周期内队列达到其限制后,会话将终止。
最后的遗嘱和约消息
Last Will and Testament (LWT) 将通知你的 MQTT 客户端其他 MQTT 客户端突然断开连接。 可以使用 LWT 来确保在意外断开连接期间 MQTT 客户端之间可预测且可靠的通信流。 此功能对于实时通信、系统可靠性和协调作至关重要的方案非常有用。 协作执行复杂任务的客户端可以通过调整其行为、重新分发任务或接管某些职责来相互响应 LWT 消息,以保持系统的性能和稳定性。
若要使用 LWT,客户端可以在连接期间指定 Will 消息、Will 主题和 CONNECT 数据包中的其余 Will 属性。 当客户端突然断开连接时,MQTT 中转站会将 Will 消息发布到订阅 Will 主题的所有客户端。 为了减少由于断线波动引起的噪音,客户端可以将延迟间隔设置为大于零的值。 在这种情况下,如果客户端突然断开连接,但在延迟间隔到期之前还原连接,则不会发布 Will 消息。
用户属性
MQTT 中转站支持 MQTT v5 PUBLISH 数据包上的用户属性,这些数据包可用于在消息标头中添加自定义键/值对,以提供有关消息的更多上下文。 用户属性的用例丰富多样。 可以使用此功能包含消息的用途或来源,以便接收方无需分析有效负载即可处理消息,从而节省计算资源。 例如,具有用户属性的消息,指示其用途为“警告”的消息可能会触发与“信息”目的不同的处理逻辑。
“请求-响应”模式
MQTT v5 引入了 MQTT PUBLISH 数据包标头中的字段,这些字段为请求-响应模式中的响应消息提供上下文。 这些字段包括一个响应主题和一个相关 ID,响应方无需事先进行配置即可在响应中使用它们。 响应信息为命令和控制方案中使用的标准请求-响应模式启用更高效的通信。
消息过期间隔
在 MQTT v5 中,消息过期间隔允许消息具有可配置的有效期。 消息过期间隔定义为消息发布到 MQTT 中转站的时间与中转站需要放弃未传递消息的时间之间的时间间隔。 此功能适用于消息仅在一定时间内有效的情况,例如时间敏感命令、实时数据流式处理或安全警报。 通过设置消息过期间隔,MQTT 中转站可以自动删除过时的消息。 此步骤可确保只有相关信息可供订阅者使用。 如果消息的过期间隔设置为零,则表示该消息永不过期。
主题别名
在 MQTT v5 中,客户端可以通过主题别名,使用较短的别名来代替已发布消息中的完整主题名称。 MQTT 中转站维护主题别名与实际主题名称之间的映射。 此功能可以节省网络带宽并减小消息标头的大小,特别是对于名称较长的主题。 如果同一主题在多个消息中重复发布(例如在传感器网络中),则此功能非常有用。 MQTT 代理最多支持 10 个主题别名。 客户端可以使用 Topic Alias PUBLISH 数据包中的字段将完整主题名称替换为相应的别名。
流量控制
在 MQTT v5 中,流控制是指用于管理客户端可处理的消息速率和大小的机制。 若要配置流控制,请在 CONNECT 数据包中设置 Maximum Packet Size 和 Receive Maximum 参数。 该 Receive Maximum 参数允许客户端将中转站发送的消息数限制为客户端可以处理的消息数。 该 Maximum Packet Size 参数定义客户端可以接收的最大数据包大小。 MQTT 代理的消息大小限制为 512 KiB。 此功能可确保受约束设备的通信的可靠性与稳定性,且处理速度或存储功能有限。
否定确认和服务器发起的断开连接数据包
对于 MQTT v5,MQTT 代理可以发送负确认和服务器发起的断开连接数据包,这些数据包为客户端提供有关消息传递或连接失败的详细信息。 这些功能可帮助客户端诊断故障原因并采取适当的缓解措施。 MQTT 代理使用 MQTT v5 规范中定义的原因代码。
消息排序
MQTT v5 确保在使用 QoS 级别 1 时在每个主题和每个客户端内按顺序传递消息,这对于需要序列完整性的工作流至关重要。 它非常适合遥测、命令执行和时序数据等方案。
但是,它不能保证跨不同主题或在使用不同的 QoS 级别发送消息时进行排序。 若要了解详细信息,请通过以下位置 askmqtt@microsoft.com联系我们。
分配的客户端标识符
MQTT v5 引入了对分配的客户端标识符的支持,这允许 MQTT 中转站在客户端不提供客户端时生成并返回唯一的客户端 ID。 MQTT 中转站对此功能的支持可确保无缝客户端载入,并减少客户端管理其自己的标识符的需求。 在客户端预配是动态的,或者当设备没有预配置标识时,它特别有用。 可以从 CONNACK 响应中检索已分配的客户端 ID,并重复使用这些 ID 供将来的会话使用,以保持一致的标识。
在 MQTT 中管理客户端标识符和会话限制
- 分配的客户端标识符允许客户端在不指定预定义标识符的情况下进行连接,从而启用临时会话或永久性会话。
- 客户可以通过在首次连接时使用短的会话过期间隔来避免被锁定,并保存分配的客户端标识符以供将来使用。
- 对于固件更新或重置,客户端应保留其已知的客户端标识符,或使用适度的会话过期间隔来避免长时间锁定。
- 命名空间配置可以增加每个客户端的会话限制,以最大程度地减少更新或回滚期间的中断。
当前限制
MQTT 中转站将在未来添加更多的 MQTT v5 和 MQTT v3.1.1 功能,以便与 MQTT 规范保持一致。 以下列表详细介绍了 MQTT 中转站和 MQTT 规范支持的功能之间的当前差异。
MQTT v5 当前限制
MQTT v5 目前与 MQTT v5 规范 的区别如下:
- 尚不支持共享订阅。
- 最大延迟间隔为 300。
- 最大 QoS 为 1。
- 最大数据包大小为 512 KiB。
- 不支持订阅标识符。
- 主题别名最大值为 10。 服务器目前不会为传出消息分配任何主题别名。 客户端可以在设置限制内分配和使用主题别名。
- 即使 CONNECT 请求包含
Response Information该属性,CONNACK 也不会返回Request Response Information该属性。 - 服务不使用 CONNECT、SUBSCRIBE、DISCONNECT、PUBACK 和 AUTH 数据包上的用户属性,因此它们不受支持。 如果其中任一请求包括用户属性,则请求将失败。
- 如果服务器收到来自客户端的 PUBACK 数据包,且响应代码为 nonsuccess,则连接将终止。
- 保持活动最大为 1,160 秒。
MQTTv3.1.1 的当前限制
MQTT v5 目前在以下方面与 MQTT v3.1.1 规范 不同:
- 不支持 QoS 2。 具有
RETAIN标志或 QoS 2 的发布请求失败并关闭连接。 - 保持活动最大为 1,160 秒。
代码示例
此存储库 包含 C#、C 和 Python 代码示例,演示如何发送遥测、发送命令和广播警报。 通过示例创建的证书适合用于测试,但不适合用于生产环境。
相关内容
若要了解有关 MQTT 的详细信息,请参阅 MQTT v5 规范。 若要了解有关 MQTT 代理的详细信息,请参阅: