一、MQTT基本概念
简而言之,MQTT是一种可以帮助我们在客户端和服务器实现发布/订阅的轻量级协议,为什么说是轻量级呢?无可厚非就是因为它可以用比较少的代码和有限的带宽为我们提供可靠有效的消息服务,这也正是MQTT的优点所在,
完整的MQTT协议包括两部分,MQTT Client(客户端)和MQTT Server(服务器),其中MQTT Server 也就是Broker;
二、MQTT协议特点
MQTT是一种基于客户端—服务器的消息发布/传输协议,是轻量、简单、开放和易于实现的,这些特点使它使用范围非常广泛,MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。
MQTT协议是运行在TCP/IP或其他网络协议,提供有序、无损、双向连接。
特点:
-
使用的发布/订阅消息模式,它提供了一对多消息分布,以实现与应用的解耦。
类似于XMPP,但是MQTT的信息沉余远小于XMPP,因为XMPP使用XML格式文本来传递数据。 -
对负载内容屏蔽的消息传输。使用TCP/IP提供网络连接。
主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN,这两种版本由于基于不同的连接方式,优缺点不同; -
小型传输,开销很小,协议交换最小化,以降低网络流量。
-
使用Last Will和Testment特性通知有关各方客户端异常中断的机制;
Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。
Testment: 遗嘱机制,功能类似于Last Will.
三、MQTT协议原理
1.MQTT协议实现方式
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议有三种身份:发布者、代理(服务器)、订阅者。其中,消息发布者和订阅者都是客户端,消息代理是服务器,消息发布者也可以同时是订阅者。
MQTT传输的消息分为:主题(topic)he 负载(payload)两部分:
- Topic:消息的类型,订阅者订阅之后,就会收到该主题的消息内容,;
- payload:消息的内容,是指订阅者具体要使用的内容。
2.网络传输与应用消息
MQTT会构建底层网络传输,它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输。当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关联。
3.MQTT客户端
一个使用MQTT协议的应用程序或者设备,他总是建立到服务器的网络连接,客户端可以做以下几件事情:
- 发布其他客户端可能会订阅的消息;
- 订阅其他客户端发布的消息;
- 退订或删除应用程序的消息;
- 断开与服务器的连接。
4MQTT服务器
MQTT服务器称为“消息代理”,可以是一个应用程序或一台设备,它是位于消息发布者和订阅者之间,它可以做以下几件事情:
- 接受来自客户的网络连接;
- 接受来自客户发布的应用信息;‘
- 处理来自客户端的订阅和退订请求;
- 向订阅的客户转发应用程序消息。
5MQTT协议中的订阅、主题、会话
5.1订阅(Subscription)
订阅包含主题筛选器和最大服务质量。订阅会与一个会话关联,一个会话可以包含多个订阅,每个会话中的每个订阅都有一个不同的主题筛选器。
5.2会话(Session)
每个客户端与服务器之间建立连接后就是一个会话,客户端和服务器之间有状态交互,会话存在与一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
5.3主题名(Topic Name)
连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。
5.4主题筛选器(Topic Filter)
一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
5.5负载(Payload)
消息订阅者所具体接收的内容。
6.MQTT协议中的控制报文
MQTT协议中定义了一些方法,即控制报文,来与表示对确定资源所进行操作,这个资源可以代表预先存在的数据或动态生成数据,者取决于服务器的实现。通常来说,资源指服务器上的文件或输出,主要方法有以下几种:
四、MQTT协议数据包结构
在MQTT协议中,MQTT协议使用二进制数据包,一个MQTT数据包由:固定头、可变头、消息体三部分构成结构如下::
- 固定头(fixed header):存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。长度为2-5字节,包括三部分内容:数据包类型(4bit)、标识位(4bit)、数据包剩余长度大小1byte),
数据包剩余长度大小包含可变头和消息体长度,剩余长度可用1~4byte,(最大位256MB),有些数据包并没有可变头和消息体, - 可变头(variable header):存在于部分MQTT数据包中,数据类型决定了可变头是否存在及其具体内容。
- 消息体(payload):存在于部分MQTT数据包中,标识客户端收到的具体内容。
五、MQTT设计规范
由于物联网的环境是非常特别的,所有MQTT遵循以下设计原则:
- 精简,不添加可有可无的功能;
- 发布/订阅模式,方便消息在传感器之间传递;
- 允许用户动态创建主题,0运维成本;
- 把传输量降到最低以提高传输效率;
- 把低带宽、高延迟、不稳定的网络等因素考虑在内;
- 支持连续的会话控制;
- 理解客户端计算能力可能很低;
- 提高服务质量管理;
- 假设数据不可知,不强求传输数据的类型和格式,保持灵活性。
QoS
Client在可以发布和订阅消息之前,必须先连接到Broker,这个连接不仅仅是建立TCP连接,也包括应用层建立连接,
在mqtt协议机制下提供了三种不同层次的服务质量(QoS),它是用于sender(发送者)和receiver(接收者)之间达成的协议,而不是publisher和broker之间达成的协议:
- MQTT有三种消息发布服务质量(QoS):
QoS=0 “至多一次”消息发布完全依赖TCP/IP网络:
这是最简单的一个消息质量服务等级,sender向receiver发送含消息数据的PUBLISH数据包,这个过程只发生一次,也就是说receiver只接收到一次:
QoS=1“至少一次”确保消息送达,但消息重复可能会发生:
至少一次是引文对QoS增加了应答机制,Sender向Receiver发送一个带有消息数据的PUBLISH数据包,并且保存至本地,Receiver收到后会返回一个PUBACK数据包,PUBACK数据包的可变头中有一个和PUBLISH数据包相同的包标识,Sender收到PUBACK后根据包标识(Packet Identifier)找到本地保存的数据包并丢弃,发送完成;如果receiver没有收到数据包,就会对sender发出信号,即把PUBLISH数据包中的DUP标识设置为1(代表重新发送)并重复循环直到接收到数据包:
QoO=2“只有一次”确保消息到达一次,在一些要求比较严格的计费系统中,可以使用此级别:
基于前两者在发送和接收的过程中涉及到发不出去、重复发送等问题,对于消息发布还是要做到严谨准确的,所以QoS=2是结合前两者的缺点,不仅要保证sender成功发送,receiver成功接收,还要保证发送不能重复,所以它的重传和应答机制更加复杂,这也是一种开销最大、速度最慢、最安全的机制:
参考博客:https://blog.csdn.net/c12345423/article/details/114055192?