笔记

MQTT 笔记

1770 2021-12-10 16:36:42

最近在看 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”
cleanSessiontrue
username(可选)”user"
password(可选)“password"
lastWillTopic(可选)”/client-1/will"
lastWillQos(可选)2
lastWillMessage(可选)“unexpected exit”
lastWillRetain(可选)false
keepAlive60

其中 lastWill 等项为遗嘱相关信息。lastWillRetain 为 true 时,遗嘱信息会在服务端保留