环境以及版本:
emqx:4.3.10
Ubuntu:20.04
一、配置用户名密码登录,关闭匿名登录
- 配置匿名认证开关:
# etc/emqx.conf
## 该值设置为 false 表示客户端必须输入用户名密码才能连接
allow_anonymous = false
- 使用外部 MySQL 数据库作为认证数据源:
要启用 MySQL 认证,需要在
etc/plugins/emqx_auth_mysql.conf
中配置以下内容
## 服务器地址
auth.mysql.server = 127.0.0.1:3306
## 连接池大小
auth.mysql.pool = 8
auth.mysql.username = emqx
auth.mysql.password = public
auth.mysql.database = mqtt
auth.mysql.query_timeout = 5s
MySQL 认证默认配置下需要确保数据库中有下表: 具体参考:官方文档
CREATE TABLE `mqtt_user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`salt` varchar(35) DEFAULT NULL,
`is_superuser` tinyint(1) DEFAULT 0,
`created` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `mqtt_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `mqtt_user` ( `username`, `password`, `salt`)
VALUES('emqx', 'efa1f375d76194fa51a3556a97e641e61685f914d446979da50a551a4333ffd7', NULL);
# 启用 MySQL 认证后,你可以通过用户名: emqx,密码:public 连接
- Dashboard 控制面板开启 Mysql 插件功能
二、 配置代理订阅
5. 开启代理订阅功能:
代理订阅功能由
emqx_mod_subscription
内置模块提供,此功能默认关闭,支持在 EMQ X Broker 运行期间动态启停
可实现类似阿里云 p2p 点对点消息功能
## 代理订阅的主题
module.subscription.<number>.topic = <topic>
## 代理订阅的订阅选项:QoS
## 可选值: 0、1、2
## 默认值:1
module.subscription.<number>.qos = <qos>
## 代理订阅的订阅选项:No Local
## 可选值: 0、1
## 默认值:0
module.subscription.<number>.nl = <nl>
## 代理订阅的订阅选项:Retain As Published
## 可选值: 0、1
## 默认值:0
module.subscription.<number>.rap = <rap>
## 代理订阅的订阅选项:Retain Handling
## 可选值: 0、1、2
## 默认值:0
module.subscription.<number>.rh = <rh>
例如,在
etc/emqx.conf
文件中添加以下代理订阅规则
module.subscription.1.topic = live_room/p2p/%c
module.subscription.1.qos = 0
三、 配置WebHook检测设备上下线通知
- 开启WebHook功能:
Webhook 的配置文件位于
etc/plugins/emqx_web_hook.conf
具体参考:官方文档
## Webhook URL
web.hook.url = http://192.168.1.181:9000/api/mqtt/webhook
## 客户端上线事件
web.hook.rule.client.connected.1 = {"action": "on_client_connected"}
## 客户端下线事件
web.hook.rule.client.disconnected.1 = {"action": "on_client_disconnected"}
- Dashboard 控制面板开启 web_hook 功能
- SpringBoot 中 配置事件接收URL 路径,进行业务代码自定义处理上下线事件
package com.boot.voice.controller.api;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/mqtt")
public class MqttController {
@PostMapping("/webhook")
public void onWebHook(@RequestBody Map<String, String> param) {
String action = MapUtil.getStr(param, "action", "");
String clientId = MapUtil.getStr(param, "clientid", "");
if ("client_disconnected".equals(action)) {
log.info("MQX 断开连接接收参数:{}", param);
}else if("client_connected".equals(action)){
log.info("MQX 连接成功接收参数:{}", param);
}
}
}