MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的“轻量级”消息协议,由 IBM 发布。

目录

MQTT是什么?

什么是发布/订阅?

MQTT属于哪一层协议?

MQTT协议通信模型

消息主题

服务质量定义

MQTT客户端的功能

MQTT服务器的功能

MQTT协议会话

MQTT协议的报文详情


Hello,大家好,我是灰小猿!

最近在在物联网相关项目的开发的时候,有用到物联网常用的通信协议--MQTT协议,刚开始对这一块的知识并不是很了解,所以在这里一边学习一边记录,有不合理的地方还希望能多多指正。

 

MQTT是什么?

MQTT协议全称是(Message Queuing Telemetry Transport),即消息队列遥测传输协议

是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,并且该协议构建于TCP/IP协议之上,我们知道TCP协议本身就具有高可靠性的特点,因此基于其上的MQTT协议同样也是具有高可靠、低开销的特点,之所以低开销,是以为MQTT协议传输的最小的报文也只有两个字节。

 

什么是发布/订阅?

我们在上面说到,MQTT协议是一种基于发布/订阅模式的轻量级通讯协议,那么什么是订阅和发布呢?

订阅&发布

订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(Qos)等级,订阅与单个会话(Session)关联,会话可以包含多于一个的订阅,会话的每一个订阅都有一个不同的主题过滤器。

我们拿抖音平台来举个例子,我们每一个用户就都是一个客户端,而抖音就是MQTT协议中的服务器,当我们(用户一)关注某一个用户(用户二)时,这样一个关注的行为就可以理解为订阅;同时用户二也可以关注你,那么这就是相互订阅。当用户二发布作品的时候,这个作品是发布到了抖音平台,也就是我们现在的服务器,这个过程就是消息的发布。

在这里需要注意的是:用户二(客户端)发布的消息并不是直接发布给了用户一,而是发布到了抖音平台(服务器),由于用户一订阅了用户二的消息,所以抖音平台(服务器)就会向用户一推送。这就是MQTT协议订阅&发布的一个简单比喻。

Java mqtt消息发送成功 mqtt 发送文件_深度学习

 

MQTT属于哪一层协议?

MQTT协议是构建于TCP/IP协议之上的,同时TCP/IP参考模型可以分为四层:

应用层 传输层 网络层 链路层

Java mqtt消息发送成功 mqtt 发送文件_物联网_02

而MQTT协议运行于TCP协议之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT协议。

 

MQTT协议通信模型

MQTT协议是基于<客户端-服务器>模型设计的,

主要有三种身份:发布者(publisher)、服务器(broker)、订阅者(subscriber)

同时“发布者”和“订阅者”均属于客户端的范畴。

Java mqtt消息发送成功 mqtt 发送文件_深度学习_03

 

消息主题

主题(Topic):是附加在消息上的一个标签,该标签与服务器中的所有订阅相匹配,服务器会将消息转发给与标签相匹配的每个客户端(订阅者)。

在这里主题(Topic)就可以理解为你抖音用户的“网名”,只有我们订阅了该“网名”,才能通过服务器进行数据的交互,所以在这里我们就可以将服务器理解为一个“中转枢纽”,用户一将“作品”(消息)发布到这个“中转枢纽”(服务器),之后服务器再将该作品推送给订阅了该用户一的粉丝用户二。

主题过滤器(Topic Filter):订阅中包含的一个表达式,用于表示相关的一个或多个主题,主题过滤器可以使用通配符。在这里我的理解就是存放订阅的主题的一个集合,集合中有该主题则推送消息给客户端,没有则不会推送。

 

服务质量定义

  1. QoS0:最多发送一次消息
  2. QoS1:最少发送一次消息(消息最少需要送达一次,也有可能送达多次)
  3. QoS2:最高等级的服务质量,有且只有一次

MQTT协议服务质量定义

Qos值

Bit2

Bit1

描述

0

0

0

最多分发一次

1

0

1

至少分发一次

2

1

0

只分发一次

 

MQTT客户端的功能

  1. 发布消息给其它相关客户端
  2. 订阅主题请求接收相关的应用消息
  3. 取消订阅主题请求移除接收应用消息
  4. 从服务器终止连接

 

MQTT服务器的功能

  1. 接受来自客户端的网络连接请求
  2. 接受客户端发布的应用消息
  3. 处理客户端的订阅和取消订阅请求
  4. 转发应用消息给符合条件的已订阅客户端(包括发布者自身)

 

MQTT协议会话

客户端与服务器之间的状态交互

一些会话的持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接之间扩展。

 

MQTT协议的报文详情

报文

描述

流向

固定报头

可变报头

负载

CONNECT

客户端请求与服务器端建立连接

C->S

1

CONNACK

服务器端确认建立连接

S->C

2

PUBLISH

发布消息

C<->S

3

PUBACK

收到发布消息确认(QoS1等级)

C<->S

4

PUBREC

发布消息收到(QoS2等级)

C<->S

5

PUBREL

发布消息释放(QoS2等级)

C<->S

6

PUBCOMP

发布消息完成(QoS2等级)

C<->S

7

SUBSCRIBE

订阅请求

C->S

8

SUBACK

订阅确认

S->C

9

UNSUBSCRIBE

取消订阅

C->S

10

UNSUBACK

取消订阅确认

S->C

11

PING

客户端发送PING(连接保活)命令

C->S

12

PINGRSP

PING命令回复

S->C

13

DISCONNECT

断开连接

C->S

14

好了,关于MQTT协议的这些基本概念就先分享这些。有错误的地方还希望大佬能够批评改正,之后关于MQTT的相关学习也会再继续更新。