# 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 ![aaa.png](bin/aaa.png) # 创建数据库表 执行sql文件夹的sql # 配置emqx # 配置emqx,进入任何一个emqx机器的管理页面 http://ip:40000/ 默认账号 admin 密码 public 具体配置请查看mqtt_auth项目 停用默认的file数据源。 创建规则 ![a1.png](bin/a1.png) ```text SELECT * FROM "#" ``` 重新发布主题名 sys_msg qos 2 {"payload":"${payload}","qos":${qos},"topic":"${topic}","node":"${node}", "username":"${username}","clientid":"${clientid}","timestamp":${timestamp}} ![a2.png](bin/a2.png) ```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