简单了解mqtt协议

一、简介

MQTT(Message Queue Telemetry Transport),遥测传输协议,低开销,低带宽占用。属于物联网的一个标准传输协议,属于应用层协议

适用于受限环境(带宽低、网络延迟高、网络通信不稳定),为工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议。能在处理器和内存资源有限的嵌入式设备中运行。

1. 特性:

  1. 使用发布/订阅消息模式,提供一对多的消息发布,从而接触应用程序的耦合
  2. 使用TCP/IP提供网络连接(主流是基于TCP,也有基于UDP的版本叫做MQTT-SN)
  3. 对负载内容屏蔽的消息传输(这句不是太懂)
  4. 使用Last Will(遗言机制)和Testament(遗嘱机制)特性通知有关各方客户端异常中断的机制。
  5. 小型传输,开销小(固定报头2字节),协议交换最小化,降低网络流量
  6. 支持三种消息发布服务质量QoS:

“至多一次”(QoS==0):只发送一次消息。消息的发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。【适用于丢失一次读记录无所谓,不久之后会有第二次发送,如普通APP的推送,就算在消息推送当时未联网,但是再次联网后就可以收到消息了】

“至少一次”(QoS==1):最少发送一次消息,确保消息到达,但是消息重复可能会发生。

“只有一次”(QoS==2):确保消息只到达一次,常用于计费系统中,确保用户收到且只会收到一次消息。

2. 实现方式

实现MQTT协议需要客户端和服务器端通讯完成。

通讯过程中,MQTT协议中有三种身份:

  1. 发布者(Publish):发布消息
  2. 代理(Broker)(服务器端):进行消息的代理分发
  3. 订阅者(Subscribe):订阅消息

消息的发布和订阅都是客户端,消息的代理是服务器,客户端在作为发布者发布消息的同时也可以作为订阅者订阅消息。(与微博微信公众号的发文章和关注类似)

MQTT传输的消息分为两部分:

  1. 主题(Topic):可理解为消息的类型,订阅者订阅了相应的topic,就会收到该主题的消息内容(payload)
  2. 负载(Payload):可理解为消息的内容,订阅者具体接受到和要使用的内容。

3. 会话、订阅、主题筛选器、服务质量、主题名和负载之间的关系:

  1. 一个会话(session)中可以包含多个订阅(subscribe),
  2. 每个订阅(subscribe)都有一个不同的主题筛选器(topic filter)和自己的服务质量(QoS),
  3. 一个主题筛选器(topic filter)能够匹配到一个或多个主题名(topic name),
  4. 每个主题名(topic name)表示一个主题,他们有自己的负载(payload)内容。

 

二、MQTT控制报文结构

MQTT报文结构由三部分组成:

  1. 固定报头(Fixed header):包含三部分【控制报文的类型(Byte1的bits 7-4)用于指定控制报文类型的标志位(Byte1的bits 3-0)、剩余长度(Byte2)】
  2. 可变报头(Variable header):
  3. 有效载荷(Payload):

其中,固定报头是所有报文类型都包含的,可变报头和有效载荷是部分报文才有

1. 固定报头

共占2字节,三部分(类型,标志位,剩余长度)

Byte1 控制报文的类型(bits 7-4) 用于指定控制报文类型的标志位(bits 3-0)
Byte2 剩余长度

1. 1类型 Type

mqtt的控制报文的类型共16种,其中0和15为Reserved,作为保留:

  1. CONNECT, CONNACK:请求连接和连接确认
  2. PUBLISH, PUBACK, PUBREC, PUBREL, PUBCOMP:发布消息及不同QoS对应的确认收到
  3. SUBSCRIBE, SUBACK:订阅和订阅确认
  4. UNSUBSCRIBE, UNSUBACK:取消订阅和取消订阅的确认
  5. PINGREQ, PINGRESP:心跳请求和心跳响应
  6. DISCONNECT:断开连接

1.2 标志位 Flags

除了下面四种,其他报文的标志位都标记为“保留”,是保留给以后使用的。

PUBLISH报文包含标志位:bit3-0分别为DUP(重复分发标志),QoS(服务质量等级,占2bit,0-2),RETAIN(保留标志)

PUBREL, SUBSCRIBE, UNSUBSCRIBE三种报文的 bit 1 位为 1。

1.3 剩余长度 Remaining Length:

(没看明白)

 

2. 可变报头 Variable header

可变报头根据报文类型的不同而不同,常用来作为包的标识。心跳请求、心跳响应和断开连接三种报文没有可变报头。

不同报文中可变报头的内容也不相同:

  1. CONNECT:协议名,协议级别,连接标志,保持连接
  2. CONNACK:连接确认标志,连接返回码
  3. PUBLISH:主题名,报文标识符
  4. PUBACK, PUBREC, PUBREL, PUBCOMP:报文标识符
  5. SUBSCRIBE:报文标识符(Packet Identifier)【报文标识符设置为10时的可变报头】
  6. SUBACK, UNSUBSCRIBE, UNSUBACK:报文标识符

各个存在可变报头的协议其详细不同如下:

CONNECT:

  • 协议名(Protocol Name),即MQTT协议,加上长度MSB和长度LSB,共占6字节,utf-8编码的字符串
  • 协议级别(Protocol Level),表示协议的修订版本,占1个字节
  • 连接标志(Connect Flags),包含用于指定MQTT连接行为的参数,还能指出有效载荷中的字段是否存在,占1个字节
bit 7 6 5 4 3 2 1 0
  User Name Flag Password Flag Will Retain Will QoS Will Flag Clean Session Reserved
byte 8 X X X X X X 0

 

  • 保持连接(Keep Alive),指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端必须发送一个PINGREQ报文。占2字节

CONNACK:

  • 连接确认标志(Connect Acknowledge Flags):第1个字节是 连接确认标志,位7-1是保留位且必须设置为0。 第0 (SP)位 是当前会话(Session Present)标志。

  • 当前会话(Session Present):连接确认标志的第0位。与清理会话相关联(不是很明白对应的机制)

  • 连接返回码(Connect Return code):可变报头的第2个字节。确认连接成功或者连接失败的相应原因,用返回值表示不同的情况

PUBLISH:

  • 主题名(Topic Name):用于识别有效载荷数据应该被发布到哪一个信息通道。必须是PUBLISH报文可变报头的第一个字段,不能包含通配符。
  • 报文标识符(Packet Identifier):只有当QoS等级是1或2时,报文标识符(Packet Identifier)字段才能出现在PUBLISH报文中。

2.1 报文标识符 Packet Identifier

报文标识符占2字节。感觉像是客户端服务端在通信时证明该报文是当前会话的报文。

Bit 7-0
byte 1 报文标识符MSB
byte 2 报文标识符LSB

包含报文标识符字段的控制报文有下面几个,都是发布、订阅、取消订阅及其消息确认的报文

PUBLISH(QoS > 0时), PUBACK,PUBREC,PUBREL,PUBCOMP

SUBSCRIBE, SUBACK,UNSUBSCRIBE,UNSUBACK。

 

3. 有效载荷 Payload

有效载荷也是部分报文才拥有的,会根据报文类型的不同,及其可变报头中的标志而决定的,其中包含有效载荷的控制报文有以下几个:

CONNECT:如果可变报头中的标志包含这些字段,其顺序必须为:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码

PUBLISH:(可选)包含将被发布的应用消息,数据的内容和格式是应用特定的。有效载荷为0时也是合法的

SUBSCRIBE:包含一个主题过滤器列表(必须是utf-8)和QoS等级,表示客户端想要订阅的主题及其QoS等级;

SUBACK:包含一个返回码清单。每个返回码对应等待确认的SUBSCRIBE报文中的一个主题过滤器。返回码的顺序必须和SUBSCRIBE报文中主题过滤器的顺序相同。对要订阅的内容进行确认

UNSUBSCRIBE:包含客户端想要取消订阅的主题过滤器列表(主题过滤器必须是连续打包的、按照UTF-8编码字符串)

 

参考文章:

https://blog.csdn.net/qq_28877125/article/details/78325003

https://mcxiaoke.gitbooks.io/mqtt-cn/content/

https://www.cnblogs.com/sxkgeek/p/9140180.html

http://www.360doc.com/content/18/0116/05/163747_722273693.shtml

你可能感兴趣的:(mqtt,mqtt)