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

【MQTT】Mosquitto 入门案例的更多相关文章

  1. SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)

    SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...

  2. SpringMvc核心流程以及入门案例的搭建

    1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...

  3. Struts2第一个入门案例

      一.如何获取Struts2,以及Struts2资源包的目录结构的了解    Struts的官方地址为http://struts.apache.org 在他的主页当中,我们可以通过左侧的Apache ...

  4. MyBatis入门案例、增删改查

    一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...

  5. Hibernate入门案例及增删改查

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  6. Android开发笔记之《远程控制(MQTT|mosquitto) && (ProtocalBuffer | GRPC)》

    Android推送方案分析(MQTT/XMPP/GCM): http://www.open-open.com/lib/view/open1410848945601.htmlMQTT官网: http:/ ...

  7. Quartz应用实践入门案例二(基于java工程)

    在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...

  8. Quartz应用实践入门案例一(基于Web环境)

    Quartz是一个完全由java编写的开源作业调度框架,正是因为这个框架整合了许多额外的功能,所以在使用上就显得相当容易.只是需要简单的配置一下就能轻松的使用任务调度了.在Quartz中,真正执行的j ...

  9. MyBatis入门案例 增删改查

    一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...

  10. Hibernate入门案例 增删改

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

随机推荐

  1. 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项

    为什么会突然想到写这么一个大杂烩的博文呢,必须要从笔者几年前的一次面试说起 当时的我年轻气盛,在简历上放了自己的博客地址,而面试官应该是翻了我的博客,好几道面试题都是围绕着我的博文来提问 其中一个问题 ...

  2. 地址栏hash模式以?问号分割也可以分割的

    可以看到href里面hash没有? 但是还是以?分割了 就很不明白 但是我就indexof判断有没有? 再进行下一步逻辑 这里记录一下坑

  3. kettle从入门到精通 第四十一课 kettle 事务(单个转换文件)

    1.大家都知道,我们在平常写java或者C#等代码时,如果涉及操作多个表时为了保持数据一致性需要开启事务,同样kettle也支持事务,今天我们一起来学习下kettle 单个转换文件内的事务特性. 转换 ...

  4. Vue学习:5.v-bind使用

    第一节算是对v-bind的粗略了解,仅仅是列举了v-bind的使用.这一节将更详细的了解v-bind的具体用法. v-bind是 Vue.js 中常用的指令之一,用于动态地绑定属性或者表达式到 HTM ...

  5. js中字符串的方法,17种方法

    字符串的17种方法...... 1.length:返回字符串的长度. const str = "Hello, World!"; console.log(str.length); / ...

  6. #PowerBi Superchange PowerBi 数据模型篇(1)

    在过去,业务人员通常不熟悉数据建模,因为数据建模往往是专业的IT人员的领域.但是,得益于POWERBI和POWER PIVOT FOR EXCEL ,这样的日子一去不复返了.那么,什么是数据模型呢? ...

  7. SingletonKit单例源码阅读学习

    阅读学习QFramwork中的SingletonKit源码. Singleton 普通类的单例 作为最常用的单例模块,通过继承单例泛型类来实现,需要私有构造: //使用第一种接口单例方式 intern ...

  8. 第一篇Scrum冲刺博客--原班人马打造队

    0 项目地址 点此进入 1 第一次开会/任务认领 1.1 第一次例会(2024.4.27) 第一次开会照片记录 1.2 开发认领 在查看老师在实验报告中学长的博客给了我一定的启发,我在腾讯表格中创建了 ...

  9. tempCode

    package com.cmbchina.monitor.service.imp; import com.alibaba.fastjson.JSON; import com.cmbchina.moni ...

  10. Python中的属性

    Python中的属性主要分为类属性,对象属性. 1.类属性 类属性:类所有,所有的实例对象都能够共享,类定义时就直接指定的属性,能通过类名和实力对象名访问,当当前的类属性被实例对象通过对象名.属性名的 ...