MQTT 简单介绍与实现

1. MQTT 介绍

  • 它是一种 机器之间通讯 machine-to-machine (M2M)、物联网 Internet of Things (IoT)常用的一种轻量级消息传输协议
  • 适用于网络带宽较低的场合
  • 包含发布、订阅模式,通过一个代理服务器(broker),任何一个客户端(client)都可以订阅或者发布某个主题的消息,然后订阅了该主题的客户端则会收到该消息

1.1 消息主题

  • 发布消息或者订阅消息都要选定一个消息主题,消息主题可以任意定制,类似文件系统,用 “/” 进行分隔,例如主题为 /a/b/c/d 的消息
  • 客户端可以使用完全字符匹配消息,也可以使用通配符进行消息匹配
    • 通配符 + :替换任意单个层级。比如订阅 /a/b/c/d、/a/+/c/d 、+/+/+/+ 主题的消息即可收到主题为 /a/b/c/d 的消息,而 b/+/c/d 、 +/+/+ 不会匹配
    • 通配符 # :匹配任意层级,只能用于末尾, #、a/# 可以匹配上面的主题消息
  • 长度为 0 的主题层级也是允许的。比如发布主题为 a//topic 的消息,客户端可以用 a/+/topic 进行匹配。/a/topic 的主题用 +/a/topic、#、/# 可以匹配。

1.2 服务质量(Quality of Service,QoS)

MQTT 定义了三种客户端与代理服务器之间消息到达的难度

  • 0:broker/client 之间消息传一次,并不确认传到没有,消息可能丢失
  • 1:broker/client 之间消息至少一次,带确认消息的传输,可能重复收到
  • 2:broker/client 之间消息仅有一次,利用四次握手进行确认,网络延迟可能会增加

当客户端订阅的消息质量与代理服务器发布主题的质量不同时,客户端会选择难度最小的 QoS 接收消息

  • 发布等级为 2 ,客户端订阅等级为 0, 那么客户端接收到的 QoS = 0
  • 发布等级为 0 ,订阅等级为 2,那么客户端接收到的 QoS = 0

1.3 消息保留

  • 即当 broker 正在发送消息给 client 时,消息会保存,如果此时有新的 client 订阅了该主题的消息,那么它也会收到消息。这种做法的好处就是当消息主题经常变换的时候,如果有新的 client 订阅该消息,那么它不用等待太长的时间就可以收到消息

1.4 会话清除

  • client 可以设置 clean session 标志位,当 clean session = false 时,client 失去连接时, broker 会一直保留消息直到 client 重新连接。而 clean session = true 时,broker 会清除所有的消息当这个 client 失去连接。

1.5 消息意愿

  • 当 client 连接上 broker 时,client 会提示 broker 它有一个意愿消息,这个意愿消息将会在 client 失去连接时,broker 发送出去。消息意愿和普通消息一样都包含主题和内容。

2. 实例

用实例验证上面的概念

2.1 代理服务器

实现了 MQTT 的代理服务器有很多种,我们使用 mosquitto

upload successful

2.2 mosquitto 实现过程

  • 下载安装 mosquitto,进入 mosquitto 安装目录,新开当前目录的命令行 A,执行命令 mosquitto -c mosquitto.conf,表示通过执行这个配置文件实现代理服务,如果命令窗口没有任何输出表示启动成功,配置文件内容介绍可以自己网上了解
  • 然后在当前目录下,新开命令行 B,执行 mosquitto_sub -t name,表示订阅主题为 name 的消息
  • 同样在当前目录,新开命令行 C,执行 mosquitto_pub -t name -m 123,表示发布主题为 name ,内容为 123 的消息
  • 命令行 B 收到 123 消息表示整个过程实现 OK

2.3 一个 Chorme 应用

这里介绍一个能够监听本地 MQTT 消息的应用 MQTTLens,去 Chorme 网上应用店下载

  • 安装好后新建连接,配置如下

upload successful

  • 圆角图标是绿色表示连接成功
  • 接下来你就可以在软件里面,订阅、发布任意 MQTT 消息了,非常方便!

博文参考

MQTT再学习 – 搭建MQTT服务器及测试