MQTT协议

目录

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协议中文版 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值