图片86
本文小编将为大家介绍物联网数据传输协议MQTT格式举例。
(1)CONNECT-连接请求信息。
客户机与服务端的网络连接建立之后,向服务端发送的第一条消息必须是连接服务端报文的CONNECT。它的形式如下:
通过网络连接,客户机只能发送一次CONNECT消息。由客户机发送的第二个CONNECT消息必须被服务方视为协议违规处理,并且断开客户机连接。CONNECT消息头的第一个字节固定为0x01,表示CONNECT数据,而第二个字节则表示剩余数据包的长度。可修改的标题包括以下四个字段:
协定名称(Protocol Name),其值被固定为UTF-8编码的字符串,其值被固定为字符“MQTT”,随后的MQTT规范版本将不改变该字符串的偏移和长度。占据6个字节。
协定级(Protocol Level),值对于MQTT3.1.1来说是4,占用了1个字节。
版本为3.1.1协议提供了协议级字段值4(0x04)。如果找到了不受支持的协议级别,服务方必须提供CONNACK消息文来响应CONNECT消息文,并返回码0x01(不支持的协议级别),然后断开客户端。
连接标志(Connect Flags):连接标志字节包含一些参数,用来指定MQTT连接行为。这也指示有效载荷中的字段是否存在。byte8[0]必须为0,否则将中断连接。
User Name Flag):在消息主体中为1否0具有用户名段。
口令识别(Password Flag):在消息体中为1否0具有密码域。
“遗嘱信息”Retain标识(Will Retain):确定遗嘱消息为1否0是Retain消息。“遗嘱保留”标记(Will Retain)标记也必须设置为0。如遗嘱标记设为1:
若遗嘱保留被设为0,则服务方必须将遗嘱讯息作为无保留讯息公布。
若遗嘱保留被设为1,则服务方必须将遗嘱讯息作为保留讯息公布。
意愿信息QOS识别(Will Qos):用Qos识别遗嘱信息,2bit。若意愿标记被设为0,则必须将遗嘱QoS设置为0(0x00)。
意愿识别(Will Flag):标识使用了1否0。
Session Clean Session):标识客户端是0否1,创建一个持久会话。将Clean Session的标识设置为0时,表示客户想要建立一个持久会话的连接,代理会存储那个Client订阅的主题和未接受的消息,不然(设置为1)Broker将不存储该数据,而在连接建立时清除该Client之前存在的持久会话保存的数据。只有QoS级别大于等于1的消息才能生效。
连通性保持(Keep Alive):将一个单位的时间间隔设置为秒,指的是当客户端传送完成一条控制消息的那一刻,在client和broker之间允许空闲的最大间隔(单位:秒),MQTT协议规定:在1.5*Keep Alive的时间间隔内,Broker不能从Client接收任何包,Broker就会认为它与客户端之间的连接已被中断;同样,若客户端未从代理接收到任何信息包,则客户端认为客户端与代理之间的连接已中断。MQTT也有一对PINGREQ/PINGRESP包,Keep Alive的约定和侦测连接状态是在Broker和Client之间不传送任何数据包时才能得到满足。
CONNECT的payload字段取决于可变消息头的连接标志是否存在,如果存在,则必须按照客户机标识符(client ID),“意愿主题”(will topic)、用户名(user name)和密码(password)的次序,其中客户机标识符(client ID)必须为CONNECT消息有效负载的第1个字段,代码必须使用UTF-8。
服务方使用客户标识符(ClientId)来识别客户机。每一个连接到服务端的客户机都有一个惟一的客户标识符(Client Id)。意志主题(will topic)、用户名(user name)和口令(password)这三个字段分别由长度和有效负载两个字节组成,表示为零字节或多个字节序列。length给出的字节数是后面跟着的数据,没有长度字段本身所占的字节。
(2)CONNACK——确认连接请求信息。
服务方发送CONNACK消息以响应来自客户端的CONNECT消息。服务方向客户机发送的第一条消息必须为CONNACK。若客户机在合理的时间内未接收到服务端的CONNACK消息,则客户机应关闭网络连接。该报告的格式如下:
除固定头外,可变消息图中有两个域:连接确认标记(Connect Acknowledge Flags)和连接返回码(Connect Return code)。
Connect Acknowledge Flags只使用了第0位,而第0(也称为SP)位是当前会话(Session Present)标记。除了将CONNACK报文文中的返回代码设置为0外,如果服务端接收到一个清除会话(Clean Session)标志为1的连接,您还必须将CONNACK报文中的当前会话设置(Session Present)标志为0。
若服务端接收到Clean Session为0的连接,则当前会话标记的值取决于ClientId与客户端的会话状态是否已保存。
若服务端已保存会话状态,则必须在CONNACK报文中将SP设置为1。
若服务端没有保存的会话状态,则必须将CONNACK报文中SP的SP设置为0;CONNACK报文中的返回代码也必须设置为0。(在此期间连接成功)
SP使得服务端和客户机对于存储的会话状态是否存在一致性。
在完成会话的初始化设置之后,已保存会话状态的客户机将希望服务端保持其存储的会话状态。当客户机从服务端接收到的当前值不符合预期时,客户可能选择继续此会话或断开连接。通过断开连接,将清除会话标志设置为1,再次连接,客户端和服务端之间的会话状态被丢弃,然后再次断开。
若服务端发送了包含非0返回码的CONNACK报文,则必须将当前会话标志设置为0。
Connect Return code使用以下表格所列的一个字节的无符号值连接返回码:
(3)PUBLISH:签发消息报文。
PUBLISH控制消息意味着客户端将应用消息从客户端发送到客户端或服务端。客户机使用PUBLISH消息将应用消息发送到服务端,用于分发与其他订阅匹配的客户机。服务方使用PUBLISH消息向每个订阅匹配的客户机发送应用消息。它的形式如下:
首个字节是固定头,其消息类型(0x03)高4位,而低4位则具有3个重要标志位:
重发标志 DUP:如果将DUP标志设置为0:这意味着客户端或服务端首次请求发送此PUBLISH消息。DUP标记必须将QoS0的消息设置为0。若DUP标志设置为1:指示这可能是先前消息请求的重发。当客户端或服务端请求重发PUBLISH报文时,DUP标志必须设置为1。
QoS:PUBLISH消息文不能将所有QoS的比特设置为1。当服务端或客户机接收到QoS所有位均为1的PUBLISH报文,它必须关闭网络连接。在QoS设置为1时,客户机或服务器发出消息时,需要对方确认(PUBACK),如果一段时间之后没有收到PUBACK,则会再次发送当前消息,DUP域被标记为1。
保持标记RETAIN:如果服务端接收到一个QoS0消息,保留(RETAIN)标志为1,则必须放弃该主题之前保留的所有消息。这条新的QoS0消息应当被视为该主题的新保留消息,但可以在任何时候放弃该消息—如果出现这种情况,则该主题不会保留。
服务方向客户端发送PUBLISH消息,如果该消息是作为客户机一个新订阅的结果发送,则该消息必须设置为1[MQTT-3.3.1-8]。如果向客户机发送PUBLISH报文是因为与已建立的订阅相匹配,无论服务端接收的此消息中保留标记的值是多少,服务端必须将该标记设置为0。
标记为1和零字节的PUBLISH消息被服务端作为普通消息来处理,并将其发送到与订阅主题匹配的客户端。另外,同一主题下的现有保留消息必须被删除,这样超过了此主题的所有订户将不再收到保留消息。
PUBLISH的可变头。
可更改的标题包括连续的主题名称(Topic Name)和消息标识符(Packet Identifier)。
主题名(Topic Name)是用来确定应该向哪个信息渠道发送有效负载数据。PUBLISH消息的主题名称必须与服务端发送到订阅客户端的主题过滤器相匹配。
消息标识符Packet Identifier:仅当QoS级别为1或2时,才会出现消息标识符(Packet Identifier)字段。PUBLISH消息,QoS等于0不能包含消息标识符。
消息标识符用来区分报文,尤其是用于在重发消息中标识同一消息是否为同一消息,并用于决定向哪个发送消息的回应。可更改消息头的消息标识符(Packet Identifier)字段存在于多种消息类型中(占2个字节)。
PUBLISH报文的收件人必须按照PUBLISH报文文章所述QoS级别发送响应,请参阅QoS过程。
(4)SUBSCRIBE订阅信息。
客户机将SUBSCRIBE报文发送到服务端,用于创建一个或多个订阅。每一个订阅注册一个客户关注的主题。要把应用消息转发给那些符合这些订阅的主题,服务端向客户机发送PUBLISH消息。SUBSCRIBE消息也(针对每一个订阅)指定最高的QoS级别,服务方根据该消息发送到客户端。SUBSCRIBE消息格式如下:
SUBSCRIBE报文的有效负载必须至少包含一对主题过滤器和一个QoS分级字段组合。每个筛选器后跟在一个字节之后,这个字节称为服务质量需求(Requested QoS)。在服务端将应用消息发送给客户机时,其QoS的最高级别。所要求的最大服务质量等级QoS:字段被编码成一个字节,主题过滤器和QoS等级组合都被连续包装。
若一方接收到SUBSCRIBE报文,则该报文的主题过滤器与现有订阅的主题过滤器相同,则必须用新的订阅完全替换现有的订阅。新建订阅使用的主题过滤器与前一个订阅相同,但其QoS值可有所不同。任何符合此主题筛选器的现有保留消息都必须被重发,但发布过程不能中断。
若主题筛选器与现有订阅的任何过滤器不同,则服务端将创建新的订阅,并发送所有匹配的保留消息。
当一方接收到一个SUBSCRIBE报文时,它必须像接收到一系列的SUBSCRIBE消息那样处理该消息,除需要将其响应合并为单个SUBACK消息发送之外[MQTT-3.8.4-4]。
当客户机使用带有通配符的主题筛选器请求订阅时,客户机的订阅可能会重复,所以发布的消息可能与多个过滤器匹配。在此情况下,服务端必须向符合QoS级别最高的所有订阅客户端分发消息。在服务一方之后,每个匹配的订户都可以根据订阅的QoS级别,将消息的副本分发给他们。
(5)SUBACK订阅确认信息。
服务方接收到客户机发送的SUBSCRIBE消息时,必须使用SUBACK消息响应,消息格式如下:
以MQTT方式控制消息类型(0x9),其中还有长度域:等于一个可变报头的长度加一个有效负载的长度。Volatile头包含一个消息标识符,用于等待确认的SUBSCRIBE消息,占用2个字节。SUBACK消息必须与等待确认的SUBSCRIBE消息具有相同的消息标识符。SUBACK消息包含一个返回码清单,它指定了授予SUBSCRIBE请求的每个订阅的QoS最高级别。传回代码的顺序必须与SUBSCRIBE报文中的主题过滤顺序相同。