1、安装服务器
首先,在 CentOS 中安装 EMQX 服务器。EMQX 支持通过 Yum 源安装,可通过以下 Yum 命令从中自动下载和安装 EMQX。
- 通过以下命令配置 EMQX Yum 源:
curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash
- 安装以下依赖项:
yum install epel-release -yyum install -y openssl11 openssl11-devel
- 运行以下命令安装 EMQX:
sudo yum install emqx -y
- 运行以下命令启动 EMQX:
sudo systemctl start emqx
- 运行以下命令查看服务是否开启
sudo systemctl status emqx
- 在浏览器中输入
ip:18083
,进入 EMQX 的 dashboard 面板则说明服务启动成功
注意,安装过程中出现了,通过systemctl命令查看服务已经启动,但客户端无法访问服务的情况。出现这种情况下需要执行
cd /usr/bin
进入EMQX安装目录,执行sh emqx
命令启动EMQX进程。
2、开启 HTTP 认证
2.1、请求格式与返回结果
认证过程类似一个 HTTP API 调用,EMQX 作为请求客户端需要按照 “API” 要求的格式构造并向 HTTP 服务发起请求,而 HTTP 服务需要按照 “客户端” 的要求返回结果:
- 响应编码格式
content-type
必须是application/json
。 - 认证结果通过 body 中的
result
标示,可选allow
、deny
、ignore
。 - 超级用户通过 body 中的
is_superuser
标示,可选true
、false
。 - 从 EMQX v5.7.0 版本开始,可以使用可选的
client_attrs
字段设置客户端属性。请注意,键和值都必须是字符串类型。 - HTTP 响应状态码
Status Code
应当为200
或204
,返回4xx/5xx
状态码时将忽略 body 并判定结果为ignore
,继续执行认证链。
响应示例:
HTTP/1.1 200 OK
Headers: Content-Type: application/json
...
Body:
{
"result": "allow", // 可选 "allow" | "deny" | "ignore"
"is_superuser": true, // 可选 true | false,该项为空时默认为 false
"client_attrs": {
"role": "admin",
"sn": "10c61f1a1f47"
}
}
2.2、通过 DashBoard 配置
- 在浏览器中输入
ip:18083
,登录进入 dashboard 面板,账号默认为:admin
,密码默认为:public
- 点击左侧客户端认,再点击创建按钮
- 认证方式选择 Password-Based 方式
- 数据源选择 HTTP 服务
5. 配置请求具体参数
- 请求方式:选择 HTTP 请求方式,可选值:
get
、post
。 - URL:输入 HTTP 服务的 URL 地址。
- Headers(可选):HTTP 请求头配置。可以添加多个请求头。
- Pool size(可选):整数,指定从 EMQX 节点到外部 HTTP Server 的并发连接数;默认值:8。
- 连接超时(可选):填入连接超时等待时长,可选单位:小时、分钟、秒、毫秒。
- HTTP 管道(可选):正整数,指定无需等待响应可发出的最大 HTTP 请求数;默认值:100。
- 请求超时(可选):填入连接超时等待时长,可选单位:小时、分钟、秒、毫秒
- TLS 配置:配置是否启用 TLS。
- Body:请求模板,对于
POST
请求,它以 JSON 形式在请求体中发送。对于GET
请求,它被编码为 URL 中的查询参数(Query String)。映射键和值可以使用占位符。
最后点击创建完成相关配置。
3、编写服务端代码
服务端接收到 EMQX 发来的请求连接的客户端的用户名和密码,从数据库中查出是否有对应密码,并根据结果按 EMQX 要求的响应格式响应。
@RestController
@RequestMapping("/mqtt")
public class MQTTController {
@RequestMapping(value = "/auth", method = RequestMethod._POST_)
public ResponseEntity<Map<String, Object>> authMQTTConsumer(@RequestBody Map<String, Object> requestMap, @RequestParam(value = "clientid") String clientId) {
int status = 200;
String username = requestMap.get("username").toString();
String password = requestMap.get("password").toString();
Map<String, Object> responseBody = new HashMap<>();
/*
模拟根据username从数据库中查出数据
*/
if (username.equals("jack") && password.equals("123")) {
responseBody.put("result", "allow");
} else {
responseBody.put("result", "deny");
status = 403;
}
responseBody.put("is_superuser", false);
return ResponseEntity._status_(status)
.header("content-type", "application/json")
.body(responseBody);
}
}
这里请求路径为
address:port/mqtt/auth?clientid=${clientid}
,第二节中EMQX的dashboard的URI也应该填写此处的请求路径。
4、测试
可在 Windows 上安装 MQTTX 作为客户端进行测试。MQTTX 下载链接:https://mqttx.app/zh
在 MQTTX 中新建连接,填写 EMQX 的服务器地址和端口号,端口号默认为1883
,填写用户名和密码进行请求连接。