【MQTT】Mosquitto 入门案例

 

参考博主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"

 

posted @ 2022-04-20 09:45  emdzz  阅读(720)  评论(0编辑  收藏  举报