浅谈MQTT协议

MQTT协议

一 MQTT协议

MQTT 是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、
简单、规范,因此易于实现。这些特点使得它对很多场景来说都是很好的选择,包括受限的环境如
机器与机器的通信(M2M)以及物联网环境(IoT),这些场景要求很小的代码封装或者网络带宽
非常昂贵。
浅谈MQTT协议

二 MQTT协议特点

本协议运行在 TCP/IP协议,或其它提供了有序、可靠、双向连接的网络连接上。它有以下特点:
使用发布/订阅消息模式,提供了一对多的消息分发和应用之间的解耦。
 消息传输不需要知道负载内容。
提供三种等级的服务质量:.
 “最多一次”,尽操作环境所能提供的最大努力分发消息。消息可能会丢失。例如,这个等级可用于环境传感器数据,单次的数据丢失没关系,因为不久之后会再次发送。
 “至少一次”,保证消息可以到达,但是可能会重复。
 “仅一次”,保证消息只到达一次。例如,这个等级可用在一个计费系统中,这里如果消息重复或丢失会导致不正确的收费。
 很小的传输消耗和协议数据交换,最大限度减少网络流量
异常连接断开发生时,能通知到相关各方。

三 MQTT协议术语

网络连接( (Network Connection) ):
MQTT 使用的底层传输协议基础设施。
 客户端使用它连接服务端。
 它提供有序的、可靠的、双向字节流传输。

应用消息( (Application Message) ): :
MQTT 协议通过网络传输应用数据。应用消息通过 MQTT 传输时,它们有关联的服务质量(QoS)和主题(Topic)。

客户端( (Client) ): :
使用 MQTT 的程序或设备。客户端总是通过网络连接到服务端。它可以
 发布应用消息给其它相关的客户端。.
 订阅以请求接受相关的应用消息
 取消订阅以移除接受应用消息的请求。
 从服务端断开连接。

服务端( (Server) ): :
一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。服务端
 接受来自客户端的网络连接
 接受客户端发布的应用消息
 处理客户端的订阅和取消订阅请求。
 转发应用消息给符合条件的客户端订阅。

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

主题名(Topic Name) ): :
附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本给每一个匹配的客户端订阅。

主题过滤器( (Topic Filter:) ): :
订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符。
会话( (Session) ): :
客户端和服务端之间的状态交互。一些会话持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接间扩展。

控制报文( (MQTT Control Packet) ): :
通过网络连接发送的信息数据包。MQTT 规范定义了十四种不同类型的控制报文,其中一个(PUBLISH 报文)用于传输应用消息。

MQTT控制报文格式

一 MQTT控制报文的结构

Fixed header 固定报头,所有控制报文都包含

MQTT固定报文头最少有两个字节,第一字节包含消息类型(Message Type)和QoS级别等标志位。第二字节开始是剩余长度字段,该长度是后面的可变报文头加消息负载的总长度,该字段最多允许四个字节。
剩余长度字段单个字节最大值为二进制0b0111 1111,16进制0x7F。也就是说,单个字节可以描述的最大长度是127字节。为什么不是256字节呢?因为MQTT协议规定,单个字节第八位(最高位)若为1,则表示后续还有字节存在,第八位起“延续位”的作用。
例如,数字64,编码为一个字节,十进制表示为64,十六进制表示为0×40。数字321(65+2*128)编码为两个字节,重要性最低的放在前面,第一个字节为65+128=193(0xC1),第二个字节是2(0x02),表示2×128。
由于MQTT协议最多只允许使用四个字节表示剩余长度(如表1),并且最后一字节最大值只能是0x7F不能是0xFF,所以能发送的最大消息长度是256MB,而不是512MB。

Variable header 可变报头,部分控制报文包含

可变报文头主要包含协议名、协议版本、连接标志(Connect Flags)、心跳间隔时间(Keep Alive timer)、连接返回码(Connect Return Code)、主题名(Topic Name)等。

Payload 有效载荷,部分控制报文包含

Payload直译为负荷,可能让人摸不着头脑,实际上可以理解为消息主体(body)。

当MQTT发送的消息类型是CONNECT(连接)、PUBLISH(发布)、SUBSCRIBE(订阅)、SUBACK(订阅确认)、UNSUBSCRIBE(取消订阅)时,则会带有负荷。

以上就是对MQTT的简单介绍,想具体了解mqtt协议,请看MQTT官网

上一篇:Dream精致的Emlog主题


下一篇:313-STM32+Air724UG基本控制篇(自建物联网平台)-加密通信测试-STM32+Air724以SSL单向认证方式连接MQTT服务器(不验证服务器证书)