MQTT|MQTT协议介绍
1.MQTT协议简介MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一个轻量的发布/订阅模式消息传输协议,是专门针对低带宽和不稳定网络环境的物联网应用设计的。
文章图片
特点:
1.开放消息协议,易实现
2.发布订阅模式,一对多消息发布
3.基于TCP/IP网络连接
4.报文结构紧凑
5.消息QoS支持,保证可靠传输
MQTT协议原理
文章图片
实现MQTT
协议需要客户端和服务器
端建立
TCP
连接,
在通讯过程中,
MQTT
协议中
有三种身份
:发布
者(
Publish
)、代理(
Broker
)(服务器)、订阅者(
Subscribe
)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者
。 MQTT
传输的消息分为
:主
题(
Topic
)和负载(
payload
) (1)
Topic
,可以理解为消息的类型,订阅者订阅(
Subscribe
)后,就会收到该主题
的 消息
内容(
payload
); (2)payload可以理解为消息的内容,是指订阅者具体要使用的内容。
MQTT协议服务器 :
MQTT服务器以称为“消息代理”(Broker),它是位于消息发布者和订阅者之间,服务器可以:
(1)接受来自客户端的网络连接;
(2)接受客户端发布的信息;
(3)处理来自客户端的订阅和退订请求;
(4)向订阅的客户转发消息。
MQTT协议客户端:
一个使用MQTT协议设备,它总是建立到服务器的网络连接,客户端可以:
(1)发布其他客户端可能会订阅的信息;
(2)订阅其它客户端发布的消息;
(3)退订或删除消息;
(4)断开与服务器连接。
MQTT协议栈
文章图片
2.MQTT通信报文 MQTT协议数据包结构:
在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(Payload)三部分构成。MQTT数据包结构如下:
文章图片
Fixed Header(固定报文头)
文章图片
Variable Header &Payload
文章图片
2.1CONNECT报文解读
文章图片
Clean Session:清理会话,用于控制会话状态的生存时间,标志被设置为 1,客户端和服务端 必须丢弃之前的任何会话并开始一个新的会话。标志被设置为 0,服务端 必须基于当前会话(使用客户端标识符识别)的状态恢复与客户端的通信;
Will Flag:遗嘱标志设置为 1,表示如果连接请求被接受了,遗嘱(Will Message)消息 必须被存储在服务端;
QoS:遗嘱消息服务质量等级,遗嘱标志被设置为 0,遗嘱 QoS 也设置为 0;遗嘱标志被设置为 1,遗嘱 QoS 的值可以等于 0,1,2;
User Name Flag:用户名标志,标志被设置为 0,有效载荷中 不能包含用户名字段,标志被设置为 1,有效载荷中 必须包含用户名字段;
Password Flag:密码标志,标志被设置为 0,有效载荷中 不能包含密码字段,标志被设置为 1,有效载荷中必须包含密码字段;
2.2CONNACK 报文解读
文章图片
返回码说明:
文章图片
服务端发送给客户端的第一个报文 是 CONNACK,服务端发送 CONNACK 报文响应从客户端收到的 CONNECT 报文。
Sp: Session Present Flag
当前会话标志
session信息在服务器已保持,置1;
未保存,置0。
2.3 PUBLISH(C<>S)发布消息报文解读
文章图片
DUP:重发标志
QoS2、Qos1:如果为0,则表示是第一次发送该包,如果为1,则表示为重复发送的包。
Qos0:DUP必须为0
QOS: 指定了该Publish包的Qos等级如下
文章图片
RETAIN: 保留标志位,如果为1,服务器存储最新一条RETAIN消息,以便分发给新的订阅者;
2.4. PUBACK收到发布消息确认报文解读
文章图片
PUBACK 报文是对 QoS 1 等级的 PUBLISH 报文的响应。
2.5 PUBREC发布消息收到
文章图片
PUBREC 报文是对 QoS 等级 2 的 PUBLISH 报文的响应。它是 QoS 2 等级协议交换的第二个报文。
2.6 PUBRECL发布消息释放报文解读
文章图片
PUBREL 报文是对 PUBREC 报文的响应。它是 QoS 2 等级协议交换的第三个报文。
2.7 PUBCOMP发布完成报文解读
文章图片
PUBCOMP 报文是对 PUBREL 报文的响应。它是 QoS 2 等级协议交换的第四个也是最后一个报文。
2.8 SUBSCRIBE订阅主题报文解读
文章图片
SUBSCRIBE 报文的有效载荷包含了一个主题,它们表示客户端想要订阅的主题,后面跟着一个字节,这个字节被叫做 服务质量要求(Requested QoS)。它给出了服务端向客户端发送应用消息所允许的QoS 等级。
2.9 SUBACK订阅确认报文解读
文章图片
返回码说明:
文章图片
2.10UNSUBSCRIBE取消订阅报文解读
文章图片
UNSUBSCRIBE 报文提供的主题与服务端持有的这个客户端的当前主题集合逐个字符比较。如果主题完全匹配,那么它(服务端)自己的订阅将被删除,否则不会有进一步的处理。
2.11 UNSUBACK取消订阅确认
文章图片
可变报头包含等待确认的 UNSUBSCRIBE 报文的报文标识符。
2.12 PINGREQ心跳请求报文解读
文章图片
2.13 PINGRESP心跳响应报文解读
文章图片
客户端发送 PINGREQ 报文给服务端的。用于:
1. 在没有任何其它控制报文从客户端发给服务的时,告知服务端客户端还活着。
2. 请求服务端发送 响应确认它还活着。
3. 使用网络以确认网络连接没有断开。
14. DISCONNECT断开连接
文章图片
客户端发送 DISCONNECT 报文之后:
?
必须关闭网络连接; ?
不能通过那个网络连接再发送任何控制报文;
服务端在收到 DISCONNECT 报文时:
?
必须丢弃任何与当前连接关联的未发布的遗嘱消息; ?
应该关闭网络连接。 3. MQTT接入流程 3.1 连接流程
文章图片
?
设备向平台发起
CONNECT
请求
,
CONNECT
中携带鉴权信息
,
平台拿到鉴权信息进行鉴权。
?
鉴权通过后,如果
CLEANSESSION=0,
平台将会加载保存的设备的一些信息
,
如果
CLEANSESSION=1,
设备没有保存信息在平台,则不加载设备相关信息
。 ? ?
返回鉴权结果
CONNACK
。 3.2 发布消息流程
文章图片
?
设备发布
Qos0
消息; ? 平台收到上报数据点后保存起来
文章图片
?
设备发布
Qos1
消息 ?
平台收到上报数据点后保存起来 ?
平台给设备回复相应的
PUBACK
文章图片
?
设备发布
Qos2
消息 ?
平台收到上报数据点后保存起来 ?
平台给设备回复相应的
PubRec
报文 ?
设备需回复平台
PubRel
报文,如超时不回平台则会断开相应连接 ?
平台给设备回复
PubComp
报文
3.3 订阅流程
文章图片
设备发起订阅请求;
平台收到请求后更新topic列表;
平台给设备回复SubAck;
subscribe的requestqos级别可以为0、1、2。
文章图片
?
设备发起取消订阅请求
。 ?
平台收到请求后更新
topic
列表
。 ?
平台给设备回复
UnSubAck
。 3.5 连接保活流程
文章图片
客户端发送 PINGREQ 报文给服务端的,服务端发送 PINGRESP 报文响应客户端的 PINGREQ 报文,表示服务端还活着。
3.6 断开连接流程
文章图片
DISCONNECT 报文是客户端发给服务端的最后一个控制报文,表示客户端正常断开连接。
4.MQTT消息QOS 级别0:最多一次,消息发送者会想尽办法发送消息,但是遇到意外并不会重试,这一级别会发生消息丢失。
文章图片
级别
1
:至少一次。消息接收者如果
没有知会或者知会本身
丢失,消息发送者会再次发送以保证消息接收者至少会收到一次
,这一级别会保证消息到达,可能造成消息重复。
文章图片
级别
2
:恰好一
次,确保消息只有一次到达。
文章图片
MQTT发布消息QoS保证不是端到端的,是客户端与服务器之间的。订阅者收到MQTT消息的QoS级别,最终取决于发布消息的QoS和主题订阅的QoS。
【MQTT|MQTT协议介绍】
文章图片
推荐阅读
- Apache多路复用模块(MPMs)介绍
- 第十六天(请介绍一件让你非常自豪的事情,(不能是职业类的),什么原因感到自豪。)
- typeScript入门基础介绍
- “我不想努力了,能给我介绍个富婆吗(”)
- 今日自我介绍,感恩所遇一切
- 杨梦彤自我介绍
- 第六章|第六章 Sleuth--链路追踪
- 区块链开发平台(以太坊)
- trilinos|trilinos 介绍
- 精准!找到想要的关键字