一、MQTT内容简介
MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议【适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境】它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。
序号 | MQTT组成内容 | 说明 |
1 | MQTT Broker | 1、负责管理客户端请求内容(建立连接、断开连接、消息订阅、取消、转发等操作)的关键组件,可轻松应对海量连接与百万级消息吞吐量。 2、常用到的MQTT Broker服务端有如下四种: EMQX是一款开源的大规模分布式物联网MQTT服务器,能够以亚毫米级的延迟在一秒钟内处理百万级的MQTT消息。 Mosquitto是一款开源的MQTT服务器,体积小巧,即可运行在低功耗单板计算机上,也可部署在企业级服务器上,采用C语言编写,支持多种平台。 NanoMQ是一款位物联网边缘设计的轻量级MQTT服务器,以纯C语言编写,在独立的Broker环境中有较高性能,优势在于多平台的可移植性。 VerneMQ是采用Erlang/OTP开发的MQTT服务器,使用Apache2.0开源协议,支持将MQTT消息持久化到LevelDB中。 |
2 | MQTT 客户端 | 1、任何运行MQTT客户端库的应用与设备都是MQTT客户端(如:使用MQTT上报数据的各种传感器、使用MQTT进行通讯的程序应用、各种MQTT测试工具) 2、常用到的MQTT客户端有如下五种: MQTTX是开源跨平台的MQTT5.0桌面客户端; MQTTX Web是开源的MQTT5.0浏览器客户端,可直接在线使用; MQTTX CLI是开源、功能强大、易用的MQTT5.0客户端工具; NanoMQ是用于物联网边缘的超轻量MQTT服务器,也包含MQTT测试客户端与MQTT协议性能测试工具bench。 EasyMQTT仅适用于苹果设备的MQTT客户端; |
emqx/README-CN.md at master · emqx/emqx · GitHubhttps://github.com/emqx/emqx/blob/master/README-CN.mdMQTT 协议快速入门 2025:基础知识和实用教程 | EMQ
https://www.emqx.com/zh/blog/the-easiest-guide-to-getting-started-with-mqttMQTT 客户端库 & SDK 大全 | EMQ
https://www.emqx.com/zh/mqtt-client-sdkMQTTX:全功能 MQTT 客户端工具MQTTX 是一款强大的全功能 MQTT 5.0 客户端工具,适用于桌面、命令行和 WebSocket。它使得开发和测试 MQTT 应用更加简单高效。
https://mqttx.app/zh
博客 - 车联网 | EMQEMQ 博客包含了 MQTT 协议、MQTT 客户端使用指南,EMQX 产品技术指南,EMQX 产品最佳实践,以及物联网行业解决方案。 - 车联网https://www.emqx.com/zh/blog/category/internet-of-vehicles
# EMQX Broker服务器的默认端口内容
EMQX Broker服务器Web管理界面的端口是:18083
TCP端口:1883
WebSocket端口:8083
SSL/TLS端口:8883
Secure WebSocket端口:8084
#EMQX的默认账号密码是
账号:admin
密码:public
二、MQTT工作原理
MQTT基于【发布-订阅模式】的通信协议,由MQTT客户端使用主题(Topic)进行消息的发布或订阅;通过MQTT Broker集中管理消息路由,并依据预设的服务质量等级(Qos)确保端到端消息传递的可靠性。
序号 | 通配符类型 | 说明 |
1 | + | 单层通配符,用于单个主题层级匹配【使用单层通配符时,单层通配符必须占据整个层级】 |
2 | # | 多层通配符,用于匹配主题中任意层级;表示它的父级和任意数量的子层级【使用多层通配符必须占据整个层级且必须是主题的最后一个字符】 |
3 | $ | 以$SYS/开头的主题为系统主题,主要用于获取MQTT Broker服务器自身的状态、消息统计、客户端上下线事件等数据 |
4 | $share | 共享订阅,是多个订阅者之间实现负载均衡的订阅方式【原理是:在原有主题的基础上添加 $share 前缀即可为一组订阅端启用共享订阅】 |
注意:主题的通配符只能用于订阅,不能用于发布 |
关于共享订阅的负载均衡策略可以在EMQX Broker服务器的配置文件(emqx.conf)修改,查找EMQX Broker服务器的配置文件操作如下,
# Linux查找EMQX Broker的配置文件所在路径命令
find / -name emqx.conf
其中
全局策略可在配置文件的【broker.shared_subscription_strategy】配置;
局部的组策略可在配置文件的【broker.shared_subscription_group.$group_name.strategy】配置
序号 | 共享订阅主题负载均衡策略 | 说明 |
1 | random | 在所有订阅者中随机选择 |
2 | round_robin | 按照订阅顺序选择 |
3 | round_robin_per_group | 在每个共享订阅组中按照订阅顺序进行选择 |
4 | local | 随机在本地订阅中进行选择,如无法找到,则在集群范围内随机选择 |
5 | sticky | 选定订阅者后,始终向其进行发送,直到该订阅者断开连接 |
6 | hash_clientid | 通过对发送者的客户端 ID 进行 Hash 处理来选择订阅者 |
7 | hash_topic | 通过对源主题进行 Hash 处理来选择订阅者 |
# 均衡策略
broker.shared_subscription_strategy = random
# 当设备离线,或者消息等级为 QoS1、QoS2,因各种各样原因设备没有回复 ACK 确认,消息会被重新派发至群组内其他的设备。
broker.shared_dispatch_ack_enabled = false
三、MQTT工作流程与服务质量
3.1、MQTT的一般工作流程
《1》客户端使用TCP/IP协议与MQTT Broker服务器建立连接(也可选择TLS/SSL加密来实现安全通信)客户端提供对应的认证信息,且指定会话类型(Clean Session【清除会话】或Persistent Session【持久会话】);
《2》客户端可以向特定的主题发布消息,也可以订阅主题以接收消息。当客户端发布消息时,它是将消息发送给MQTT Broker服务器;而当客户端订阅主题消息时,它会连接到MQTT Broker服务器接收到与订阅主题相关的消息。
《3》MQTT Broker服务器接收客户端发布的消息,然后再将消息转发给订阅了对应主题的客户端。消息的发布与订阅根据设定的服务质量(Qos)等级确保消息可靠传递,并根据会话类型为断开连接的客户端存储消息。
3.2、MQTT的三种服务质量
MQTT的三种服务质量,只要是用在不同网络环境下保证消息传递的可靠性,可根据项目实际情况选择。
序号 | MQTT的质量类型 | 说明 |
1 | Qos 0 At most once | 消息【最多传递一次】如果客户端不可用,则丢失这条消息 (消息即发即弃,不需要等待确认,不需要存储重传,接收方永远不担心收到重复消息) |
2 | Qos 1 At least once | 消息【至少传递一次】可以保证收到消息,但消息可能会重复 (为保证消息可达,Qos1加入了应答与重传机制,发送方只有在收到接收方的puback报文后,才会确认消息投递成功;在消息确认投递成功前,发送方都需要存储该publis报文以便重传) |
3 | Qos 2 Exactly once | 消息【只传送一次】可以保证消息不丢失也不重复 (需要解决消息可达与重复问题,相应地带来了最复杂的交互流程与最高开销,没一次Qos2消息传递,都要求发送方与接收方进行至少两次请求/响应流程) |
注意:Oos等级从低到高,不仅意味着消息传递可靠性提升,也意味着传输复杂度的提升 |
3.3、MQTT的遗嘱消息
遗嘱消息是 MQTT 协议中的一个重要功能,它解决了只有服务端才能知道客户端是否在线的问题,使我们能够为意外离线的客户端优雅地完成善后事宜(即:在 MQTT 中,客户端可以在连接时在服务端中注册一个遗嘱消息,与普通消息类似,我们可以设置遗嘱消息的主题、有效载荷等等。当该客户端意外断开连接,服务端就会向其他订阅了相应主题的客户端发送此遗嘱消息。这些接收者也因此可以及时地采取行动,例如向用户发送通知、切换备用设备等等)。
关于遗嘱消息的介绍与使用方法请查看《遗嘱消息(Will Message)介绍与示例 | MQTT 5.0 特性详解 | EMQ》
四、MQTT协议与其他协议对比
- MQTT vs HTTP
- MQTT vs WebSocket
- MQTT vs CoAP
- MQTT vs AMQP
五、MQTT的安全认证
MQTT在物联网应用中占有重要地位(涉及处理各种实时敏感数据)若缺乏防护,则会被攻击者利用漏洞拦截消息、篡改数据或破坏关键系统,甚至造成严重损害,为确保MQTT的安全性,通常采用如下方式来提升安全性:
- 认证
- 用户名/密码认证
- SCRAM 增强认证
- 其他认证方法
- 授权
- 流量控制
- TLS/SSL
六、MQTT数据存储
MQTT Broker 服务器本身并不具备数据存储功能。因此,必须将其与适当的数据库解决方案集成,才能有效管理和利用这些数据。选择合适的数据库不仅能优化数据存储效率,还能提升物联网应用的扩展性(用于后续数据的分析,体现商业价值)。请参考《MQTT 数据库选型指南》