MQTT物联网通信协议概论

实时通信协议是物联网技术中的一项根本性技术,在数据的有效传输、及时通信方面不可或缺,在物联网领域发挥着至关重要的作用,因此物联网通信协议的制定至关重要。目前物联网设备广泛使用的有四大实时协议XMPP、REST/HTTP、CoAP以及MQTT。XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性,但对于嵌入式设备来说,解析非常困难;REST (Representational State Transfe)是一种架构风格,即表述性状态传递,它基于HTTP定义了一组约束和属性,适用于web服务,在物联网方面主要被应用于基于HTTP web服务的转化,但对于嵌入式设备而言,目前很多物联网接入设备大多属于资源受限型设备,只拥有有限的计算能力和有限的存储空间,故相比较而言REST/HTTP属于重量级协议;由于物联网中的很多设备属于资源受限型,The Internet Engineering Task Force (IETF)提出了一种基于REST架构的CoAP协议,Constrained Application Protocol (CoAP) 是一种针对受限设备的专用Internet应用协议,CoAP是一种应用层协议,它运行于UDP协议之上,但是一对一的协议;MQTT(Message Queuing Telemetry Transport) 消息队列遥测传输,是由IBM公司主导开发的物联网及时通信协议。MQTT是为大量计算能力有限的设备所设计的,使得设备工作在低带宽、不可靠网络的环境时,能够有效地进行网络数据交互,进而使得远程传感器和控制设备能够与服务器及时通讯,故本文选作MQTT协议作为本次物联网平台的通讯协议。

MQTT协议阐述

MQTT协议由IBM主导开发的一种轻量级基于客户端-服务器的消息发布/订阅模式的消息传输协议,同时MQTT协议基于TCP协议,其运行在TCP长连接的基础上,为网络设备提供有序、可靠、双向连接的网络连接保障。作为广泛的使用物联网通讯协议,MQTT具有以下几项重要特性:

(1)轻量级

因为物联网设备的特殊性,为了保证数据在低带宽、不可靠的网络中传输有效的数据,故MQTT协议的设计原则是精简,不添加可有可无的功能,以保证协议的轻便性,因此MQTT协议头部协议字段2只有两字节,尽量保持轻量级的特性。

(2)支持发布(PUBLISH)/订阅(SUBSCRIBE)模式

使用发布/订阅模式解除了通信设备终端之间的耦合,解耦方式可以从多个方面进行加以区分,主要有空间解耦、时间解耦和同步解耦。空间解耦:支持一对多、多对一、多对多的消息传递,发布者设备与订阅者设备彼此相互独立,消息发布者与订阅者不知道彼此任何相关信息就可以实现数据交互,比如对方的IP地址和端口,方便了消息在设备之间的传递;时间解耦:发布者和订阅者无需同时运行;同步解耦:在设备消息发布或接收期间,消息发布者与订阅者的其他操作不会暂停。

(3)提供三种级别Qos消息传递类型

当Qos值为0时,为最多传输一次(At most once delivery),此种传输方式中,发送方不需要收到服务器回应,消息可能到达服务器一次,或可能根本不会到达此种传输方式属于允许消息丢失场景,性能最高;当Qos值为1时,发送放至少发送一次(At least once delivery),以确保消息到达接收方,接收方需要返回确认消息,在此情况下,接受方可能会接收到重复消息,即适合不允许消息丢失,但允许消息重复的场景,性能中等。当Qos值为2时,消息体只到达一次并且保证消息送达(Exactly once delivery)。为确保响应消息能够到达发送方,接收方必须等待发送方对接受方响应消息的响应,只有收到发送方的确认消息后,接收方才能对订阅者投递消息。

(4)提供遗嘱机制

遗嘱保留主要用于发布态(PUBLISH)的消息,当遗嘱标志(连接标志的第二位)被设置为1,并且遗嘱保留位(连接标志的第五位)被设置为1,服务器端会将此次发送的消息作为遗嘱消息保留发布,即当有新的订阅者出现,服务器会将此消息推送出去。

MQTT控制报文格式

使用MQTT协议,必须严格遵循MQTT控制报文格式来进行通信,MQTT预定义的控制报文格式较为精简,主要由三部分组成:固定报头(Fixed header)、可变报头(Variable header)、有效载荷(Payload)。控制报文结构如图所示。


控制报文结构


固定报头

每个MQTT控制报文都必须携带一个固定报头,固定头部部分占两个字节,共16位。固定报头的控制报文格式如图所示。


控制报文格式

MQTT控制报文类型有14种,依次为CONNECT(客户端请求连接到服务器)、CONACK(连接确认)、PUBLISH(发布消息)、PUBACK(发布确认)、PUBREC(发布初稿)、PUBREL(出版发行)、PUBCOMP(发布完整)、SUBSCRIBE(客户端订阅请求)、SUBACK(订阅确认)、UNSUBSCRIBE(退订请求)、UNSUBACK(退订确认)、PINGREQ(Ping 请求)、PINGRESP(Ping 响应)、DISCONNECT(客户端断开服务器连接)。如图所示。


MQTT控制报文类型


控制报文类型的标志位只有在PUBLISH(发布消息)类型时有效,其他控制报文类型标志位现保留。控制报文类型的标志位重发标志DUP,在固定报头第一字节第3位,如果DUP标志为0,表示这是发送方第一次请求发送的PUBLISH报文,如果值为DUP标志位被设置为1,表示这可能是早期报文请求的重发。控制报文类型的标志位服务质量等级QoS,在固定报头第一字节2-1位,该字段表示消息传递类型。三种消息传递服务质量如图所示。


三种消息传递服务质量


剩余长度字段是从报文段的第二个字节开始,剩余长度字段(Remaining Length)是除固定头部报文段以外的报文段,包括可变报头和负载数据。

可变报头

MQTT报文字段除了必须的固定报头,在某些MQTT控制报文中包含可变报头字段,该报文段根据各报文类型的不同而不同,具体可根据报文标识符识别。在PUBLISH控制报文、PUBACK控制报文、PUBREC控制报文、PUBREL控制报文、PUBCOMP控制报文、SUBSCRIBE控制报文、SUBACK控制报文,UNSUBSCIBE控制报文、UNSUBACK控制报文的可变头部部分都含有一个两字节的可变头部,报文标识符的作用是标识区别报文,当客户端每发送一个新的类型的报文段时,该客户端所发送的报文中必须重新分配新的报文标识符,且新的控制报文标识符必须是当前未使用的报文标识符,而当由于某种原因该客户端需要重新发送该控制报文时,重发的控制报文必须携带与原控制报文的标识符相同的报文标识符。当客户端收到该控制报文的确认信息后,才可释放该报文标识符,即下次发送控制报文时可重用该报文标识符。

有效载荷

有效载荷用于携带应用消息,位于固定首部和可变报头之后,即位于控制报文的最后部分,有效载荷不是每个控制报文必须携带的报文段,但是在CONNECT控制报文、SUBSCRIBE控制报文、SUBACK控制报文、UNSUBSCRIBE控制报文中需要携带,在PUBLISH控制报文中为可选字段,在其他控制报文中不需要携带。CONNECT控制报文段中有效载荷字段内容主要是客户端的ClientID、遗嘱主题,遗嘱消息以及用户名和密码,且必须按此顺序排列。SUBSCRIBE控制报文段中效载荷字段内容是要订阅的主题以及Qos。SUBACK控制报文段中效载荷字段内容是对SUBSCRIBE控制报文所订阅的主题的确认和回复。SUBACK控制报文段中消息体内容是要订阅的主题。

MQTT控制报文

MQTT客户端,即使用MQTT协议通讯的程序或设备,其必须依照MQTT控制报文格式发送MQTT控制报文到服务器端。MQTT共14种不同的控制报文的类型。

CONNECT报文是客户端连接到服务器端发送的第一个报文,并且,在一个网络连接上,客户端只能发送一次CONNECT控制报文,否则服务器将断开该连接,并将该报文做违规处理。CONNECT控制报文的固定报头如图所示。


CONNECT控制报文的固定报头


客户端在成功建立TCP连接之后,发送CONNECT控制报文到服务器,服务器给出确认,客户端收到该确认消息后,会发送SUBSCRIBE控制报文到服务器订阅相应的主题列表,订阅过程中客户端设备至少订阅一个主题。SUBSCRIBE控制报文也会指定Qos服务质量等级,服务器根据该报文发送 PUBLISH报文给客户端。SUBSCRIBE控制报文固定报头格式如图所示。


SUBSCRIBE控制报文固定报头


PUBLISH控制报文是消息推送方推送消息到服务器,或由服务推送消息到相应主题订阅者的应用消息报文。PUBLISH报文固定报头如图2-7所示。第一个字节第三位DUP标志位为重发标志,如果DUP标志位被设置为0,表示这是客户端或服务器端第一次请求发送本报文,如果是重新发送的报文,则DUP标志应设置为1。


PUBLISH报文固定报头  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容