MQTT知识点整理
-
优势
1、轻量高效,节省带宽
2、可靠的消息传递
3、海量连接支持
4、安全的双向通信
5、在线状态感知
-
MQTT服务器部署
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p18083:18083 emqx/emqx:lates
-
MQTT桌面客户端推荐
MQTTX
-
发布订阅模式
组成部分:
发布者(Publisher):负责将消息发布到主题上,发布者一次只能向一个主题发送数据,发布者发布消息时也无需关心订阅者是否在线。
订阅者(Subscriber):订阅者通过订阅主题接收消息,且可一次订阅多个主题。
代理(Broker):负责接收发布者的消息,并将消息转发至符合条件的订阅者。另外,代理也需要负责处理客户端发起的连接、断开连接、订阅、取消订阅等请求。
主题(Topic):主题是 MQTT 进行消息路由的基础,它类似 URL 路径,使用斜杠 / 进行分层,比如sensor/1/temperature。一个主题可以有多个订阅者,代理会将该主题下的消息转发给所有订阅者;一个主题也可以有多个发布者,代理将按照消息到达的顺序转发。
-
MQTT与消息队列
尽管 MQTT 与消息队列的很多行为和特性非常接近,比如都采用发布/订阅模式,但是他们面向的场景却有着显著的不同。消息队列主要用于服务端应用之间的消息存储与转发,这类场景往往数据量大但客户端数量少。MQTT 是一种消息传输协议,主要用于物联网设备之间的消息传递,这类场景的特点是海量的设
备接入、管理与消息传输。在一些实际的应用场景中,MQTT 与消息队列往往会被结合起来使用,以使 MQTT 服务器能专注于处理设备的连接与设备间的消息路由。比如先由 MQTT 服务器接收物联网设备上报的数据,然后再通过消息队列将这些数据转发到不同的业务系统进行处理。不同于消息队列,MQTT 主题不需要提前创建。MQTT 客户端在订阅或发布时即自动的创建了主题,开发者无需再关心主题的创建,并且也不需要手动删除主题。
-
创建MQTT连接
连接地址 :MQTT 的连接地址通常包含 :服务器 IP 或者域名、服务器端口、连接协议。
基于 TCP 的 MQTT 连接
mqtt 是普通的 TCP 连接,端口一般为 1883。
mqtts 是基于 TLS/SSL 的安全连接,端口一般为 8883。
比如 mqtt://broker.emqx.io:1883 是一个基于普通 TCP 的 MQTT 连接地址。
基于 WebSocket 的连接
ws 是普通的 WebSocket 连接,端口一般为 8083。
wss 是基于 WebSocket 的安全连接,端口一般为 8084。
客户端 ID(Client ID): MQTT 服务器使用 Client ID 识别客户端,连接到服务器的每个客户端都必须要有唯一的 Client ID。Client ID 的长度通常为 1 至 23 个字节的 UTF-8 字符串。 如果客户端使用一个重复的 Client ID 连接至服务器,将会把已使用该 Client ID 连接成功的客户端踢下 线。
连接超时(Connect Timeout):收到服务器连接确认前的等待时间,等待时间内未收到连接确认则为连接失败
保活周期(Keep Alive):是一个以秒为单位的时间间隔。客户端在无报文发送时,将按 Keep Alive 设定的值定时向服务端发送心跳报文,确保连接不被服务端断开。在连接建立成功后,如果服务器没有在 Keep Alive 的 1.5 倍时间内收到来自客户端的任何包,则会认为和客户端之间的连接出现了问题,此时服务器便会断开和客户端的连接。
-
主题与通配符
MQTT 主题本质上是一个 UTF-8 编码的字符串,是 MQTT 协议进行消息路由的基础。MQTT 主题类似URL 路径,使用斜杠 / 进行分层。
MQTT 主题通配符包含单层通配符 + 及多层通配符 #,主要
MQTT 主题使用建议:
不建议使用 # 订阅所有主题;
不建议主题以 / 开头或结尾,例如 /chat 或 chat/;
不建议在主题里添加空格及非 ASCII 特殊字符;
同一主题层级内建议使用下划线 _ 或横杆 - 连接单词(或者使用驼峰命名);
尽量使用较少的主题层级;
当使用通配符时,将唯一值的主题层(例如设备号)越靠近第一层越好。例如,device/00000001/command/# 比 device/command/00000001/# 更好。
-
QoS机制
MQTT 定义了三个 QoS 等级,分别为:
QoS 0,最多交付一次。
QoS 1,至少交付一次。
QoS 2,只交付一次。
-
保留消息
发布者发布消息时,如果 Retained 标记被设置为 true,则该消息即是 MQTT 中的保留消息(RetainedMessage)。MQTT 服务器会为每个主题存储最新一条保留消息,以方便消息发布后才上线的客户端在订阅主题时仍可以接收到该消息。
如何判断一条消息是否是保留消息?当客户端订阅了有保留消息的主题后,即会收到该主题的保留消息,可通过消息中的保留标志位判断是否是保留消息。需要注意的是,在保留消息发布前订阅主题,将不会收到保留消息。需要待保留消息发布后,重新订阅该主题,才会收到保留消息。