- 1.连接请求
- 1.2 连接固定头
- 1.3 连接可变头
- 1.3.1 协议名称
- 1.3.2 协议版本
- 1.3.3 连接标记
- 1.3.3.1 全新开始标记(Clean Start)
- 1.3.3.2 遗言标记(Will Flag)
- 1.3.3.3 遗言Qos
- 1.3.3.4 遗言保持(Will Retain)
- 1.3.3.5 用户名称标记(User Name Flag)
- 1.3.3.6 密码标记(Passwword Flag)
- 1.3.3.7 连接保持标记(Keep Alive)
- 1.3.3.8 连接属性(CONNECT Properties)
- 1.3.3.9 接收最大值(Receive Maximum)
- 1.3.3.10 最大包大小(Maximum Packet Size)
- 1.3.3.11 标题别名最大值
- 1.3.3.12 请求响应信息(Request Response Information)
- 13.3.143 请求异常信息
- 1.3.3.15 用户属性(User Property)
- 1.3.3.16 授权方法(Authentication Method)
- 1.3.3.17 授权数据9(Authentication Data)
1.连接请求
客服端和服务端建立连接后,客户端发给服务端的第1个包必须为连接包。
客服端只可通过网络发送一次连接包。服务端必须将第2个客户端发送的连接包做为协议错误,并关闭网络连接。
负荷包含一个或多个编码域。他们分配一个唯一的客户端标识给客户端,一个遗愿主题、负荷数据,用户名和密码。
除了客户标识符可以忽略,所有其他的已经可变头标记决定是否存在。
1.2 连接固定头
1.3 连接可变头
连接包可变头包含如下顺序数据与:协议名称,协议版本, 连接标记,keep alive以及属性。
1.3.1 协议名称
协议名称使用UTF-编码字符串。
1.3.2 协议版本
客服端使用1字节的无符号整数代表协议版本(如下)
1.3.3 连接标记
协议标记字节包含了几个指定MQTT连接行为的参数,同时也标识来了负荷域是否存在。
1.3.3.1 全新开始标记(Clean Start)
位置: 连接标记: bit1
- 该位表明该连接是启动新对话或是当前已有对话的持续。
- 接收到 Clean Start置1的连接包,服务端和客户端必须丢弃当前的任何对话并启动新对话,同时
CONNACK的对话存在标识总是置0。 - 服务端接收到Clean Start置0的连接包,已有与客服标识符关联的对话,服务端必须基于已有对话状态,重启与客户端的连接。
- 服务端接收到Clean Start置0 的连接包,无客户端标识关联的对话,服务端必须创建新对话。
1.3.3.2 遗言标记(Will Flag)
位置:连接标记:bit2
遗言标记置1,表明一个遗言消息及相关联对话必须被服务器存储。遗言消息包括连接包的遗言属性,遗言主题,和遗言负荷域。在网络连接关闭且遗言等待时间到或对话结束后,遗言消息必须发布,除非遗言消息被服务端检测到或接受到断开连接包(包含消息码:0x00)或客户ID的网络连接在遗言时间到重新打开。
遗言消息需发布的情景如下:
1.服务端检测到网络I/O错误。
- 客服在Keep Alive的时间内不能通信。
- 客户端未先发DISCONNECT包(消息码:0x00),而关闭网络连接。
- 服务端未先发DISCONNECT包(消息码:0x00),而关闭网络连接。
遗言标记置1,遗言属性,遗言主题,遗言负荷必须存在于负荷中。
1.3.3.3 遗言Qos
连接标记: bit4,3
该标记指定发布遗言消息使用的质量服务级别。
遗言标记置0时,
1.3.3.4 遗言保持(Will Retain)
位置:bit 5
- 遗言标记置0时,遗言保持标记必须置0.
- 遗言标记置1且遗言保持标记置0时,服务端必须以非保持消息发布遗言消息。。
- 遗言标记置1且遗言保持标记置1时,服务端必须将遗言作为保持消息发布。
1.3.3.5 用户名称标记(User Name Flag)
位置: bit 7
- 用户名称标记置0, 负荷里不可包含用户名。
- 用户名称置1, 负荷必须包含用户名。
1.3.3.6 密码标记(Passwword Flag)
位置: bit 6
- 密码标记置0 ,负荷不可包含密码。
- 用户标记置1, 负荷必须包含密码。
1.3.3.7 连接保持标记(Keep Alive)
保持连接为一个2字节整数,定义了以秒为单位的时间间隔。它指定了客户端完成一个MQTT控制包传输和启动文本传输的最大时间间隔。客服端必须保证发送MQTT控制包间隔不超过连接间隔。
连接间隔非0时,发送任何MQTT控制包前,客服必须发送一个请求(PINGREQ)包。
服务端返回一个服务端连接时间置,客服端必须用改置替换。
无论连接时间置多少,客服端任何时候都可以发送PINGREQ,并经有检查相应的响应(PINGRESP)来判断网络和服务端是否可用。
连接有效值非0,在1个办周期的连接有效时间内,服务端未接收到可端的MQTT控制包,服务端必须关闭客服端的网络连接。
客服端发送PINGREQ后,在可见的时间内未接收到PINGRESP包,它必须关闭与服务端的连接。
连接有效时间为0,连接保持机制失效。
1.3.3.8 连接属性(CONNECT Properties)
- 属性长度
连接包可变头的属性长度编码为可变字节整数。
- 会话有效时间(Session Expiry Interval)
17(0x11), 会话有效时间隔标识
后跟4字节整数代表会话有效时间。包含多个会话有效时间为协议错误。
当会话有效时间未设置,默认为0,。会话有效时间置0或未设置,网络关闭时时会话结束。
会话有效时间隔为0xFFFFFFFF,会话一直有效。
会话有效时间大于0时,服务端和客服端于网络连接关闭后,必须保持会话状态。
1.3.3.9 接收最大值(Receive Maximum)
33(0x21), 接收最大值标识,后跟2字节整数代表接收的最大值。包含接收最大值超过一次或其值为0,即为协议错误。
客户端基于该值来限制将要并发处理的QoS1和QoS2de 的发布次数.
1.3.3.10 最大包大小(Maximum Packet Size)
39(0x27), 最大包大小,后跟4字节整数代表客户端可接收的最大包大小。
该值只能包含一次且不可为0,否则识别为协议错误。
服务端不可发送超过最大包大小的包给客户端,如果客户端接收到包的大小超过改制,识别为协议错误。
客户端返回DISCONNNECT(错误码0x95).
1.3.3.11 标题别名最大值
34(0x22),标题别名最大值标识码,后跟2字节整数代表标题别名最大值。改值只能保护一次,否则识别为协议错误。标题别名最大值默认为0。
该值表明客户端允许接收的服务端发送的标题别名最大值。
客户端基于该值来限制其连接需要保持的标题别名数。
1.3.3.12 请求响应信息(Request Response Information)
25(0x19),请求响应信息标识,后接一个字节整数,取值0或1,默认值为0
值为0时标识服务端不许返回响应信息,值为1服务端在CONNACK包中返回响应信息
13.3.143 请求异常信息
23(0x17),请求异常信息标识,后接一个字节,值为1或0,,默认为1.
1.3.3.15 用户属性(User Property)
38(0x26) 用户属性标识,后跟一个UTF-8字符串对。用户属性可出现多次,代表多个键值对。
1.3.3.16 授权方法(Authentication Method)
21(0x15),授权方法标识符,后跟一个UTF-8编码字符串,包含扩展授权的授权方法名称。协议只可包含一次,否则识别为协议错误。如果无授权防范,扩展授权不执行。
客户端在CONNECT中设置授权方法,其不能发送任何AUTH或DISCONNECT包直至收到CONNACK 保留。
1.3.3.17 授权数据9(Authentication Data)
22(0x16), 授权数据标识码,后跟二进制授权数据。无授权方法时,包含授权数据识别为协议错误。
包含多次授权数据识别为协议错误。