• 【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"

  • 相关阅读:
    Android程序对不同手机屏幕分辨率自适应的方法
    用户管理和身份验证
    vue----scoped独立样式作用域
    vue----component动态组件
    css----行内元素&&块状元素
    html----rem结合vw布局
    js----jsonp原理
    js----白屏事件&&dom ready时间
    js----var a=b=2解析
    js----常见的表示false的有哪些
  • 原文地址:https://www.cnblogs.com/mindzone/p/16168492.html
Copyright © 2020-2023  润新知