MQTT的构成、使用场景、工作原理介绍

发布于:2025-04-12 ⋅ 阅读:(36) ⋅ 点赞:(0)

一、MQTT内容简介

        MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境】它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。

MQTT相关内容简介
序号 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:基础知识和实用教程 | EMQhttps://www.emqx.com/zh/blog/the-easiest-guide-to-getting-started-with-mqttMQTT 客户端库 & SDK 大全 | EMQhttps://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)确保端到端消息传递的可靠性

MQTT的主题与通配符说明
序号 通配符类型 说明
1 +

单层通配符,用于单个主题层级匹配【使用单层通配符时,单层通配符必须占据整个层级】

+        有效

sensor/+        有效

sansor/+/temperature        有效

sansor+        无效(没有占据整个层级)
# 如客户端订阅了 sensor/+/temperature,则会接收到如下主题的消息:
sensor/1/temperature
sensor/2/temperature
sensor/3/temperature
...
sensor/n/temperature



# 但是不会匹配如下主题
sensor/temperature
sensor/bedroom/1/temperature
2 #

多层通配符,用于匹配主题中任意层级;表示它的父级和任意数量的子层级【使用多层通配符必须占据整个层级且必须是主题的最后一个字符

#        有效

sensor/#        有效

sensor/bedroom#        无效(没有占据整个层级)

sensor/#/temperature        无效(不是主题的最后一个字符)
# 若客户端订阅主题 senser/#,则会收到以下主题的消息
sensor
sensor/bedroom
sensor/bedroom/1
sensor/bedroom/1/temperature
3 $

以$SYS/开头的主题为系统主题,主要用于获取MQTT Broker服务器自身的状态、消息统计、客户端上下线事件等数据

# 如EMQX Broker服务器的主题集群状态有:
$SYS/#                                  获取到系统的所有主题消息
$SYS/brokers                            EMQX集群节点列表
$SYS/brokers/emqx@127.0.0.1/version     EMQX 版本
$SYS/brokers/emqx@127.0.0.1/uptime      EMQX 运行时间
$SYS/brokers/emqx@127.0.0.1/datetime    EMQX 系统时间
$SYS/brokers/emqx@127.0.0.1/sysdescr    EMQX 系统信息
4 $share

共享订阅,是多个订阅者之间实现负载均衡的订阅方式【原理是:在原有主题的基础上添加 $share 前缀即可为一组订阅端启用共享订阅】

#EMQX Broker服务器支持如下两种格式的共享订阅前缀

1、格式:$share/任意组名称/topic【若多个订阅者订阅该共享主题,
那么多个订阅者之间会实现负载均衡的订阅方式获取到消息】

 示例1:$share/g/test      前缀是:$share/g/    真实主题是:test
 示例2:$share/g/test/1    前缀是:$share/g/    真实主题是:test/1


2、格式:$share/任意组名称/topic【若多个订阅者订阅一个共享主题的组、
又有多个订阅者订阅另一个共享主题组,则共享主题组内的订阅者以负载均衡的方式接收消息,
而两个不同组名的共享主题组都会接收到同一个主题消息】

 示例1:$share/g1/test  有s1,s2,s3订阅该共享组  
  会有s1,s2,s3中任意一个接收到test主题消息

 示例1:$share/g2/test  有s4,s5订阅该共享组
  会有s4,s5中任意一个接收到test主题消息

注意:主题的通配符只能用于订阅,不能用于发布

        关于共享订阅的负载均衡策略可以在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的三种服务质量说明
序号 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的安全认证

        MQTT在物联网应用中占有重要地位(涉及处理各种实时敏感数据)若缺乏防护,则会被攻击者利用漏洞拦截消息、篡改数据或破坏关键系统,甚至造成严重损害,为确保MQTT的安全性,通常采用如下方式来提升安全性:

六、MQTT数据存储

        MQTT Broker 服务器本身并不具备数据存储功能。因此,必须将其与适当的数据库解决方案集成,才能有效管理和利用这些数据。选择合适的数据库不仅能优化数据存储效率,还能提升物联网应用的扩展性(用于后续数据的分析,体现商业价值)。请参考《MQTT 数据库选型指南


网站公告

今日签到

点亮在社区的每一天
去签到