一.MQTT报文格式
MQTT是建立在TCP IP上的应用协议,按我的理解就是建立好TCP IP 连接后,按照MQTT的格式进行发送就可以。本次以connect为例子,查看如何连接云平台。
MQTT分为3部分固定报头+可变报文+有效负荷
1.1固定报头
可以看出固定包头包含两部分(2 byte):1.是控制报文的类型(16种)+控制报文类型的标志位,2是剩余长度。
1.1.1控制报文类型
1.1.2控制报文标志位![](https://i-blog.csdnimg.cn/blog_migrate/b6e2deda26db78465ceb29cce08cfdb1.png)
例子:1.综上我们使用connect,应为0001 0000,即:0x10
1.1.3剩余长度
剩余长度指的是可变报头+负载的数据。比较特殊的一点是,数据的长度采用类似于127进1的方法,需要尤其注意,可参考下图。
例子:1.综上我们使用connect,应为0001 0000,即:0x10
2.剩余长度暂时设为 0x??
1.2可变报头
connect 报文分为:协议名,协议级别、连接标志、保持连接4部分
1.2.1协议名
例子:
固定报头:
1.综上我们使用connect,应为0001 0000,即:0x10
2.剩余长度暂时设为 0x??
可变报头:
1.前两位固定:0x00,0x04
2.后面跟着MQTT(字符):4D 51 54 54 (可以使用网络调试助手字符转16进制)
1.2.2协议级别
例子:
固定报头:
1.综上我们使用connect,应为0001 0000,即:0x10
2.剩余长度暂时设为 0x??
可变报头:
1.前两位固定:0x00,0x04
2.后面跟着MQTT(字符):4D 51 54 54 (可以使用网络调试助手字符转16进制)
3.协议级别:固定为4,0x04
1.2.3 连接标志
onenet、阿里、腾讯连接都需要3元素,需要账号、密码,5、4、3、2位为遗嘱设置先不考虑,1为清楚会话,设置为1,不保留数据。0位不能更改,只能是0.
例子:
固定报头:
1.综上我们使用connect,应为0001 0000,即:0x10
2.剩余长度暂时设为 0x??
可变报头:
1.前两位固定:0x00,0x04
2.后面跟着MQTT(字符):4D 51 54 54 (可以使用网络调试助手字符转16进制)
3.协议级别:固定为4,0x04
4.连接标志:1100,0010,即0xC2
1.2.4 保持连接
设置与服务器不通信可以保持多久连接,如果不发送数据,需要在保持连接时间内发送保活数据。 一般都是服务器的最大保持连接时间。这里设置2分钟,因为是2byte,所以为0x00,0x78
例子:
固定报头:
1.综上我们使用connect,应为0001 0000,即:0x10
2.剩余长度暂时设为 0x??
可变报头:
1.前两位固定:0x00,0x04
2.后面跟着MQTT(字符):4D 51 54 54 (可以使用网络调试助手字符转16进制)
3.协议级别:固定为4,0x04
4.连接标志:1100,0010,即0xC2
5.保持连接:120秒,0x00,0x78
1.3有效载荷(payload)
1.3.1onenet参数
客户端ID:设备ID,即901505824
用户名:产品ID,即491644
密码:鉴权信息,即123456
1.3.2 有效载荷说明
发送3元信息使用UTF8格式 即在发送每一个信息之前都要加上发送数据的个数。
例子:
固定报头:
1.综上我们使用connect,应为0001 0000,即:0x10
2.剩余长度暂时设为 0x??
可变报头:
1.前两位固定:0x00,0x04
2.后面跟着MQTT(字符):4D 51 54 54 (可以使用网络调试助手字符转16进制)
3.协议级别:固定为4,0x04
4.连接标志:1100,0010,即0xC2
5.保持连接:120秒,0x00,0x78
有效载荷
1.客户端ID:00,09,39 30 31 35 30 35 38 32 34
2.用户名: 00,06,34 39 31 36 34 34
3.密码:00,06,31 32 33 34 35 36
至此就可以算出固定报头中的??,应该为00 04 4D 51 54 54 04 C2 00 78 00 09 39 30 31 35 30 35 38 32 34 00 06 34 39 31 36 34 34 00 06 31 32 33 34 35 36 个数之和,即37,0x25。
得出实际的例子:
固定报头:
1.综上我们使用connect,应为0001 0000,即:0x10
2.剩余长度暂时设为 0x25
可变报头:
1.前两位固定:0x00,0x04
2.后面跟着MQTT(字符):4D 51 54 54 (可以使用网络调试助手字符转16进制)
3.协议级别:固定为4,0x04
4.连接标志:1100,0010,即0xC2
5.保持连接:120秒,0x00,0x78
有效载荷
1.客户端ID:00,09,39 30 31 35 30 35 38 32 34
2.用户名: 00,06,34 39 31 36 34 34
3.密码:00,06,31 32 33 34 35 36
即10 25 00 04 4D 51 54 54 04 C2 00 78 00 09 39 30 31 35 30 35 38 32 34 00 06 34 39 31 36 34 34 00 06 31 32 33 34 35 36
二.MQTT报文发送测试
选择TCP Client, 远程主机:183.230.40.39:6002,
固定报头:10 25
可变报头:00 04 4D 51 54 54 04 C2 00 78
有效载荷:00 09 39 30 31 35 30 35 38 32 34 00 06 34 39 31 36 34 34 00 06 31 32 33 34 35 36
选择十六进制发送:10 25 00 04 4D 51 54 54 04 C2 00 78 00 09 39 30 31 35 30 35 38 32 34 00 06 34 39 31 36 34 34 00 06 31 32 33 34 35 36
可以看到发送成功!!!!!!!!!!!!!!!