😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰:
本文未经允许,不得转发!!!
目录
- 🎄一、概述
- 🎄二、MQTT工作原理及术语
- 🎄三、MQTT的 QoS、Keepalive、Retained、LWT
- ✨3.1 QoS
- ✨3.2 Keepalive
- ✨3.3 Retained消息
- ✨3.1 LWT(遗言)
- 🎄四、MQTT的工具和开源库
- ✨4.1 MQTT Broker 相关工具、开源库
- ✨4.2 MQTT 客户端 相关工具、开源库
- 🎄五、总结
🎄一、概述
MQTT
,全称是 Message Queuing Telemetry Transport
(消息队列遥测传输协议),是一种轻量级的发布/订阅消息传输协议,最初由IBM和Arcom(后来成为Eurotech的一部分)在1998年左右创建。MQTT是OASIS标准。最新版本是5.0,有多种格式可供选择。MQTT 3.1.1
也是一个ISO标准(ISO/IEC 20922)。
MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网(IoT)、小型设备、移动应用等方面有较广泛的应用。
关于MQTT的更多资料可以到其官网查看:https://mqtt.org/
也可以参考 MQTT中文网。
MQTT的特点:
- 开放消息协议,简单易实现
- 轻量级、占用带宽低(1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。)
- 发布/订阅模式,一对多消息发布;
- 基于TCP/IP网络连接,提供有序,无损,双向连接;
- 消息QoS(Quality of Service)支持,可靠传输保证(至多一次、最少一次、只有一次);
- 可传输任意类型的数据
- 收发消息都是异步的,发送方不需要等待接收方应答;
🎄二、MQTT工作原理及术语
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publisher)、代理(Broker)、订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,消息代理(Broker)是服务器,消息发布者可以同时是订阅者。
- MQTT 客户端:任何运行 MQTT 客户端库的应用或设备都是 MQTT 客户端,消息的发布者和订阅者都是客户端。例如,使用 MQTT 的即时通讯应用是客户端,使用 MQTT 上报数据的各种传感器是客户端,各种 MQTT 测试工具也是客户端。
- MQTT 代理(Broker):MQTT Broker 是负责处理客户端请求的关键组件,包括建立连接、断开连接、订阅和取消订阅等操作,同时还负责消息的转发。一个高效强大的 MQTT Broker 能够轻松应对海量连接和百万级消息吞吐量,从而帮助物联网服务提供商专注于业务发展,快速构建可靠的 MQTT 应用。
- 发布/订阅模式:发布/订阅模式 与 客户端/服务器模式 的不同之处在于,它将发送消息的客户端(发布者)和接收消息的客户端(订阅者)进行了解耦。发布者和订阅者之间无需建立直接连接,而是通过 MQTT Broker 来负责消息的路由和分发。
1、发布方和订阅方都建立了到Broker的TCP连接;
2、订阅方告知Broker它要订阅的Topic;
3、发布方将消息发送到Broker,并指定消息主题(Topic);
4、Broker接收到消息后,检测哪些订阅方订阅了对应的Topic,然后将消息发送到订阅方;
5、订阅方从Broker获取消息;
6、如果某个订阅方处于离线状态,Broker可以先保存对应的消息,当订阅方下次连接到Broker的时候,再将之前的消息发送给订阅方; - 订阅(Subscription):订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
- 会话(Session):每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
- 主题(Topic):MQTT 消息的标签,MQTT 协议根据主题来转发消息。主题通过
/
来区分层级,类似于 URL 路径,例如:chat/room/1
、sensor/+/temperature
;
MQTT 主题支持以下两种通配符:+ 和 #。通配符主题只能用于订阅,不能用于发布。
+:表示单层通配符,例如 a/+ 匹配 a/x 或 a/y。
#:表示多层通配符,例如 a/# 匹配 a/x、a/b/c/d。 - 负载(Payload):消息订阅者所具体接收的内容。
🎄三、MQTT的 QoS、Keepalive、Retained、LWT
✨3.1 QoS
QoS,全称是Quality of Service(服务质量)。
MQTT协议设计初衷是提供一套保证消息稳定传输的机制,用于网络带宽窄,信号不稳定环境下的数据传输,这套机制包括消息应答,存储和重传。在这套机制下提供了三种不同层次的QoS(Quality of Service),QoS是 发送方
和 接收方
之间达成的协议,而不是Publisher
和Subscriber
之间达成的协议。
MQTT有以下三种QoS:
- QoS 0:消息最多传送一次。如果当前客户端不可用,它将丢失这条消息。
- QoS 1:消息至少传送一次。
- QoS 2:消息只传送一次。
关于QoS的实现可以参考文章:
MQTT协议QoS2 准确一次送达的实现
MQTT协议零基础快速入门
✨3.2 Keepalive
在实际使用MQTT协议时,无论是Broker还是Client都需要及时感知到MQTT是否断开;MQTT是基于TCP协议的应用层协议,理论上TCP断开时会通知上层应用,但是TCP协议有个半打开连接的问题,这种状态下,一段的TCP连接已经失效,但是另一端并不知情,需要很长时间才能感知到对端连接已经断开;因此仅仅依赖TCP层的连接状态监测是不够的,于是MQTT设计了一套keepalive机制,
MQTT协议约定:在1.5*keepalive
时间间隔内,如果Broker没有收到来自Client的任何数据包,Broker就认为和Client的连接断开;同理Client在这个时间间隔内没有收到Broker的任何数据包,Client也会认为他和Broker的连接断开;
MQTT协议设计了一对PINGREQ/PINGRESP
数据包,当Broker和Client之间没有任何数据交互时,可以通过这对数据包满足keepalive
的约定和网络状态监测;
keepalive特性
- 如果一个Keepalive时间间隔内,Client和Broker有过数据包传输,Client就没有必要再使用PINGREQ数据包了;
- Keepalive的值时有Client在发送CONNECT数据包时指定,不同的Client可以指定不同的值;
- Keepalive的最大值是18时12分15秒
- Keepalive 的值为0时代表不使用Keepalive机制
✨3.3 Retained消息
会有这样一种场景,Publisher发布了一个消息后,Subscriber订阅了这个主题,那么这个 Subscriber就不会收到在它订阅之前Publisher发布的消息。
Retained消息就是为了解决这个问题,Retained消息是指在PUBLISH数据包中将Retained标识设为1的消息,Broker收到这样的PUBLISH数据包后,将会为该主题保存这个消息,当一个新的订阅者订阅该主题时,Broker会将这个消息发送给订阅者。
Retained消息特点
- 一个Topic只有一个Retained消息,发布新的Retained消息将覆盖旧的Retained消息;
- 如果订阅者使用通配符订阅主题,会收到所有匹配主题的Retained消息;
- 只有新的订阅者会收到Retained消息,如果订阅者重复订阅一个主题,会被当做新的订阅者收到Retained消息;
- 向主题发布一个payload长度为0的Retained消息就可以删除这个主题的Retained消息;
✨3.1 LWT(遗言)
LWT全称为Last Will and Testament
(遗言),包括遗言主题,遗言QoS,遗言消息等,具体见MQTT协议,遗言具有以下特点:
- 遗言的相关设置是建立连接时,在CONNECT数据包里面指定的;
- 遗言用于非正常断开连接的情况,当Broker检测到Client非正常的断开连接时,就会向Client的遗愿主题发布一条消息;
- Client发布DISCONNECT数据包断开连接,属于正常断开,不会触发LWT机制,而且Broker会丢掉Client连接时指定的LWT参数
🎄四、MQTT的工具和开源库
✨4.1 MQTT Broker 相关工具、开源库
MQTT Broker 是MQTT协议的核心,主要作用是接收发布者的消息,然后转发给对应的订阅者。Broker可以对Clinet接入进行授权,并对Client进行权限控制。
常用的C语言编写的 MQTT Broker 开源库有Mosquitto,其Github路径:https://github.com/eclipse/mosquitto
更多MQTT Broker 开源库可以查看:https://github.com/mqtt/mqtt.github.io/wiki/servers。
如果学习MQTT需要Broker环境,可以通过这些开源库自建,也可以用各大云平台提供的Broker服务,如阿里云、腾讯云。
✨4.2 MQTT 客户端 相关工具、开源库
MQTT客户端工具:paho.mqtt-spy,其Github路径:https://github.com/eclipse/paho.mqtt-spy
实现MQTT客户端的开源库:
C语言编程的可以选择:paho.mqtt.c,其Github路径:https://github.com/eclipse/paho.mqtt.c
C++编程的可以选择:paho.mqtt.cpp,其Github路径:https://github.com/eclipse/paho.mqtt.cpp
🎄五、总结
👉本文介绍了MQTT是什么,然后介绍MQTT的工作原理及术语:MQTT客户端、MQTT Broker、订阅/发布模式等。
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁
参考:
MQTT 协议入门:轻松上手,快速掌握核心要点
MQTT入门详解
MQTT协议入门