【MQTT】MQTT协议和相关概念介绍

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰:

本文未经允许,不得转发!!!


在这里插入图片描述

在这里插入图片描述

🎄一、概述

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/1sensor/+/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是 发送方接收方 之间达成的协议,而不是PublisherSubscriber之间达成的协议。

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协议入门

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传递协议,用于不同设备之间的通信。MQTT 3.1.1是MQTT的版本号,是比较常用的版本。 MQTT 3.1.1协议具有以下特点和优势: 1. 轻量级:MQTT采用一种非常轻巧的封装格式,使得它非常适合在网络带宽较低或者资源受限的环境下使用,如物联网设备中。 2. 简单易用:MQTT协议的设计非常简单,只有3个主要角色:发布者(Publisher)、订阅者(Subscriber)和代理服务器(Broker)。这种简单的架构使得开发者可以轻松地实现MQTT通信。 3. 异步通信:MQTT允许发布者和订阅者之间进行异步通信。发布者只需要将消息发布到代理服务器上,订阅者则可以在需要的时候订阅到消息。这种异步通信的特性可以提高通信的效率和可扩展性。 4. 可靠性:MQTT 3.1.1协议提供了多种传输层的质量保证服务,如最多一次、至少一次和只有一次的传输保证。根据应用场景的不同,可以选择适当的服务质量。 5. 安全性:MQTT 3.1.1协议支持SSL/TLS加密和鉴权机制,确保通信的安全性。通过这些安全机制,可以对消息进行加密传输,同时也可以对客户端进行身份验证。 总而言之,MQTT 3.1.1协议是一种适用于物联网设备的轻量级、简单易用、可靠和安全的通信协议。它的设计目标是在网络带宽有限和资源受限的条件下,实现可靠的异步通信。在物联网领域,MQTT 3.1.1广泛应用于各种场景,如传感器数据的采集、智能家居的控制等。 ### 回答2: MQTT 3.1.1协议是一种轻量级的通信协议,主要用于物联网和小型设备之间的通信。 MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅的模式的消息协议,具有低带宽、低数据包开销和低延迟的特点。它使用TCP/IP协议进行通信,并支持多种可靠性的服务质量等级。 MQTT 3.1.1协议定义了客户端与服务器之间的消息传输格式和规则。客户端可以是任何设备或应用程序,服务器则负责接收、转发和传送消息。 MQTT 3.1.1协议使用发布/订阅模式进行通信。客户端可以发布消息到特定的主题(topic),而其他客户端可以通过订阅相应的主题来接收消息。通过定义主题层次结构,可以实现灵活的消息过滤和分发。 协议中还定义了三个服务质量等级(QoS):0级为“至多一次”,消息会至少传输一次,但可能会重复或丢失;1级为“至少一次”,消息会至少传输一次,但可以重复;2级为“恰好一次”,消息会确保只传输一次。 此外,MQTT 3.1.1协议还支持保留消息和遗嘱消息的功能。保留消息是指发布到特定主题的消息会被保留在服务器上,新的订阅者可以接收到最新的保留消息。而遗嘱消息是当客户端断开连接时,服务器会代替客户端发布一个预先定义的消息,用于通知其他订阅者。 总的来说,MQTT 3.1.1协议提供了一种高效、灵活和可靠的通信机制,特别适用于物联网场景。它的低带宽和低功耗特性使其成为物联网设备之间通信的理想选择。 ### 回答3: MQTT(Message Queuing Telemetry Transport)是一种轻量级发布/订阅协议,用于在物联网设备之间传输消息。MQTT 3.1.1是MQTT协议的一个版本。 MQTT 3.1.1协议增强了先前版本的功能和性能。它主要包含以下几个方面的改进: 1. 会话状态:MQTT 3.1.1引入了会话状态的概念,使得设备可以保存和恢复连接状态。这意味着设备断开连接后,可以通过恢复会话状态来继续传输消息。 2. 心跳机制:MQTT 3.1.1中添加了心跳机制,用于检测设备是否在线。通过在连接期间定期发送心跳包,可以及时检测设备的连接状态。如果设备长时间未发送心跳包,服务器就可以判断设备已经离线,并采取相应的措施。 3. 遗愿消息:MQTT 3.1.1允许设备在断开连接时发送遗愿消息。遗愿消息是设备事先配置好的消息,当设备异常断开连接时,服务器会自动发布这些消息给其他订阅者。 4. 主题过滤器:MQTT 3.1.1支持更灵活的主题过滤器,可以通过通配符匹配多个主题。这使得订阅者可以更方便地订阅特定类型的消息。 5. 安全性:MQTT 3.1.1支持SSL/TLS加密传输,保护消息的安全性。设备和服务器可以使用用户名和密码进行身份验证,确保只有授权的设备才能连接和发布消息。 总的来说,MQTT 3.1.1协议在原有的基础上增加了一些重要的功能和改进,使得物联网设备之间的通信更加可靠和灵活。它被广泛应用于物联网领域,提供了一种高效、轻量级的消息传输解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wkd_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值