MQTT 笔记
最近在看 MQTT, 之中有些内容大约已忘掉,先试将尚且记得得内容复述予以强化。其余部分等改天另行附录完整版
MQTT 全称 Message Queque Telemetry Transport,是一种物联网下的轻量传输协议。该协议以发布/订阅的方式传输信息。消息由发布端(客户端)发布,经由服务器发送给订阅端(客户端)。一台设备可以既是发布端又是客户端。
消息发送流程大致如下
1, 由客户端发起Connect连接请求
clientId:xxxxx
cleanSession: true
username(可选)
password(可选)
….
keepAlive: 60
2, 服务端收到请求后发送 Connack 确认连接
3,发布端发布信息
topicName: ‘location/1’
Qos: 1(可选)
payload:'quanzhou'
…
4,服务端根据收到的信息 QoS ( Quality of Service ) 决定是否答复以及如何答复客户端接收情况
qos=0 最多一次 :只发送,不回复
qos=1 最少一次
qos=2 只有一次
qos = 0, 可能存在数据丢失,导致服务端或者订阅端无法收到数据,一般用于重要性较低的数据传输,此项性能带宽消耗最小
qos = 1 同一信息可能发送多次,服务器收到会发送puback, 此项消耗次之
qos = 2 保证消息到达1次,此项开销最大
5, 订阅端发布 subscribe 订阅请求
6, 服务端收到订阅请求后答复 suback 确认订阅
7, 心跳机制
不经常向服务端发消息的客户端,定时向服务器发送 PingREQ 数据包,服务器收到消息后返回 PingResp 数据包确认
参考前文 Connect 数据包中的 keepAlive:60 (单位是s)
实际运行中如果服务端没有在1.5倍的心跳时间间隔内没有收到客户端发来的消息,便认为客户端已经断开连接
遗嘱LastWill
遗嘱是由客户端发布,非正常情况下断开连接(即不是通过disconnect方式断开连接)时生效, 其它订阅该遗嘱的客户端在其断开后会收到对应主题信息。
遗嘱是CONNECT数据包的可选项,客户端发起CONNECT请求时,随其他CONNECT数据送达服务器
Connect 数据包内容如下:
名称 | 示例内容 |
---|---|
clientId | “client-1” |
cleanSession | true |
username(可选) | ”user" |
password(可选) | “password" |
lastWillTopic(可选) | ”/client-1/will" |
lastWillQos(可选) | 2 |
lastWillMessage(可选) | “unexpected exit” |
lastWillRetain(可选) | false |
keepAlive | 60 |
其中 lastWill 等项为遗嘱相关信息。lastWillRetain 为 true 时,遗嘱信息会在服务端保留