MQTT与HTTP的区别
- HTTP协议是客户端与服务端直连请求与响应
- MQTT是基于发布订阅模型的轻量级的消息传输协议
MQTT能力
- 发布:Publish
- 订阅:Subscribe
- 代理:Broker,管理通信
- 执行模式:客户端发送消息到broker,broker将消息发送给订阅过的客户端
MQTT通信模式
- 一对一:点对点通信
- 一对多:消息广播
- 多对一:数据采集
- MQTT 底层协议基于TCP实现
服务质量等级
- QoS 0:消息可能丢失
- QoS 1:消息不会丢失但可能重复
- Qos 2:消息不会丢失也不回重复
- 服务质量越稳定可靠性越高的同时对性能损耗越大
- 根据实际网络情况和服务质量选择质量等级
心跳机制
KeepAlive是在TCP中一个可以检测死连接的机制,不稳定的网络环境可能会让连接进入假死状态,为了减少对上层的影响,客户端和代理都需要及时感知连接是否处于异常状态,底层tcp协议的KeepAlive感知所需时间太长,mqtt自己定义了一套KeepAlive机制,客户端需要定期发送心跳报文,用来感知异常状态进行断开
心跳是创建连接的时候,在connect报文中指定,指定时间单位是s,假设KeepAlive指定心跳时间为1分钟,当客户端连接空闲时间超过1分钟时,向broker发送心跳报文PINGREQ,broker收到心跳请求后返回心跳响应PINGRESP,如果broker超过1.5分钟时间没有收到心跳请求则断开连接,可以投递遗嘱消息到订阅方,如果客户端超过一定时间没有收到心跳响应也断开连接
-
遗嘱消息:
在MQTT中采用发布订阅模式,实际通信的双方不会直接进行连接,所有通信的客户端无法感知对方的在线状态,遗嘱机制就是客户端连接的时候向代理设置自己的遗嘱内容,一旦代理发现连接异常断开,就向所有订阅该遗嘱的客户端发送遗嘱消息
-
保留消息
发布一条消息的时候,如果订阅方不在线,就会错过这条消息,如果不想这样可以使用保留消息功能,让broker保留向主题发送的最后一条消息,当订阅端重新上线并订阅的时候,broker就会把消息发送过去,这样可以让客户端上线时就收到消息,保持更新,无需等待下次消息
-
半开连接:
当通信双方直接的传输因为网络或者其他原因有时会不同步,比如一方发生崩溃或者传输错误,在tcp中这种不完全连接状态称为半开连接,表象是通信的一侧继续运行,不回通知另一侧的故障,仍然连接的一方继续尝试发送消息并等待响应
-
客户接管 Take-Over:
客户端与broker连接异常断开,时间小于心跳断开时间,尝试重新连接broker,在未达到心跳时间的时间内,客户端与broker会有两条连接,
针对此项mqtt重新连接并执行客户端Take-Over措施:先断开之前的连接再建立新的连接
MQTT报文
MQTT总共定义了14种报文类型,按照功能分类可以分为连接、发布、订阅、心跳四类
CONNECT-客户端向代理发起连接:
- 客户端标识符
- 用户名
- 密码
- 遗嘱消息
PUBLISH-客户端向代理发布消息:
- 主题
- QoS
- Payload
SUBSCRIBE-客户端向代理订阅的主题:
- 主题
- QOS
报文格式:
固定报头-用于所有控制报文:
可变报头-部分控制报文
有效载荷-部分控制报文
标签:基础,broker,介绍,MQTT,消息,心跳,连接,客户端 From: https://www.cnblogs.com/Mickey-7/p/17340605.html