100ask七天物联网训练营学习笔记 - MQTT
今天学习了韦老师的MQTT入门的课程,发现用这个协议简直太方便了。
1. MQTT简述
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。
刚开始听觉得MQTT协议好复杂,当自己找到一个能帮助理解的例子以后感觉还是挺简单的。我梳理了一下课程内容,MQTT协议中有以下概念:
目前还没有学到源码MQTT实现方式,但是这个协议的整体实现思路就和以前学过的设计模式里的观察者模式非常相似。
只不过观察者模式中的Observer和Subject是一对多的关系,MQTT变成了Publish和Subscribe的多对多的关系。在观察者模式中,需要关注Observer状态的Subject都可以在Observer状态发生变化后收到通知。这里MQTT每一个节点或用户都可以即可以是Publish,也可以是Subscribe。Subscribe订阅的是某个主题并不是订阅某个发布者,Subscribe并不会直接和某个Publish产生关系。
消息代理(Broker):就是MQTT服务器,用于管理订阅,转发消息。
发布者(Publish):发布者可以向任意主题发出消息,关注了该主题的订阅者则会立马收到由Broker的消息转发。
订阅者(Subscribe):订阅者只需要订阅自己需要的主题即可,当订阅过的主题有新的消息时订阅者就会收到由Broker转发的消息。
主题(Topic):主题才是发布者和订阅者之间的桥梁,发布者和订阅者也只会通过主题产生关系,Broker只是这种关系的维护者。
消息(Payload):主题是发布者和订阅者之间的桥梁,消息则是这个桥上来回穿梭的数据,Broker也只是这些消息数据的搬运工。
明白了MQTT协议的工作逻辑,现在就开始搭建MQTT环境,实际体验一下MQTT协议。
2. MQTT环境搭建
使用课程推荐的两个工具:
- https://mosquitto.org/download/
- https://mqttx.app/zh
3. MQTT体验
3.1 mosquitto常用命令
启动命令
mosquitto [-c config file] [ -d | --daemon ] [-p port number] [-v]
-c 后面跟的是启动mosquitto可以调整的参数,比如是否开启基本认证,端口是什么,SSL单向和双向的认证配置等等。
-d 表示MQTT mosquitto将在后台运行。
-p 代表当前的mosquitto服务实例启动以后,其监听端口号,这个配置的覆盖[-c config file] 指定的配置文件中的端口
-v 代码调试模式(verbose)可以输出更多的信息
消息发布
mosquitto_pub 命令参数说明
-d 打印debug信息
-f 将指定文件的内容作为发送消息的内容
-h 指定要连接的域名 默认为localhost
-i 指定要给哪个clientId的用户发送消息
-I 指定给哪个clientId前缀的用户发送消息
-m 消息内容
-n 发送一个空(null)消息
-p 连接端口号
-q 指定QoS的值(0,1,2)
-t 指定topic
-u 指定broker访问用户
-P 指定broker访问密码
-V 指定MQTT协议版本
--will-payload 指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用
--will-qos Will的QoS值。该参数需要与--will-topic一起使用
--will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使用
--will-topic 用户发送Will消息的topic
发布消息示例
mosquitto_pub -h 192.168.0.1 -p 1883 -u root -P root -t topicname -m "发送的消息内容"
订阅主题
mosquitto_sub 命令参数说明
-c 设定‘clean session’为无效状态,这样一直保持订阅状态,即便是已经失去连接,如果再次连接仍旧能够接收的断开期间发送的消息。
-d 打印debug信息
-h 指定要连接的域名 默认为localhost
-i 指定clientId
-I 指定clientId前缀
-k keepalive 每隔一段时间,发PING消息通知broker,仍处于连接状态。 默认为60秒。
-q 指定希望接收到QoS为什么的消息 默认QoS为0
-R 不显示陈旧的消息
-t 订阅topic
-v 打印消息
--will-payload 指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用
--will-qos Will的QoS值。该参数需要与--will-topic一起使用
--will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使用
--will-topic 用户发送Will消息的topic
订阅主题示例
mosquitto_sub -h 192.168.0.1 -p 1883 -u root -P root -t topicname
我们可以发现不论在使用发布还是订阅命令时都有一个用户名和密码参数,这是因为Broker可以被设置为需要验证权限才能使用,我们这里没有设置Broker,所以可以不需要用户名和密码。如果你使用的是一些云平台的MQTT产品,则肯定需要通过权限验证才能使用。
3.2 测试
启动Broker
这里Broker启动后是阻塞的状态,因为Broker需要监听端口并一直维护发布订阅相关的工作。
订阅主题
通过命令行订阅主题myTopic后,命令行也变成了阻塞状态,因为作为订阅者需要一直在这里关注这个主题,等待这个主题的消息。
再使用MQTTX订阅主题myTopic
发布消息
经过测试,发现MQTT协议的工作方式和我们理解的是一致的,下一步将学习如何将MQTT协议移植到STM32中。