连接主要是客户端主动连接服务端,涉及到的控制报文有CONNECT,CONNECT ACK。
一、场景示意图
二、过程简述
客户端首先发出连接报文,即CONNECT报文。CONNECT的报文的组成包括:固定报文头。第一个字节是控制报文标识符,紧接着的字节为报文的剩余长度,这个剩余长度是不包含固定报文头的;
协议名。协议名这一段包含两个部分,前一部分是协议名的长度(指示这个协议名有多少个字节),占两个字节,MSB与LSB;后一部分是协议名字符,使用UTF-8编码。如下图。
协议的级别。共占一个字节,如4代表协议为3.11版本;
连接标识。连接标识占一个字节,每个位表示不同的含义。置位的位后面的报文将携带其对应的内容,清零的位将不会携带。对于每个字段,这里作简单介绍,详细介绍可参见MQTT协议。(1)第0位为保留位,必须设置为0;
(2)第1位是会话保持,如果设置为0,那么连接断开之后服务端将不会保留客户端的会话信息,比如订阅的主题、未发送的消息等等;
(3)第2位是遗嘱,设置为1表示该连接有遗嘱,当连接意外断开后服务端将发送客户端设置的遗嘱消息;
(4)第3、4位是遗嘱的QoS,遗嘱也是一个主题消息,所以可以设置服务质量,可以设置为0、1、2三种服务质量;
(5)第5位决定遗嘱是否可以保留,即如果保留的话后面连接的客户端且订阅遗嘱主题的都会接收到该消息;
(6)第6、7位是用户名和密码位;保持连接时间。共占两个字节,超过保持连接时间的1.5倍服务端还没有收到客户端的控制报文,服务端将会主动断开连接。
后面将会根据4中的已经置位的位添加报文信息。添加的顺序必须是客户端标识符,遗嘱主题,遗嘱消息,用户名,密码
服务端在接收到客户端的连接报文之后,需要回复CONNECT ACK报文,否则客户端将在超时后断开网络连接。CONNECT ACK报文组成如下。
1.固定报文头。第一个字节是控制报文标识符,紧接着的字节为报文的剩余长度,这个剩余长度是不包含固定报文头的;连接确认标识。占一个字节,1~7位为保留位,须设置为0,第0位为当前会话位。如果服务端已经保存有该客户端的会话,那个第0位应设置为1,否则设置为0;
连接返回码。占一个字节,所有的状态值如下。