简介
MQTT (Message Queue Telemetry Transport),遥测传输协议,其主要提供了订阅/发布两种消息模式,更为简约、轻量,易于使用,特别适合于受限环境(带宽低、网络延迟高、网络通信不稳定)的消息分发,属于物联网(Internet of Thing)的一个标准传输协议。
MQTT支持三种消息发布服务质量(QoS):
1.“至多一次”(QoS==0),消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
2.“至少一次”(QoS==1),确保消息到达,但消息重复可能会发生。
3.“只有一次”(QoS==2),确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
消息类型

MQTT协议内容
在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。MQTT数据包结构如下:
(1)固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
(2)可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
(3)消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。
固定头


控制报文的类型【7~4bit】:用于标示类型,如:连接(CONNECT)报文,发布(PUBLISH)报文等。他占了四个字节。如:连接报文对应二进制:0001。
制报文类型的标志位:这里包含的内部比较多。分别为:标示发送重复数(DUP)【3bit】 (1字节) 、服务质量 (QoS)[2~1] (2字节)、保留标志(RETAIN)[0](1字节)。同样子他也占了四个字节
decData.ctrlType=(MqttCtrlType)(srcBuff[0]&0xF0) >>4;
decData.publish.qosType=(srcBuff[0]&0x06)>>1;

剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。
剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码。更大的值按下面的方式处理。低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节,且按照大端方式进行编码。因此每个字节可以编码128个数值和一个延续位(continuation bit)。剩余长度字段最大4个字节。
例如,十进制数35会被编码为一个字节,数值是35,十六进制表示为0x23,。十进制数字321(=65+2*128)被编码为两个字节,最低有效位在前。第一个字节是 65+128=193。注意最高位为1表示后面至少还有一个字节。第二个字节是2。
十进制数321=0xC1,0x02
注意(上面没看懂的看这):
还是拿300举例,十进制300 转换成二进制就是100101100,即0x012C。由于100101100 超过7位,已经不能用一个字节表示了(一个字节的最高位是指示位,故一个字节只有7位数据位)。所以我们就要将这个二进制数切割成10 和0101100,然后低位加上一个为1 的符号为成为10101100,即0xAC,然后放在前面,高位的10 直接写在后面,符号为为0,即0x02。
所以,最终十进制的321 化为剩余长度形式就是0xAC,0x02。
