MQTT Publish Subscribe & Unsubscribe
Publish 推送
MQTT 客户端在连接到 Broker 服务器后可以立即发送消息。MQTT 在 Broker 上是利用基于 主题的 消息过滤模式,每个消息都必须包含主题,以便于 Broker 可以根据主题来发送消息给感兴趣的客户端。通常的,每个消息都有一个 payload 有效载荷,其中包含以字节格式传输的数据,即消息主体,MQTT 与数据无关,所以 payload 的结构可以是任意的。二进制数据、文本、XML、JSON 等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-08hlxRjX-1626874686493)(/Users/admin/Downloads/publish_packet.png)]
Topic Name
主题名称,主题名称是简单字符串构成的分层结构,以 “/” 进行分割 例如 myhome/livingroom/temperatur
QoS
Quality of Service Level 用来标识 消息的服务质量。这里有三个级别 0,1 和 2,这个服务级别将决定消息将以何种方式触达到预期接受者(client or borker)。
Retain Flag
保留标志,该标志将会决定 broker 是否保存个该 topic 最后一条 “良好值信息” ,当新的客户端订阅了该 topic,他们会收到保留在该 topic 上的最后一条消息。
Payload
payload 为消息的实际内容。MQTT 与数据无关,可以发送图像,任何编码的文本,加密数据以及几乎所有二进制数据。
Packet Identifier
packetId 数据包标识符,唯一标识消息,该标识符 在 qos 大于 0 时才有效。该标识符由 客户端 或 服务端,或者共同进行协商设定。
DUP flag
dup flag 标识该条消息是 重复的 并且 重新发送的 ,因为 预计接受方 (client broker)没有为 源消息 回复 acknowledge,同样 此标识也只与 qos 大于 0 时有关。通常 重发/复制 机制由 客户端库 或者 Broker 服务端来实现。
当客户端向 MQTT Broker 发送消息,进行发布时,Broker 读取消息、确认消息(根据 QoS 级别)并处理消息。代理的处理包括确定哪些客户端订阅了主题并将消息发送给他们。
发布消息的客户端只关心 PUBLISH 消息是否送达 broker。一旦 broker 收到 PUBLISH 消息,broker 有责任将消息送达给所有的订阅者。发布客户端将不会得到是否有人对发布消息感兴趣,或者由多少客户端从 broker 得到了消息。
Subscribe 订阅
如果没有客户端订阅消息的主题,那么发布关于改主题的消息就是没有意义的。
那么 客户端向 MQTT broker 发送 SUBSCRIBE 消息进行定义。
订阅消息很简单,其包含信息如下
Packet Identifier
同上,唯一标识
List of Subscriptions
订阅信息的列表,数组形式,每个订阅信息包含 topic 名称和 QoS 级别。订阅消息中的主题可以包含通配符。如果存在重复订阅,broker 会以最高级别 QoS 的订阅为准。
Suback 订阅ACK
为了确认每个订阅,broker 会向客户端发送一个 SUBACK 确认订阅消息。该消息包含原始订阅消息的 packetId 数据包标识符和返回码表。
Packet Identifier
该 packetId 与 Subscribe 消息中的 id 为同一个
Return Code
broker 会为每个在 SUBSCRIBE 消息中收到的每个订阅消息返回一个返回代码。该状态码与订阅主题时一一对应。
Return Code | Return Code Response |
0 | Success 成功,最大 QoS 0 |
1 | Success 成功,最大 QoS 1 |
2 | Success 成功,最大 QoS 2 |
128 | Failure 失败 |
客户端成功发送 SUBSCRIBE 消息并且收到 SUBACK 后,它将获取到 SUBSCRIBE 中包含的 topic 中的所有已发布的消息。
Unsubscribe 取消订阅
有订阅那么就有取消订阅,其消息结构与订阅相似
Packet Identifier
消息唯一标识
List of Topic
取消订阅的话题列表,可以包含多个,这里只需要发送 topic 即可
Unsuback 取消订阅ACK
同样的,取消订阅消息也需要 broker 发送 ACK 确认消息,该消息只包含源取消订阅消息的 packetId
当 client 端收到 broker 的 UNSUBACK 后就可以认为成功取消订阅了。