前言
- 该笔记学习自mqtt
- 参考1
- 参考2
简介
- 消息发送者先将消息发送服务器的主题,主题也可以理解为通道,消息接收者通过主题接收消息
- 消息服务质量
QoS0 至多一次:消息发送者只发送一次消息,消息接收者没有接到也不会再发了
QoS1 至少一次:消息发送者持续不断的发送消息,消息接收者接收到了也还会再发
QoS2 只有一次:消息发送者只发送一次,且确保这一次被消息接收者接收到
- 概念
- 主题
消息发送者和消息订阅者会通过主题进行消息通信
例如 char/aaa/12 就是三个层级的主题
例如消息接收者通过主题 char/+/bbb 订阅消息,那么他就可以订阅到 char/aaa/bbb 或者 char/ccc/bbb 发送的消息(加号表示通配符,即任意字符串)
例如消息接收者通过主题 char/# 订阅消息,那么他就可以订阅到 char/aaa/bbb 或者 char/ccc/ddd 发送的消息 (井号表示通配符,即任意层级的字符)
带有通配符的主题只能放在消息接收者这一方
- mqtt数据包结构
固定报文头
可变报文头
报文体
- 固定报文头
分为2个部分,byte1和byte2
byte1包括mqtt数据包类型和类型的具体标识
byte2主要是可变报文头和报文体的长度
- mqtt数据包类型如下
- 不同mqtt数据包类型的具体标识如下
- QoS
订阅者收到消息的QoS级别取决于发布消息的QoS和订阅消息的QoS
- byte0
byte0可以为0或1,若为1则表示这条消息为保留消息
保留消息表示,如果有新的订阅者订阅该主题,那么也可以接收到最近的消息
- 可变头
- 协议名
- 协议版本号
- clean session
- will flag
设置为1表示会存储遗言消息,设置为0则不会存储
- will QoS
表示遗言消息的消息质量
- will reation
遗言消息是否是一个保留消息
- username flag 和passwor flag
表示消息负载中是否去携带用户名或密码,为1时则携带
- 心跳时长
客户端会给服务端发送ping req表明客户端还活着,服务端会给客户端会ping resq表明服务端还活着
心跳时长表示客户端和服务端之间两次数据包间隔的最大时长
超过心跳时长时,会进行一次心跳检查,(ping req和ping resp)
当服务端在心跳时长的1.5倍时间内没有接收到客户端发送的数据包,则会认为客户端掉线了,就会主动断开客户端
当客户端一段时间内没有接收到服务端的的ping resp,则会认为服务端掉线了,同样也会主动断开连接
- 连接确认标识
都必须设置为0,表示这是一个session present
-连接返回码
表示连接失败的原因
- 主题名称
表示往那个主题中发布消息
- message id
消息的标识
- 报文体