MQTT协议说明
MQTT是应用层协议,是建立在TCP通讯层协议之上的协议,所以使用MQTT之前必须建立TCP连接.
- MQTT服务质量等级 ( 0 1 2 )
服务质量等级说白了就是确认次数,这个字段表示应用消息分发的服务质量等级保证.
一般的云服务器只支持服务质量等级0和1,等级2需要反复确认,消耗资源较多,所以大多数云服务器都不支持.
- TCP和UDP的关系
TCP是建立在可靠连接的基础之上的,而UDP则是不可靠的,但是TCP相比UDP而言,消耗资源较多,所以根据使用情况确定.
- MQTT报文类型( C代表服务器 S代表客户端)
1.CONNECT报文(连接报文 1)
CONNECT报文分为两部分,固定报头和可变报头,
- 固定报头
固定报头有两个字节,报文类型和剩余长度.
转换成十六进制
BYTE1 报文类型 10
BYTE2 剩余长度 ??
- 可变报头
可变报头共有四部分组成:协议名
协议名 协议级别 连接标志 保活时间
1.协议名前两个字节代表长度,后面部分则代表连接类型.
转换成十六进制 协议名 00 04(长度) 4D 51 54 54(MQTT)
2.协议级别
根据使用的MQTT的版本,协议级别为LEVEL4
转换成十六进制 协议级别 04(长度)
3.连接标志
BYTE7 用户名 1
BYTE6 密码 1
BYTE5、4、3、2 遗嘱功能
BYTE1 清除恢复对话 1清除 0不清除、继续接收未接收的数据内容
BYTE0 保留标志位,没用 0
转换成十六进制 连接标志 C2
4.保活时间
防止占用云服务器资源,BYTE1、2 任意写 基本都是100S
转换成十六进制 保活时间 00 64
报文后面跟客户端ID 用户名和密码
以阿里云为例,查看MQTT连接文档
客户端ID:D001|securemode=3,signmethod=hmacmd5|
转化成16进制如下:44 30 30 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 6D 64 35 7C
需添加两字节长度标识符 最终为 00 25 44 30 30 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 6D 64 35 7C
用户名:D001&i5drb0tO5li
转换为16进制如下: 44 30 30 31 26 69 35 64 72 62 30 74 4F 35 6C 69
需添加两字节长度标识符 最终为 00 10 44 30 30 31 26 69 35 64 72 62 30 74 4F 35 6C 69
密码:clientId D001 deviceName D001 productKey i5drb0tO5li
密码需用signmethod的加密方式,本次使用为hmacmd5,在百度直接搜加密解密就行,加密密码在阿里云产品管理中.
hmacmd5加密结果:6eaf5eab8f45bdec03ee40cb439ed719
转换为16进制如下:36 65 61 66 35 65 61 62 38 66 34 35 62 64 65 63 30 33 65 65 34 30 63 62 34 33 39 65 64 37 31 39
需添加两字节长度标识符 最终为 00 20 36 65 61 66 35 65 61 62 38 66 34 35 62 64 65 63 30 33 65 65 34 30 63 62 34 33 39 65 64 37 31 39
计算数据剩余长度(可变+负载) ??以后的数据 128进位1
最终为101 转换成十六进制 0x65
最终CONNECT报文为:
10 65 00 04 4D 51 54 54 04 C2 00 64 00 25 44 30 30 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 6D 64 35 7C 00 10 44 30 30 31 26 69 35 64 72 62 30 74 4F 35 6C 69 00 20 36 65 61 66 35 65 61 62 38 66 34 35 62 64 65 63 30 33 65 65 34 30 63 62 34 33 39 65 64 37 31 39
总结: CONNECT报文由 10(报文类型)+65(有效长度)+00 04 4D 51 54(协议名)+04(协议级别)+C2(连接标志)+00 64(保活时间)+客户端+用户名+密码构成
2.CONNACK报文(2) 服务器应答客户端报文
CONNACK报文返回值如下所示,根据返回值判断连接是否成功或查找错误类型
成功连接应返回20(报文类型 ) 02(剩余字节) 00 00(看文档)
3.PINGREQ(心跳保活 12)、PINGRSP(PING命令回复 13)、DISONNECT(断开连接 14)
- PINGREQ(心跳保活 12)
根据文档可知,PINGREQ报文为 C0 00,字节1为报文类型(12) C0,字节2为剩余长度,不需要剩余长度,所以为00,主要作用就是保活连接.
- PINGRSP(PING命令回复 13)
PINGRSP报文是PINGREQ保活报文的回复报文,由服务器向客户端发送的.配对使用
根据文档可知,PINGREQ报文为D0 00,字节1为报文类型(13) D0,字节2为剩余长度,没有剩余长度,所以为00,主要作用就是回复连接状态.
- DISONNECT(断开连接 14)
DISONNECT报文是用来与服务器断开连接的命令.
根据文档可知,DISONNECT报文为E0 00,字节1为报文类型(14) E0,字节2为剩余长度,没有剩余长度,所以为00,主要作用就是与服务器断开连接状态.
---------------------
作者:鸡蛋鸭蛋荷包蛋
链接:https://bbs.21ic.com/icview-3281580-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。