APP下载

关于MQTT通信协议的分析与研究

2023-02-08姬广龙王珍珍温树峰孔红磊

物联网技术 2023年1期
关键词:报头会话服务端

姬广龙,孙 丹,王珍珍,温树峰,孔红磊,张 丹

(1.国网电力科学研究院有限公司,江苏 南京 211106;2.智能电网保护和运行控制国家重点实验室,江苏 南京 211106)

0 引 言

随着网络通信和信息技术的快速发展,人们的生活已进入万物互联的物联网(Internet of Things, IoT)时代[1],传统工业开始升级转型,智能化应用也逐渐拓展至智能交通系统、智能电网等物联网领域。物联网技术实际是通过射频模糊识别、传感器感知等技术,将采集到的数据依据双方互认的通信协议,通过互联网信道进行远程传输和应用,其核心基础在于选取一个合适的数据通信协议。HTTP协议凭借其开放程度高、开发成本低的优势成为物联网最早使用的通信协议,但由于HTTP协议是基于CS模式的,消息只能由客户端向服务端发起请求,而服务端不会主动向客户端发起推送,并不适合当前物联网设备与服务器的数据传输[2]。CoAP(Constrained Application Protocol)资源受限型协议由IETF国际标准组织的CoRE工作组提出,同样具有HPPT的高开放、低开发成本优势,通过压缩数据包头的形式减少网络运行占比,提高了物联网智能传感设备的响应速度,但CoAP仅适用于局域网中,对于各式各样的物联网设备有一定的局限性[3]。DDS(Data Distribution Service)数据分发服务由OMG组织制定,通过控制服务质量(Quality of Service,QoS)的行为,为实时系统提供高质量、高可靠、高性能的服务,但一般用于国防、工业级自动化等国家核心领域[4]。MQTT与以上协议不同,MQTT通过发布/订阅主题模式来进行数据的传输,所有连接MQTT代理服务器的客户端仅需一次订阅即可获取与其订阅相关的话题;另外MQTT协议可以在低开销、低带宽占用的情况下提供双向实时有效的消息服务,特别适合小型互联、移动应用等物联网设备[5]。因此,本文主要对MQTT通信协议展开研究。

1 MQTT通信协议

1.1 MQTT通信协议的设计原则

MQTT是在1999年由IBM公司的Andy Stanford-Clark博士和Arcom公司的Arlen Nipper博士提出,并被OASIS国际标准组织于2014年提为物联网标准协议[6]。它的设计思想是消息轻巧、源开放、语言简单、约束规范,且行为易于实现。MQTT的设计以精简、不添加可有可无的功能为原则,允许用户动态创建主题,低运维成本,还考虑了低宽带、高延迟和不稳定网络因素的影响,另外不强求传输数据的类型与格式,保持灵活性。这些特点都非常适合当下的物联网环境,特别是对于环境受限的物联网智能设备间的通信。

1.2 MQTT通信协议格式

MQTT协议的控制报文主要由固定包头、可变包头和有效载荷三部分组成。不同的业务需求下,预定义的控制报文也不尽相同,主要区别在于是否包含可变包头或有效载荷。MQTT的消息报文整体结构如图1所示。

图1 MQTT消息报文结构

1.2.1 固定报头

固定报头可以理解成一个代号信息,它由两部分组成:第一部分包含了报文的控制类型和报文的标志;第二部分表示了除固定报头长度外整帧报文的剩余长度,如图2所示。

图2 MQTT固定报头结构

固定报头的第一部分高4位为MQTT控制报文的类型,具有实际意义的控制报文类型主要分为四大类:连接类、保活类、话题订阅类、消息发布类。除此之外,还有0000和1111为保留控制报文[7-8]。控制报文的各项具体含义、报文流向见表1所列。

表1 控制报文的流向及分类

DUP标志位用来保证消息可靠传输,但不能用于检测消息重复发送,默认为0,表示第一次发送。当QoS大于0的情况下,在可变头部需要包含MessageID,当该标志位置为1时,表示当前消息已经被传送过。

QoS消息质量分三个等级:QoS0表示最多分发一次,消息的传递完全依赖底层的TCP/IP网络,消息没有定义应答和重发机制,即消息在周期内最多到达服务端一次,或者根本没到达。QoS1表示至少分发一次,服务端是否接收到消息由PUBACK消息确认,因设备故障或通信链路异常等原因导致客户端在规定时间内没有收到确认消息时,客户端则会重发这条在消息头中设置了DUP为1的消息。QoS2发布的消息有且只有一次被客户端接收到,服务等级最高,不允许消息丢失或重复,当然开销也最大[9-10]。三种QoS模式下信息交互流程如图3所示。

图3 三种QoS模式下的通信流程

Retain表示服务器会保存该标志位为TRUE的消息,需要特别注意的是该标志位与QoS位无关,也就是说不管哪种级别的QoS,只要该标志位置为1,服务器就会保留此消息。

Byte2用来保存可变头部和消息体的总大小,是可以扩展的,最大256 Mb/s,其存储机制为低7位保存长度,高位为是否有后续标识位。如计算大小length≤127,正常保存即可,如计算大小介于127和16 383之间,则需保存两个字节了,即第一个字节高位置1,表示未完待续,第2个字节继续存储。以128为例,第一个字节存10000001,第2个字节存00000001,也就是0x81和0x01。以此类推,最多可扩展至4个字节,即MQTT协议最多可实现(0xFF,0xFF,0xFF,0x7F)近256 MB的数据传输。

1.2.2 可变头部

可变头部由协议名(Protocol Name)、协议级别(Protocol Level)、连接标志(Connect Flags)和保持连接(Keep Alive)四个字段组成。

Protocol Name表示协议名称为“MQTT”的UTF-8编码的字符串,该协议规范的后续版本仍会延续当前这个字符串的偏移和长度。在协商过程中,如协议名不对称,服务端要求做出断开客户端连接的判断。

Protocol Level也可简单看作是协议的版本,规范规定客户端用8位无符号值表示协议的修订版本,对于当前流行的V3.1.1版本,协议级别无符号值规定为Level4(0x04)。对于不支持的协议级别,服务端必须发送返回码为0x01的CONNACK响应报文,并主动断开客户端的连接。

Connect Flags是指一些用于指定MQTT连接行为的参数,它还可以指定有效负载(playload)字段的存在与否,比如will flag置1,则有效负载中需要包含will topic、will message等字段信息。另外服务端必须验证CONNECT控制报文的保留标志位(reserved),该位必须置0,否则服务端必须断开客户端连接。连接标志的报文结构如图4所示。

图4 连接标志的报文结构

Clean Session(清除会话)位于连接标识符Bit1位,当该标志位置0时,服务端必须根据当前的会话状态恢复与客户端的通信,以客户端的唯一标识作为会话的标识。另外,会话断开后,服务端还必须将所有与客户端订阅相关的QoS1和QoS2消息作为会话状态的一部分存储起来。若该标志位置1,当客户端和服务端断开之前启动一个新的会话时,当前的会话状态数据一定不能被随后的会话复用。Will Flag(发布遗嘱)位于连接标识符Bit2位,客户端连接异常断开时触发服务端向订阅客户端发送消息通知。服务端在连接建立后存储Will Message,在连接异常断开时发布遗嘱消息。遗嘱消息的发布按照Will QoS和Will Retain标志位的状态发布,主要用在网络异常导致客户端非主观下线时,使用临终遗嘱通知订阅了该遗嘱topic的客户端,从而可以积极应对处理。关于Will QoS遗嘱消息的安全级别、Will Retain遗嘱消息是否作为保留消息发布、Password Flag是否需要密码以及User Name Flag是否需要用户名,此处不再赘述。

Keep Alive是一个以秒为单位的最大时间间隔,使用PINGRESP响应报文判断连接的活动状态。若Keep Alive值非0,并且服务端在1.5倍保持连接值时间内没有收到客户端的控制报文,则认为通信已断开,服务端必须断开客户端的网络连接;若客户端发送PINGREQ报文,但在规定时间没有收到PINGRESP的响应,客户端应关闭服务端的网络连接。若Keep Alive值为0,则表示关闭保持连接功能,也就意味着客户端不断开连接;但不管Keep Alive为何值,只要服务端认为客户端不活跃或无响应,可以断开与客户端的连接。

1.2.3 有效载荷

有效载荷可以理解为消息主体,当MQTT发送的消息类型是 CONNECT(连接)、PUBLISH(发布)、SUBSCRIBE(订阅)、SUBACK(订阅确认)时,则会带有负荷[8]。

(1)CONNECT的消息体内容主要是:客户端的标识、订阅的主题、消息以及用户名和密码等。

(2)PUBLISH的消息体内容是要发布推送的消息。

(3)SUBSCRIBE的消息体内容主要包含要订阅的主题以及不同的服务质量。

(4)SUBACK的消息体内容是服务器对订阅的主题以及不同的服务质量进行确认和响应。

2 MQTT通信协议工作流程

MQTT通过话题机制在物联网设备间进行数据交换,每个客户端都扮演着两种角色,可以是发布消息的发布者角色,也可以是订阅主题的订阅者身份;而在传递消息通信过程中起着关键作用的是MQTT代理服务器,所有的客户端都会把发布的主题消息传送给中间件代理服务器,由代理服务器转发给订阅了该主题消息的所有订阅者。MQTT的信息交互模式如图5所示。

图5 MQTT通信交互模式

3 MQTT通信协议的应用

为验证MQTT协议格式的正确性,在PC机上搭载MQTT服务器,选用由北京智芯微电子科技有限公司研发设计的终端MQTT测试软件(V1.3)模拟配电物联网主站,并采用网络协议分析器Wireshark(V3.4.6)对报文数据流进行抓包。测试软件可以查看当前连接状态、发布订阅的主题等信息,业务信息里还可以对一些参数进行查询、预置和激活操作,也可以召测上线设备的遥信、遥测等数据,也可实现对设备的时钟同步和复位等控制。操作界面如图6所示。

图6 MQTT测试软件操作界面

配电物联网主站和边设备之间采用的面向对象具有互操作性的MQTT数据传输协议,边设备采用搭载MQTT通信协议的台区智能融合终端,考虑配电物联网主站与边设备信息交互类型多,本文只针对CONNECT报文进行分析,如图7所示。

图7 CONNECT报文结构分析

第一部分为固定报头,根据取值0001可知控制报文为连接类型,DUP位为0,为第一次发送请求,QoS等级为最低等级,只发送一次,报文剩余长度为71字节。

第二部分为可变长度,协议名称为MQTT,协议级别为04,代表协议版本号为V3.1.1,用户名和密码都置1,表示设备进行连接时需验证用户名和密码,Will Retain位置0表示遗嘱消息不作为保留消息发布,Will Flag置0代表了有效载荷中无需包含Will Topic和Will Message等字段信息。清除会话位置1表示当前的会话状态不能被随后的会话复用,保留位置0为系统默认值,否则服务端须断开与客户端的连接。保持连接值为60,协议定义时间间隔的单位为s,即没有报文交互时,客户端每60 s需向服务端发送保活消息,以确保会话的正常通信。

第三部分为有效载荷,包含了客户端的ClientID、用户名和密码等消息,不同控制报文类型下消息体内容和格式也是有一定差异的。

4 结 语

本文介绍了MQTT的开源、可靠、轻巧的设计思想,阐述了MQTT为低带宽和不稳定网络环境中的物联网设备提供可靠网络服务的优势。MQTT具有非常小的通信开销,支持多种流行编程语言的优点。虽然MQTT具有多项技术优势,但想大规模商用,还需要进一步完善和改进,比如要实现不同系统间互联互通必然需要不同的SDK包,不同的异构终端就需要与之对应的服务器;另外MQTT不具备处理音视频格式信号的能力,对音视频信息的传输不适用,这些问题将是今后需要重点解决的。

猜你喜欢

报头会话服务端
城市党报报头:政治与艺术的平衡
云存储中基于相似性的客户-服务端双端数据去重方法
新时期《移动Web服务端开发》课程教学改革的研究
在Windows Server 2008上创建应用
有意冒犯性言语的会话含义分析
汉语教材中的会话结构特征及其语用功能呈现——基于85个会话片段的个案研究
淡妆浓抹总相宜
——对中国晚报报头变化的研究与欣赏
IP语音报头压缩设计与实现
冲突语的会话分析研究
对外汉语课堂英语通用语的会话调整功能