MQTT
一种物联网和移动互联网领域的行业标准协议,适合移动终端之间的数据传输。
MQTT 服务端
实现 MQTT 协议的服务端,负责保持和 MQTT 客户端的长连接,并且将消息路由到对应的客户端,或将消息转发到其他 MQTT 服务端节点,同时负责 MQTT 离线消息的存储。
MQTT 客户端
使用 MQTT 协议连接到 MQTT 服务端的设备或应用程序。
主题
用来标识消息的分类和结构,Publisher 将消息发布到特定的主题上,Subscriber 订阅特定的主题以接收相关消息。
一级 Topic(Parent Topic)
MQTT 协议基于 Pub/Sub 模型,Topic 通常用来对系统生产的各类消息做一个集中的分类和管理。客户端可以订阅一个或多个 Topic,以便于接收和这些主题相关的消息。同样客户端也可以发布消息到某个 Topic,以便其他订阅该 Topic 的客户端接收到这些消息。
二级 Topic(Sub Topic)
根据标准 MQTT 协议,Topic 存在多级,且拥有动态的特性,中间用“/”分隔,定义第一级 Topic 为父级 Topic。使用前,需要在 MQTT 控制台创建父 Topic,二级 Topic 无需创建,直接在代码中设置。
通配符
订阅者可以在订阅的主题中使用通配符来达到一次订阅多个主题的目的,MQTT 支持单层通配符(+)和 多层通配符(#)两种主题通配符,来满足不同的订阅需要。
单层通配符“+”可用于主题过滤器的任何层级,它可以在主题过滤器的多个层级中使用,并且可以与多层通配符结合使用。例如,“sport/tennis/+”匹配“sport/tennis/player1”和“sport/tennis/player2”,但不匹配“sport/tennis/player1/ranking”。此外,由于单层通配符仅匹配单个层级,“sport/+”不匹配“sport”,但匹配“sport/”。
“#” 可以匹配主题内的任意数量层级,多层通配符代表父级以及任意数量的子级。例如,如果一个客户端订阅了“sport/tennis/player1/#”,它将接收到这些主题名称发布的消息: “sport/tennis/player1”, “sport/tennis/player1/ranking”,“sport/tennis/player1/score/wimbledon”。“sport/#” 也匹配 topic 为 “sport”的消息,因为 “#” 包括父层级。
会话
会话是指客户端向服务端发起 MQTT 连接请求开始,到连接中断直到会话过期为止的消息收发序列。MQTT 支持两种不同的会话类型:持久会话和清除会话(Clean Session)。
持久会话:当客户端连接到服务端时,如果启用了持久会话,服务端会记录客户端的订阅信息,即使客户端断开连接,服务端也会保存这些订阅信息。当客户端再次连接到服务端时,它会恢复之前的订阅信息,并接收它断开连接时的所有未接收的消息。
清除会话:当客户端连接到服务端时,如果启用了清除会话,服务端不会保存客户端的订阅信息。当客户端断开连接时,服务端会删除与该客户端相关的所有信息。
ClientID
Client ID 是每个客户端的唯一标识,用户需要自行根据业务场景拼接以保证全局唯一,使用相同的 ClientID 连接 MQTT 服务端会被拒绝。
QoS
QoS(Quality of Service)指代消息传输的服务质量,每条消息都可以在发送时单独设置 QoS。它包括以下级别:
QoS = 0代表最多分发一次,消息可能丢失。
QoS = 1代表至少达到一次,消息可以保证到达,但是可能重复。
QoS = 2 代表仅到达一次,消息保证到达,并且不会重复。
Clean Session
Clean Session 是用来控制会话状态生命周期的标志位:
Clean Session = true:创建一个新的会话,在客户端断开连接时,会话将自动销毁。
Clean Session = false:创建一个持久会话,在客户端断开连接后会话仍然保持,直到会话超时注销。
P2P
P2P 是一对一的消息收发模式,Publisher 已经明确该消息的目标接收者信息,并且该消息只需要被指定的单一客户端消费。发送者发送消息时通过设置符合命名规则的 Topic 指定接收者,接收者无需提前订阅即可消费到该消息。
保留消息
保留消息用于确保新订阅 Topic 的设备能及时收到最新状态的消息,即使消息在设备订阅之前发布。当一个客户端发布一条带“保留”标志(Retain)的消息,代理服务器就会保留此条消息。因此,任何订阅了相应消息的主题都将接收到最后一条保留消息,即使最近消息发布者没有在活跃状态。
遗嘱消息
遗嘱消息用于在客户端异常断开连接时向其他订阅者通知其离线状态或执行一些预定义操作。当客户端异常断开连接时(例如网络故障或客户端崩溃),MQTT代理会自动将该遗嘱消息发布给其他订阅者,使得其他订阅者能够得知客户端的离线状态,或者执行一些预定义的操作,例如更新在线状态等。
共享订阅
共享订阅允许多个客户端共享一个主题的订阅,只有一个客户端接收到发布到该主题的消息。当主客户端离线时,能够无缝切换到其他客户端继续接收消息,以确保高可用性。