# MQTT_Management_cloud
**Repository Path**: zangsheng/MQTT_Management_cloud
## Basic Information
- **Project Name**: MQTT_Management_cloud
- **Description**: emqx管理平台,管理主题权限和账号,以及定时推送、告警通知等
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-12-27
- **Last Updated**: 2025-02-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: SpringCloud, emqx, mqtt, nacos, MyBatis
## README
# 平台简介
* 本项目基于ruoyi平台
* 后端采用Spring Boot、Spring Cloud & Alibaba。
* 注册中心、配置中心选型Nacos,权限认证使用Redis。
* 流量控制框架选型Sentinel,分布式事务选型Seata。
* 前端项目,请移步 [MQTT_Management_Vue](https://gitee.com/zangsheng/MQTT_Management_Vue.git)
* 此项目还与EmqxExpand项目有交互 https://gitee.com/zangsheng/EmqxExpand.git
## 内置功能
1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
3. 岗位管理:配置系统用户所属担任职务。
4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
7. 参数管理:对系统动态配置常用参数。
8. 通知公告:系统通知公告信息发布维护。
9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
10. 登录日志:系统登录日志记录查询包含登录异常。
11. 在线用户:当前系统中活跃用户状态监控。
12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。
14. 系统接口:根据业务代码自动生成相关的api接口文档。
15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。
16. 在线构建器:拖动表单元素生成相应的HTML代码。
17. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
18. MQTT管理:管理MQTT客户端、主题、订阅、发布等。
19. 主题告警配置,发送邮件或短信给用户(开发中)
20. MQTT消息推送
21. 定时推送(开发中)
# 演示图片
# 本地运行准备工作
## 安装emqx5.8.1
* 参考搭建测试环境的文档,不要在win系统上安装emqx,有各种意想不到的错误
## 安装 MYSQL8
* 创建数据库 cloud
* 创建数据库 nacos
* 创建数据库 mqtt
* 创建数据库 seata
* 执行项目中sql文件
## 安装Node
* node >= v18
## redis
* reids >= 5.0
# 安装nacos
* nacos >= 2.0.4
* 项目中放了安装包可直接使用,需要修改数据库连接信息
* 打开一个新的Terminal窗口
* 启动naocs
```bash
cd /home/zangsheng/software/nacos/bin
./startup.sh -m standalone
```
* 启动naocs
```bash
cd xxxx
.\startup.cmd -m standalone
```
* 进入naocs管理页面修改项目配置文件的数据库连接信息、redis连接信息等
* 打开一个新的Terminal窗口
* 进入bin目录
```bash
```
启动sentinel
```bash
cd bin
java "-Dserver.port=8718" "-Dcsp.sentinel.dashboard.server=localhost:8718" "-Dproject.name=sentinel-dashboard" "-Dcsp.sentinel.api.port=8719" -jar sentinel-dashboard-1.8.0.jar
```
* 进入naocs管理页面修改项目配置文件的数据库连接信息、redis连接信息等
# docker安装emqx集群(如果安装单机版可以不配置nginx)
* 如果无法拉取镜像请添加docker的registry-mirrors
```text
sudo docker pull emqx/emqx:5.8.1
#可用主机地址范围:从 172.18.0.1 到 172.18.255.254
sudo docker network create -d bridge --subnet=172.18.0.0/16 dockernet
sudo mkdir -p /docker_data/emqx/emqx01/{data,log} /docker_data/emqx/emqx02/{data,log} /docker_data/emqx/emqx03/{log,data}
sudo chmod -R 777 /docker_data
docker run -d \
--name emqx1 --restart=always --ip 172.18.0.10 \
-e "EMQX_NODE_NAME=emqx@172.18.0.10" \
-e "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" \
-e "EMQX_CLUSTER__STATIC__SEEDS=[emqx@172.18.0.10,emqx@172.18.0.20,emqx@172.18.0.30]" \
--network dockernet \
--network-alias 172.18.0.10 \
-v /docker_data/emqx/emqx01/data:/opt/emqx/data \
-v /docker_data/emqx/emqx01/log:/opt/emqx/log \
-p 31883:1883 \
-p 38083:8083 \
-p 38084:8084 \
-p 38883:8883 \
-p 30000:18083 \
emqx/emqx:5.8.1
docker run -d \
--name emqx2 --restart=always --ip 172.18.0.20 \
-e "EMQX_NODE_NAME=emqx@172.18.0.20" \
-e "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" \
-e "EMQX_CLUSTER__STATIC__SEEDS=[emqx@172.18.0.10,emqx@172.18.0.20,emqx@172.18.0.30]" \
--network dockernet \
--network-alias 172.18.0.20 \
-v /docker_data/emqx/emqx02/data:/opt/emqx/data \
-v /docker_data/emqx/emqx02/log:/opt/emqx/log \
-p 41883:1883 \
-p 48083:8083 \
-p 48084:8084 \
-p 48883:8883 \
-p 40000:18083 \
emqx/emqx:5.8.1
docker run -d \
--name emqx3 --restart=always --ip 172.18.0.30 \
-e "EMQX_NODE_NAME=emqx@172.18.0.30" \
-e "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" \
-e "EMQX_CLUSTER__STATIC__SEEDS=[emqx@172.18.0.10,emqx@172.18.0.20,emqx@172.18.0.30]" \
--network dockernet \
--network-alias 172.18.0.30 \
-v /docker_data/emqx/emqx03/data:/opt/emqx/data \
-v /docker_data/emqx/emqx03/log:/opt/emqx/log \
-p 51883:1883 \
-p 58083:8083 \
-p 58084:8084 \
-p 58883:8883 \
-p 50000:18083 \
emqx/emqx:5.8.1
```
# dokcer 搭建nginx 实现emqx的负载均衡
sudo docker pull nginx
mkdir -p /docker_data/emqx_nginx/{conf,log,html}
vi /docker_data/emqx_nginx/conf/nginx.conf
```text
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 10240;
}
stream {
upstream emqxtcp {
server emqx1:1883;
server emqx2:1883;
server emqx3:1883;
}
upstream emqxtls {
# weight
# down: Indicates that the current server is temporarily excluded from load balancing.
# weight: Default is 1, where higher weight results in a larger load share.
# max_fails: Maximum number of allowed request failures; defaults to 1.
# fail_timeout: Timeout after which failures are considered; default is 10 seconds. After reaching max_fails failures, the server is paused.
# backup: When other non-backup servers are down or busy, requests are sent to the backup server.
server 172.18.0.10:1883 weight=1 max_fails=2 ;
server 172.18.0.20:1883 weight=1 max_fails=2 down;
server 172.18.0.30:1883 weight=2 max_fails=2;
}
# 多网卡
# split_clients "$remote_addr$remote_port" $multi_ip {
# 20% 10.211.55.5;
# 20% 10.211.55.20;
# 20% 10.211.55.21;
# 20% 10.211.55.22;
# * 10.211.55.23;
# }
# TCP
server {
listen 1883;
# Multiple Network Interfaces
#proxy_bind $multi_ip;
proxy_pass emqxtcp;
# EMQX corresponding listeners need to enable the proxy protocol.
# proxy_protocol on;
}
# TLS
#server {
# listen 8883 ssl;
# If the certificate doesn't match the hostname, validation needs to be disabled.
# ssl_verify_client off;
# ssl_verify_depth 0;
# ssl_certificate /etc/nginx/certs/cert.pem;
# ssl_certificate_key /etc/nginx/certs/key.pem;
# ssl_handshake_timeout 15s;
# proxy_pass emqxtls;
# proxy_buffer_size 4k;
# EMQX corresponding listeners need to enable the proxy protocol.
# proxy_protocol on;
# }
}
http {
upstream backend_servers {
server 172.18.0.10:18083;
server 172.18.0.20:18083;
server 172.18.0.30:18083;
}
server {
listen 18083;
location /api/v5/ {
# 使用 proxy_pass 将请求转发到上游服务器组
proxy_pass http://backend_servers/api/v5/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 可选:设置负载均衡算法,如轮询(默认)、最少连接等
# ip_hash; # 使用客户端IP进行哈希,确保同一客户端的请求被转发到同一服务器
# least_conn; # 将请求转发到当前连接数最少的服务器
# 可选:设置超时时间
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
}
}
# Nginx status
server {
listen 8888;
location /status {
stub_status on;
access_log off;
}
}
upstream emqxws {
server 172.18.0.10:8083;
server 172.18.0.20:8083;
server 172.18.0.30:8083;
}
# ws
server {
listen 8083;
location /mqtt {
proxy_pass http://emqxws;
# websocket连接的Upgrade必须设置为WebSocket,表示在取得服务器响应之后,使用HTTP升级将HTTP协议转换(升级)为WebSocket协议
proxy_set_header Upgrade $http_upgrade;
# websocket 的Connection必须设置为Upgrade,表示客户端希望连接升级
proxy_set_header Connection "Upgrade";
#反向代理真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#禁用缓存
proxy_buffering off;
}
}
# wss
# server {
# listen 8084 ssl;
# ssl_certificate /etc/nginx/certs/cert.pem;
# ssl_certificate_key /etc/nginx/certs/key.pem;
# location /mqtt {
# proxy_pass http://emqxws;
# WebSocket Connection Upgrade must be set to "WebSocket," indicating that after receiving a server response, the HTTP protocol is transformed (upgraded) to the WebSocket protocol.
# proxy_set_header Upgrade $http_upgrade;
# WebSocket Connection header must be set to "Upgrade," indicating that the client wishes to upgrade the connection.
# proxy_set_header Connection "Upgrade";
# Proxy Real IP
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header REMOTE-HOST $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Disable Caching
# proxy_buffering off;
# }
# }
}
```
docker run --name=emqx_nginx --restart=always \
-v /docker_data/emqx_nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /docker_data/emqx_nginx/conf/conf.d:/etc/nginx/conf.d \
-v /docker_data/emqx_nginx/log:/var/log/nginx \
-v /docker_data/emqx_nginx/html:/usr/share/nginx/html \
--network dockernet --ip 172.18.0.100 -d -p 18083:18083 -p 1883:1883 -p 8083:8083 nginx
# dokcer安装mysql()
```text
sudo docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.0
sudo mkdir -p /docker_data/mysql_master/{data,log,conf}
sudo chmod 777 -R /docker_data/mysql_master
```
```text
vi /docker_data/mysql_master/conf/my.cnf
```
```text
[mysqld]
log-bin=mysql-bin
#标识唯一id(必须),一般使用ip最后位
server-id=10
#不同步的数据库,可设置多个
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
#指定需要同步的数据库(和slave是相互匹配的),可以设置多个
#binlog-do-db=test #我们这里需要同步所有库,所以这里不设置
```
sudo docker run -d -p 13306:3306 --ip 172.18.1.10 --restart=always --network dockernet --privileged=true \
-v /docker_data/mysql_master/log:/var/log/mysql \
-v /docker_data/mysql_master/data:/var/lib/mysql \
-v /docker_data/mysql_master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=mqttMaster... \
--name mysql_master \
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.0
# docker 安装MongoDB
```text
sudo docker pull mongo:8.0.3
mkdir -p /docker_data/mongodbStandAlone/{data,config,data,log}
sudo chmod 777 -R /docker_data/mongodbStandAlone
vi /docker_data/mongodbStandAlone/config/mongod.conf
# 数据库存储路径
dbpath=/docker_data/mongodbStandAlone/data
# 日志文件路径
logpath=/docker_data/mongodbStandAlone/log/mongod.log
# 监听的端口
port=27017
# 允许所有的 IP 地址连接
bind_ip=0.0.0.0
# 启用日志记录
journal=true
# 是否后台运行
fork=true
# 启用身份验证
auth=true
sudo docker run --restart=always --name mongoStandAlone -p 27017:27017 \
--ip 172.18.3.10 --network dockernet \
-v /docker_data/mongodbStandAlone/config/mongod.conf:/etc/mongod.conf \
-v /docker_data/mongodbStandAlone/data:/data/db -v /docker_data/mongodbStandAlone/log:/var/log/mongodb \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=123456. \
-d mongo:8.0.3 --auth
sudo docker exec -it mongoStandAlone bash
mongosh admin -u admin -p 123456.
#创建一个名为 mqtt,密码为 123456 的用户用户操作mqtt表
db.createUser({ user:'mqtt',pwd:'123456',roles:[{ role:'dbAdmin', db: 'mqtt'},{ role: "readWrite", db: "mqtt" } ]});
权限类型
read 允许用户读取指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin 允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
root 只在admin数据库中可用。超级账号,超级权限
```
# docker 安装redis,随便凑合用着
```text
sudo docker pull redis
sudo docker run --restart=always --ip 172.18.2.10 --network dockernet --name my_redis -d -p 6379:6379 redis redis-server --requirepass redis. --bind 0.0.0.0
```
# rabbitmq
sudo docker pull rabbitmq
sudo mkdir -p /docker_data/rabbitmq/standalone/{data,log}
sudo chmod 777 -R /docker_data/rabbitmq
sudo docker run -d --name rabbitmqStandalone -p 5672:5672 -p 15672:15672 \
--ip 172.18.4.10 \
--network dockernet \
-v /docker_data/rabbitmq/standalone/data:/var/lib/rabbitmq \
-v /docker_data/rabbitmq/standalone/log:/var/log/rabbitmq \
--restart=always \
rabbitmq:latest
sudo docker exec -it rabbitmqStandalone rabbitmq-plugins enable rabbitmq_management

# 创建数据库表
执行sql文件夹的sql
# 配置emqx
# 配置emqx,进入任何一个emqx机器的管理页面
http://ip:40000/
默认账号 admin 密码 public
具体配置请查看mqtt_auth项目
停用默认的file数据源。
创建规则

```text
SELECT
*
FROM
"#"
```
重新发布主题名 sys_msg qos 2
{"payload":"${payload}","qos":${qos},"topic":"${topic}","node":"${node}",
"username":"${username}","clientid":"${clientid}","timestamp":${timestamp}}

```text
SELECT
*
FROM
"$events/client_connected",
"$events/client_disconnected"
```
重新发布主题名 useronlinestatus qos 2
{"event":"${event}","username":"${username}","clientid":"${clientid}","timestamp":${timestamp}}
选择 直接派发
创建emqx API密钥,在nacos里zlz-emqx-dev.yml文件里修改
# 本地安装nacos,建议版本2.4.3
下载地址
https://github.com/alibaba/nacos/releases/download/2.4.3/nacos-server-2.4.3.tar.gz
orhttps://github.com/alibaba/nacos/releases/download/2.4.3/nacos-server-2.4.3.zip
下载慢就用迅雷或镜像
替换配置文件[application.properties](bin/nacos-server-2.4.3/nacos/conf/application.properties)
修改数据库连接信息
docker pull sonatype/nexus3:3.71.0
mkdir /docker_data/nexus3/data
sudo chmod -R 777 nexus3/
docker run -d -p 8081:8081 -p 8082:8082 -p 18383:8083 --ip 172.18.10.1 --network dockernet --name nexus -v /docker_data/nexus3/data:/nexus-data --restart=always sonatype/nexus3:3.71.0