之前在自助洗车项目中使用emqx的是4.4版本,最新部署的时候采用了5.0。
旧版本认证、上下线通知等都需要开启插件,在配置文件修改,操作比较麻烦。
升级后增强了dashboard(web管理界面),好多插件都成为内置插件,无需开启,且很多操作无需进入配置文件,直接在web即可配置。
认证、授权(以mysql为例)
1.创建数据库、表
- 创建数据库(自定义数据库名)
- 创建认证表(mqtt_user)
CREATE TABLE `mqtt_user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`password_hash` 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;
#@auth 157239486@qq.com
- 创建授权表(mqtt_acl)
CREATE TABLE `mqtt_acl` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`permission` varchar(5) NOT NULL,
`action` varchar(9) NOT NULL,
`topic` varchar(100) NOT NULL,
INDEX username_idx(username),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 登录dashboard,访问控制-认证
3.选择mysql,下一步,设置自己的mysql连接信息
一定要注意选择符合自己的 密码加密方式、加盐方式,在mysql设置密码的时候需要对应,否则会连接不上。
4.授权跟认证类似,就不贴了
EMQX客户端上线、下线通知(webhook)
1.数据集成-数据桥接-新建
2. 设置webhook信息
其他默认即可,URL、请求体需要设置。EMQX如果和服务端在同一服务器上,可以写内网地址。
请求体一定要自己配置,按我这个格式就是发送客户端ID和event事件,后台服务端接收到根据客户端ID更新上下线状态。
ps: 刚开始没有仔细看请求体,以为跟以前4.4版本一样,默认发送,无需设置,后来才发现需要自己按格式输入,导致在这浪费了几个小时。。。 默认的是请求体是${payload},导致我在后台转换json的时候一直报错。
3.创建完成后会提示创建规则,或自行点击【数据集成-规则】
4.选择【动作】-【添加动作】
动作就是检测到事件后要执行什么行为,比如上线后通知给web服务端,或者转发给其他主题
客户端上线完整数据(需要的时候${属性名} 提取)
{"username":"username11","timestamp":1671771784831,"sockname":"172.17.0.2:1883","receive_maximum":32,"proto_ver":4,"proto_name":"MQTT","peername":"127.0.0.1:62742","node":"emqx@172.17.0.2","mountpoint":"undefined","metadata":{"rule_id":"rule_kmld"},"keepalive":30,"is_bridge":false,"expiry_interval":7200,"event":"client.connected","connected_at":1671771784831,"conn_props":{"User-Property":{}},"clientid":"clientid111","clean_start":false}
下线数据只是这里有变化,“event”:“client.disconnected”文章来源:https://www.toymoban.com/news/detail-708779.html
后台判断上下线Demo
/**
* 在线状态更新
*
* @author Lion 157239486@qq.com
* @since 1.0.0 2022-12-17
*/
public void updateStatus(Map<String, Object> params) {
String event = (String) params.get("event");
String clientId = (String) params.get("clientId");
if (event.equals("client.connected")) {
editOnline(true, clientId);
}
if (event.equals("client.disconnected")) {
editOnline(false, clientId);
}
}
写文不易,能看到这里给个star吧~文章来源地址https://www.toymoban.com/news/detail-708779.html
到了这里,关于MQTT EMQX v5.0版本监听客户端上下线通知、认证、授权的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!