物联网技术系列之MQTT协议详解
物联网通过网络及传感器技术将分散在各地的设备联系起来,进行信息交换及交互控制,实现智能化感知与管理。但是随着物联网的快速发展,海量物联设备的接入给传统web通信协议带来很大的挑战,而MQTT协议的出现可以解决网络不可靠、终端设备资源有限等问题。本文将就MQTT协议的特点、消息格式做深入分析。
MQTT(Message Queuing Telemetry Transport),翻译为消息队列遥测传输协议,起初主要解决卫星与石油管道监测数据传输的问题,最大限度减少电池消耗及带宽占用。MQTT是一种轻量级“发布&订阅”方式工作的消息协议,主要特征是简单、轻便、易于实现,这些特征比较适用于物联网领域,比如传感器与服务器的通信、传感器信息采集等。
基本特点
1. 发布&订阅模式实现一对多的消息分发机制,具体如下所示:
代理服务器broker集消息存储、转发功能于一体,解耦发布者与订阅者。发布者与订阅者之间的消息传递按照主题(topic)进行,发布者发布消息并不要求订阅者连接到broker,只要订阅者之前订阅过该主题,那么在它连接到broker之后就可以收到发布者在它离线期间发布的保持持久会话消息。
2. 承载在TCP/IP协议上的应用层协议。
3. 提供三种不同QoS(服务质量)的消息传递机制。
消息格式
每个MQTT消息都有一个固定报文头,有些消息还需可变报文头及报文体,具体如下所示:
2.1
固定报文头
固定报文头由2个字节组成,第1个字节包含4个字段:MessageType、DUP Flag、QoS Level、RETAIN,第2个字节Remaining length声明后续可变报文头和报文体的长度。具体如下所示:
其中MessageType由4 bit的无符号整数表示,其含义如下:
QoS Level占2 bit,用来表示消息传递安全机制,其值解释如下:
0:最多一次(at most once),sender发送的消息,receiver最多只能收到一次,重复或者丢失消息的现象是存在的;
1:至少一次(at least once),receiver一定会收到发布的消息,但是可能收到重复消息;
2:有且仅有一次(exactly once),保证receiver一定能收到消息,而且只能收到一次。sender发送消息失败会重试,直到receiver成功收到该消息,同时保证receiver不会因为消息重传而收到重复的消息。
2.2
可变报文头
可变报文头位于固定报文头和报文体之间,不同的消息类型携带不同的信息,携带的信息主要有以下部分组成。
(1)协议名称:协议的名称,在CONNECT消息中是一个以UTF编码的“MQTT”字符串。
(2)协议版本:表示当前协议的版本。
(3)连接标志:包含多个标志位,具体如下:
① Clean Session(清除会话):客户端断线,服务器是否需要存储客户端的订阅信息。Clean Session=0,客户端会收到离线期间QoS=1或2的消息;Clean Session=1,客户端每次重新上线时需重新订阅topic,且不会订阅到离线期间的消息。
② Will Flag:客户端连接broker时会设立一个遗愿,这个遗愿会保存在broker。当发布者非正常原因与broker断开连接,broker会将该遗愿发布订阅者,同时Will Flag置为1,遗愿报文Will Message和遗愿主题Will Topic会体现在报文体Payload中。
③ Will QoS:表示Will Flag=1遗愿消息的服务质量要求。
④ Will Retain:表示Will Flag=1遗愿消息是否需要broker保存。
⑤ Username Flag和Password Flag用来表示CONNECT消息的报文体是否包含用户名密码,Username Flag=1,Password Flag=1表示CONNECT消息的报文体存在用户名密码信息。
(4)心跳时长:此字段定义了broker接收客户端消息的最大时间间隔,如果超过该时间间隔没收到消息,则认为客户端已掉线。
(5)连接返回码:此字段出现在CONNECTACK消息的可变报文头中,0表示接入成功。
(6)主题名称:此字段出现在PUBLISH消息,表示消息发布的topic。
(7)消息id:该字段只出现在QoS=1或者QoS=2的消息中,该字段必须是独一无二的,每发送一次消息,对应的消息ID加1。
2.3
Encoder
有些消息有报文体,有些消息没有报文体,比如PUBLISH消息的报文体就是消息内容,而CONNECT消息的报文体包括Will topic、Will Message、Username、Password等内容。
总结
以上介绍了MQTT协议的基本特点及报文格式,发布&订阅的异步消息通信模式,可以解决不可靠或高延迟的网络通信问题。提供一对多的消息发布,可以将消息传送到网络上的所有设备。因为报文的精简,传输开销小,降低网络流量,所有才可以高效传输数据。MQTT提供一个有质量的服务,包括消息应答、存储和重传,保证消息被正确接收。正是MQTT以上特质,才能在物联网领域扮演着重要的角色。
作者 | 张淑文
视觉 | 王朋玉
统筹 | 祖德光