一、MQTT协议诞生背景
到了物联网时代,由于智能硬件的差异,相比互联网终端,硬件配置要低的多,而且智能设备的环境也想多复杂,物联
网中的数据传输会面临很多问题,比如在网络不稳定的情况下,如果保证数据的传输没有问题,如何保证数据不被重复
发送,连接断开后如何进行重连,而HTTP协议由于太重量级了,不是适合物联网。
因此IBM公司为此提出一种轻量级的MQTT协议。
二、MQTT协议简介
1、MQTT协议架构
MQTT协议全称是Message Queuing Telemetry Transport,顾名思义就是消息队列遥测传输协议,它是物联网常用的应用层协议,运行在TCP/IP中的应用层中,依赖TCP协议,因此它具有非常高的可靠性和低的开销量。
同时它是基于TCP协议的 <客户端-服务器> 模型发布/订阅主题消息的轻量级协议,也是我们常说的发送与接收数据,
2、MQTT是哪一层的协议?
众所周知,TCP/IP参考模型可以分为四层:应用层、传输层、网络层、链路层。TCP和UDP位于传输层,应用层常见的
协议有HTTP、FTP、SSH等。
MQTT协议运行于TCP之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT。
3、MQTT相关的名称与功能。
MQTT协议是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议
它的最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低
带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
4、MQTT通信模型
(1)、MQTT 协议提供一对多的消息发布,可以降低应用程序的耦合性,用户只需要编写极少量的应用代码就能完成一
对多的消息发布与订阅,该协议是基于<客户端-服务器>模型.
其中,MQTT消息的发布者和订阅者都是客户端,服务器只是作为一个中转的存在,将发布者发布的消息进行转发给所
有订阅该主题的订阅者;发布者可以发布在其权限之内的所有主题,并且消息发布者可以同时是订阅者,实现了生产者
与消费者的脱耦,发布的消息可以同时被多个订阅者订阅。
(2)、MQTT协议是基于<客户端-服务器>模型设计的。
在协议中主要有三种身份:发布者(Publisher)、服务器(Broker)、以及订阅者(Subscriber)。
发布者和订阅者都是客户端的形式,而中间的服务器即为常说的"云端",作为一个中转站的存在,服务器将发布者发布
的消息发送给所有订阅此主题的订阅者。
(3)、MQTT通信模型示意图如下:
5、MQTT客户端的功能:
发布消息给其它相关的客户端。
订阅主题请求接收相关的应用消息。
取消订阅主题请求移除接收应用消息。
从服务端终止连接。
6、MQTT客户服务器功能:
MQTT 服务器常被称为 Broker(消息代理),它一般为云服务器,比如BTA三巨头的一些物联网平台就是常使用MQTT
协议,它是位于消息发布者和订阅者之间,以便用于接收消息并发送到订阅者之中,它的功能有:
接受来自客户端的网络连接请求。
接受客户端发布的应用消息。
处理客户端的订阅和取消订阅请求。
转发应用消息给符合条件的已订阅客户端(包括发布者自身)。
7、订阅&发布
订阅包含一个主题过滤器 ( Topic Filter )和一个最大的服务质量( QoS )等级。
订阅与单个会话( Session )关联。
会话可以包含多于一个的订阅。
会话的每个订阅都有一个不同的主题过滤器。
8、报文格式
从图中可以看出,MQTT协议的报文只有两个字节,并且每个MQTT命令消息的消息头部都包含了一个固定头部。其中
一些类型的消息可能还需要一个可变头部和一个有效载荷(可理解为消息体)。
MQTT报文的固定头部只有2个字节,这也是相比其他协议更加轻量的原因。
9、消息主题
主题( topic) : 是附加在消息上的一个标签,该标签与服务器中的所有订阅相匹配)服务器会将消息转发给与标签相匹的每
个客户端(订阅者)。
主题过滤器( Topic Filter ) : 订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符。
10、消息类型(Message Type)
标识 | 计数 | 描述 |
---|---|---|
Reserved | 0 | 保留 |
Connect | 1 | 客户端到服务端的连接请求 |
ConnACK | 2 | 服务端对连接请求的响应 |
Publish | 3 | 发布消息 |
puback | 4 | 对发布消息的回应 |
pubRec | 5 | 收到发布消息(保证传输part1) |
pubRel | 6 | 释放发布消息(保证传输part2) |
pubComp | 7 | 完成发布消息(保证传输part3) |
subscribe | 8 | 客户端订阅请求 |
subBack | 9 | 订阅请求的回应 |
unsubscribe | 10 | 停止订阅请求 |
unsubBack | 11 | 停止订阅请求响应 |
pingReq | 12 | Ping请求(保持连接) |
pingResp | 13 | Ping响应 |
disconnect | 14 | 客户端正在断开 |
reserved | 15 | 保留 |
11、服务质量
-
QoS0 :最多发送一次消息。在消息发送出去后,接收者不会发送回应,发送者也不会重发消息,消息可能送达一次也可能根本没送达,这个服务质量常用在不重要的消息传递中,因为即使消息丢了也没有太大关系。
-
QoS1 :最少发送一-次消息(消息最少需要送达一次,也有可送达多次)。QoS 1的PUBLISH报文的可变报头中包含一个报文标识符,需要PUBACK报文确认。即需要接收者返回PUBACK应答报文。
-
QoS2 :这是最高等级的服务质量,有且只有一次。消息丢失和重复都是不可接受的,只不过使用这个服务质量等级会有额外的开销,这个等级常用于支付中,因为支付是必须有且仅有一次成功,总不能没给钱或者给了多次钱吧。