概述
目录
1.数据格式
2.CONNECT报文
3.CONNACK
4.QOS服务质量
5.SUBSCRIBE订阅主题
6.SUBACK订阅确认
7.unsubscribe取消订阅
8.unsuback 取消订阅确认
9.publish发布消息
10.PUBACK发布消息确认
1.数据格式
一条MQTT消息由固定header + 可变报头 +有效载荷三部分组成。
- Fixed header:2bytes的固定header
- Variable header 可变报头
这部分和具体的连接消息类型有关系,不同的消息类型,可变报头不同
- Payload有效载荷:需要在payload前加上两个字节的报文长度!!
有些报文需要,有些不需要,具体到不同类型的报文上具体分析。
2.CONNECT报文
- 2.1 Fixed header(0x10 + 剩余长度)
- MQTT报文类型: 0x10代表connect报文
- 剩余长度:这个字节之后的报文长度。
(1) 对于小于128字节的数据,使用单字节编码(即第7位为0),使用后7位表示长度(低7位最大是127)。比如127 就是 10 7F
(2)对于大于等于128字节的数据,使用非单字节编码(即第7位为1),低字节在前,高字节在后,比如300就是1(第7位为1)010 1100 0000 0010 ,前8字节(010 1100)代表数字44, 后8字节(02代表256),即 10 AC 02
(3)剩余长度最多4个字节,第7位代表是否为单字节编码。
- 2.2 varied header
CONNECT报文的可变报头按下列次序包含四个字段:
(1)协议名(Protocol Name)
协议名是表示协议名 MQTT 的UTF-8编码的字符串 。UTF-8编码就是(2个字节的数据长度+payload)
(2)协议级别(Protocol Level)
下图代表3.1.1版本的MQTT协议
(3)连接标志(Connect Flags)
- 用户名标志 User Name Flag:0代表payload字段不能含有User name, 1代表payload字段必须有User Name
- 密码标志 Password Flag:0代表payload字段不能含有Password , 1代表payload字段必须有Password
(4)保持连接(Keep Alive)
4.1 这两个字节的数据代表一个以秒为单位的时间间隔,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。
4.2 客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端必须发送一个PINGREQ报文
- 2.3 有效载荷 payload
在云端会产生:设备名称,productKey,DeviceSecurity。 在下面的三个参数中,需要替换这三个内容。
客户端标识符 Client Identifier
用户名 User Name
密码 Password
3.CONNACK
服务端收到客户端的connect报文,于是回复一个connack报文
- fixed header 20 02
- varied header
sp:当前会话 Session Present
默认是0,当服务端收到varied header中的clear session标志位为1的connect报文,服务端需要把下发的CONNACK报文的sp置为0
连接返回码
- valid payload :
CONNACK报文没有有效载荷。
4.QOS服务质量
报文发送可能会丢失---->重发解决,QOS就是确定重发的等级
5.SUBSCRIBE订阅主题
在subscribe之前必须先connect!!!
subscribe()报文:客户端向服务端订阅(发送subscribe报文,包含QOS = 0的报文)---->服务端publish报文给客户端。
- Fixed header (0x82 ??)
- varied header 00 0A
- valid payload = 主题过滤器 + QoS等级
主题过滤器就是需要订阅的topic转换成16进制码,topic是一条一条的订阅的!!
6.SUBACK订阅确认
当client向Server发送Subscribe消息,服务端会返回发布确认消息
- Fixed header (0x90 ??)
- varied header
在client向Server发送subscribe消息的时候,subscribe消息的可变报头(比如0xA1)是定了的,然后对这条subscribe的回复消息,也就是suback消息,需要将可变报头的报文标识符设为一样的(即0xA1)。
- valid patyload
7.unsubscribe取消订阅
取消订阅必须在connect和subscribe了某个topic之后,才能unsubscribe这个topic
- fixed header 0xA2 ??
- varied header
这个地方的可变报头必须要和subscribe里面的报文标识符相对应!!!
- valid payload = (两字节的长度)+ 主题过滤器(参见subscribe的部分,没有QOS)
8.unsuback 取消订阅确认
当client向Server发送了unsubscribe的消息,Server端会发送unsuback消息到client
- Fixed header 0xB0 ??
- varied header
同理需要和‘subscribe的报文标识符对应!!!
- valid payload (没有,为空)
9.publish发布消息
client向Server发送一个消息(叫post),或者Sever向client发布一个消息 (叫set)
- Fixed header 30 ??
(1)Dup标志位
DUP标志被设置为0,表示这是客户端或服务端第一次请求发送这个PUBLISH报文。如果DUP标志被设置为1,表示这可能是一个早前报文请求的重发。
(2)Retain标志位 ????
- varied header = (2字节的header长度)+ topic + 报文标识符(只有在QOS为1或2的时候才有!!)
- valid payload:由两边的应用自定义!!一般写成Json数据。
10.PUBACK发布消息确认
只有QOS为 1或2才会响应
参考:3.2 CONNACK – 确认连接请求 · MQTT协议中文版
最后
以上就是强健百合为你收集整理的MQTT协议的全部内容,希望文章能够帮你解决MQTT协议所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复