MQTT笔记:MQTT简介及控制报文简述
一、简介
MQTT(消息队列遥测传输)是 ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。 工作在 TCP/IP 协议族上, 是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议, 为此,它需要一个消息中间件 (服务器) 。
通过 MQTT 协议, 目前已经扩展出了数十个 MQTT 服务器端程序, 可以通过 PHP, JAVA,Python,C, C#等系统语言来向 MQTT 发送相关消息。此外, 国内很多企业都广泛使用 MQTT 作为 Android 手机客户端与服务器端推送消息的协议。
MQTT 由于开放源代码, 耗电量小等特点。 在物联网领域, 传感器与服务器的通信,信息的收集,MQTT 都可以作为考虑的方案之一。 在未来 MQTT 会进入到我们生活的各各方面。
二、特性
MQTT 协议是为大量计算能力有限, 且工作在低带宽、 不可靠的网络的远程传感器和控制设备通讯而设计的协议, 它具有以下主要的几项特性:
● 使用发布/订阅消息模式, 提供一对多的消息发布, 解除应用程序耦合;
● 对负载内容屏蔽的消息传输;
● 使用 TCP/IP 提供网络连接;
● 有三种消息发布服务质量:至多一次、至少一次、只有一次;
● 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化, 以降低网络流量;
三、实现方式
实现 MQTT 协议需要客户端和服务器端通讯完成, 在通讯过程中, MQTT 协议中有三种身
份: 发布者(Publish) 、 代理(Broker) (服务器) 、 订阅者(Subscribe) 。 其中, 消息的发布者和订阅者都是客户端, 消息代理是服务器, 消息发布者可以同时是订阅者。
MQTT 传输的消息分为: 主题(Topic) 和负载(payload) 两部分:
● Topic, 可以理解为消息的类型, 订阅者订阅(Subscribe) 后, 就会收到该主题的
消息内容(payload) ;
● payload, 可以理解为消息的内容, 是指订阅者具体要使用的内容。
四、MQTT控制报文
MQTT协议都是通过控制报文的形式进行通信的,控制报文的列表如下所示:
控制报文一般由三个部分组成:
1.固定报头: 所有的报文都包含;
2.可变报头: 部分报文包含;
3.有效载荷: 部分报文包含。
4.1 固定报头
固定报头的格式如下图所示:
第一个字节分为两个部分,高4位表示控制报文的类型,其内容就是控制报文的值,比如connect报文,其4位值为0001;低4位是报文的标志位,每个控制报文都有自己的标志位,如下图:
剩余长度
固定报头的第2个字节及以后是剩余长度,其表示可变报头与有效载荷的总字节数,用16进制表示。
每个剩余长度有8bit组成,其中bit0-bit6表示剩余长度字节数,bit7表示溢出位。一个字节的剩余长度最对只能表示0-127范围内的字节数,当剩余长度字节数大于128个时,就需要将bit7置为1,在开辟一个字节来表示没有表示完的剩余长度字节数。总结一句话就是逢128进1。
例:
当可变报头与有效载荷的总字节数为124时:
剩余长度在128以内,一个字节表示就足够,bit7为0,124的二进制为111 1100, 再加上bit7 0111 1100 ,十六进制为7C。
例:当可变报头与有效载荷的总字节数为321时:
剩余长度大于128,一个字节不够,第一个字节的bit为1。由于321%128 = 65,321/128 = 2。
第一个字节为65,65的二进制为 0100 0001,再加上bit7 1100 0001,十六进制为C1;
第二个字节为2,在128以内bit7为0,二进制为0000 0010, 十六进制为02
将两个字节结合 C1 02,就是321的剩余长度。
下图是各个字节的范围:
求剩余长度参考程序:
fixed_len = 1;
temp_buff[0] = 0x10;
do{
temp = Remaining_len % 128;
Remaining_len = Remaining_len / 128;
if(Remaining_len > 0)
temp |= 0x80;
temp_buff[fixed_len] = temp;
fixed_len++;
}while(Remaining_len > 0);
4.2可变报头与有效载荷
在具体的报文里介绍,参考后续文章。
参考文献
https://blog.csdn.net/qq_24550925/article/details/86362073