参考博主StoneGeek的文章
https://www.cnblogs.com/sxkgeek/p/9140180.html
之前接触的是在应用程序之间的消息中间件技术
RabbitMQ, Kafka, ActiveMQ, RocketMQ
MQTT (Message Queuing Telemetry Transport,消息队列遥测传输协议)
IBM开发的一个即时通讯协议,
特性是可以和硬件设备进行数据的交互,所以自然而然是物联网的技术之一
在B站看到的一个非常有力的应用场景,STM32单片机 使用MQTT 微信小程序交互
视频地址:
https://www.bilibili.com/video/BV1wq4y1U79y
MQTT中文网
http://mqtt.p2hp.com/
MQTT可视化客户端(MQTTX)下载:
https://github.com/emqx/MQTTX/releases
实现协议的中间件产品:
开源轻量级的Mosquitto (MQTT 3.1 & 3.1.1 协议版本)
开源带可视化界面管理的 EMQX Broker
云产品:阿里云 微消息队列MQTT (腾讯云。。。 华为云等等)
实现一个简单的MQTT入门案例,还是选择Mosquitto来实现
Mosquitto官网地址:
https://mosquitto.org/download/
StoneGeek博主采用的是Ubuntu平台的Linux环境,
我则采用Centos7平台:
安装博客参看:
YUM安装:
https://blog.csdn.net/qq_34301871/article/details/93617204
TAR包安装:
https://blog.csdn.net/chasonli666/article/details/87201936
这里我选择YUM安装:
[root@localhost ~]# yum install -y mosquitto 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * epel: hkg.mirror.rackspace.com * extras: mirrors.huaweicloud.com * updates: mirrors.aliyun.com 正在解决依赖关系 --> 正在检查事务 ---> 软件包 mosquitto.x86_64.0.1.6.10-1.el7 将被 安装 --> 正在处理依赖关系 libwebsockets.so.13()(64bit),它被软件包 mosquitto-1.6.10-1.el7.x86_64 需要 --> 正在检查事务 ---> 软件包 libwebsockets.x86_64.0.3.0.1-2.el7 将被 安装 --> 正在处理依赖关系 libuv.so.1()(64bit),它被软件包 libwebsockets-3.0.1-2.el7.x86_64 需要 --> 正在检查事务 ---> 软件包 libuv.x86_64.1.1.44.1-1.el7 将被 安装 --> 解决依赖关系完成 依赖关系解决 ================================================================================ Package 架构 版本 源 大小 ================================================================================ 正在安装: mosquitto x86_64 1.6.10-1.el7 epel 287 k 为依赖而安装: libuv x86_64 1:1.44.1-1.el7 epel 144 k libwebsockets x86_64 3.0.1-2.el7 epel 118 k 事务概要 ================================================================================ 安装 1 软件包 (+2 依赖软件包) 总下载量:548 k 安装大小:1.4 M Downloading packages: (1/3): libuv-1.44.1-1.el7.x86_64.rpm | 144 kB 00:00 (2/3): libwebsockets-3.0.1-2.el7.x86_64.rpm | 118 kB 00:00 (3/3): mosquitto-1.6.10-1.el7.x86_64.rpm | 287 kB 00:00 -------------------------------------------------------------------------------- 总计 678 kB/s | 548 kB 00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction 正在安装 : 1:libuv-1.44.1-1.el7.x86_64 1/3 正在安装 : libwebsockets-3.0.1-2.el7.x86_64 2/3 正在安装 : mosquitto-1.6.10-1.el7.x86_64 3/3 验证中 : libwebsockets-3.0.1-2.el7.x86_64 1/3 验证中 : mosquitto-1.6.10-1.el7.x86_64 2/3 验证中 : 1:libuv-1.44.1-1.el7.x86_64 3/3 已安装: mosquitto.x86_64 0:1.6.10-1.el7 作为依赖被安装: libuv.x86_64 1:1.44.1-1.el7 libwebsockets.x86_64 0:3.0.1-2.el7 完毕! [root@localhost ~]#
yum会装服务脚本:
# 启动 停止 重启 状态
service mosquitto start
service mosquitto stop
service mosquitto restart
service mosquitto status
启动Mosquitto并检查运行状态:
[root@localhost ~]# service mosquitto start Redirecting to /bin/systemctl start mosquitto.service [root@localhost ~]# service mosquitto status Redirecting to /bin/systemctl status mosquitto.service ● mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker Loaded: loaded (/usr/lib/systemd/system/mosquitto.service; disabled; vendor preset: disabled) Active: active (running) since 三 2022-04-20 11:36:57 CST; 3s ago Docs: man:mosquitto.conf(5) man:mosquitto(8) Main PID: 16919 (mosquitto) CGroup: /system.slice/mosquitto.service └─16919 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf 4月 20 11:36:57 localhost.localdomain systemd[1]: Starting Mosquitto MQTT v3... 4月 20 11:36:57 localhost.localdomain mosquitto[16919]: 1650425817: mosquitt... 4月 20 11:36:57 localhost.localdomain mosquitto[16919]: 1650425817: Config l... 4月 20 11:36:57 localhost.localdomain mosquitto[16919]: 1650425817: Opening ... 4月 20 11:36:57 localhost.localdomain mosquitto[16919]: 1650425817: Opening ... 4月 20 11:36:57 localhost.localdomain systemd[1]: Started Mosquitto MQTT v3.... Hint: Some lines were ellipsized, use -l to show in full. [root@localhost ~]#
新打开一个Shell访问终端,一个做发布终端,一个做订阅终端
Mosquitto默认支持匿名交互,即没有账号密码客户端ID的限制
首先订阅终端打开:
mosquitto_sub -h 192.168.118.133 -t "mqtt" -v
此时终端会被订阅进程占用阻塞,直到连接中断或者拒绝
然后发布终端打开:
发布终端命令必须向主题发送消息,否则发布命令没有实际意义
mosquitto_pub -h 192.168.118.133 -t "mqtt" -m "Hello Stonegeek"
发布方 一般是 应用程序,或者移动端应用,像MQTT服务发送消息
硬件设备 订阅MQTT服务的主题,收到来自应用发布的消息,操作硬件完成控制
为了防止非法应用也可以向主题发布信息,MQTT可以配置安全信息进行限制:
更改Mosquitto的配置文件
vim /etc/mosquitto/mosquitto.conf
追加以下参数:
# 进程号文件 pid_file /var/run/mosquitto.pid # 是否持久化 persistence true persistence_location /var/lib/mosquitto/ # 关闭匿名访问 allow_anonymous false # 密码和访问控制 password_file /etc/mosquitto/pwdfile acl_file /etc/mosquitto/acl
拷贝用:
pid_file /var/run/mosquitto.pid persistence true persistence_ Location /var/lib/mosquitto/ allow_anonymous false password_file /etc/mosquitto/pwdfile acl_file /etc/mosquitto/acl
设置Mosquitto的交互账号
第一个账号需要加-c参数,因为密码文件没有生成
mosquitto_passwd -c /etc/mosquitto/pwdfile cloud9
然后输入密码2次确认
后面的账号不需要再加c参数,否则是重新生成密码文件并写入账号
mosquitto_passwd /etc/mosquitto/pwdfile cloud8
配置账号与发布订阅之间的关系:
vim /etc/mosquitto/acl
设置cloud9账号只能在主题topic1376上进行发布
设置cloud8账号只能在主题topic1376上进行订阅
user cloud9 topic write topic1376/# user cloud8 topic read topic1376/#
重启服务
service mosquitto restart
再次订阅主题发现,Mosquitto拒绝订阅,要求提供授权信息:
[root@localhost ~]# mosquitto_sub -h 192.168.118.133 -t "mqtt" -v Connection error: Connection Refused: not authorised. [root@localhost ~]#
同理发布主题也是如此:
[root@localhost ~]# mosquitto_pub -h 192.168.118.133 -t "mqtt" -m "Hello Stonegeek" Connection error: Connection Refused: not authorised. [root@localhost ~]#
订阅和发布主题都需要提供正确的账号和指定的主题,如果主题不是acl中指定的,则无法收到消息
发布者可以不按指定主题发布消息(意义不明???)
# 授权订阅 -u 用户名 -P 密码 mosquitto_sub -h 192.168.118.133 -t "topic1376" -v -u cloud8 -P 123456 # 授权发布 -u 用户名 -P 密码 mosquitto_pub -h 192.168.118.133 -t "topic1376" -u cloud9 -P 123456 -m "hello authorized message"