本文已参与「新人创作礼」活动,一起开启掘金创作之路。
在前面两章中分别介绍了MQTT的安装,以及在Java中如何连接使用MQTT进行消息的发布和订阅操作。
因为采用的EMQX作为MQTT的服务,所以本篇将简单介绍一些EMQX常用的配置。
一、topic与通配符
emqx中topic以斜杠(/)划分层级,一个topic必须包含一个斜杠
| 通配符 | 含义 |
|---|---|
| # | 匹配1个或多个层级 |
| + | 匹配1一个层级 |
| ${clientid} | clientId |
| ${username} | username |
二、禁用匿名登录
在创建MQTT连接时,有项参数是输入用户名(username)和密码(password),但是emqx默认是可以匿名登录,并且默认没有认证该用户名和密码。
从安全生产出发,在部署环境应当禁止匿名使用,对连接用户等进行基础验证。
禁用方法:在etc/emqx.conf中修改
allow_anonymous=false # 默认为true
三、用户验证
emqx支持多种用户验证方式,具体可以参考EMQX文档-用户认证
emqx主要支持四种用户认证方式
- 内置数据认证
- JWT认证
- 外部数据库认证
- HTTP API认证
这里主要介绍第一种内置数据认证
首先启用插件
emqx_ctl plugins load emqx_auth_mnesia
在配置文件plugins/emqx_auth_mnesia.conf中添加下面配置即可添加一个用户
auth.client.1.clientid = id
auth.client.1.password = passwd
密码的加密方式可以有多种
## Value: plain | md5 | sha | sha256 | sha512
auth.mnesia.password_hash = sha256
注:此配置必须先禁用匿名登录
四、插件的启用与管理
emqx内置的很多功能是以插件形式植入,部分默认启用,大部分默认未启用。
插件查看
emqx_ctl plugins list
其中active=false即未启用
启用插件
emqx_ctl plugins load plugin_name
注:plugin_name一定是要plugins目录中存在的插件
禁用插件
emqx_ctl plugins unload plugin_name
重新加载插件
emqx_ctl plugins reload plugin_name
注:模块modules与plugins类似,命令
emqx_ctl modules cmd mod_name
五、代理订阅
代理订阅功能可以使连接的client自动订阅某个主题,不需要client主动操作,又emqx服务代为处理。
启用
在命令行执行
emqx_ctl modules load emqx_mod_subscription
配置
## 代理订阅的主题
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>
例如
module.subscription.1.topic = client/%c
module.subscription.2.topic = user/%u
module.subscription.2.qos = 2
module.subscription.2.nl = 1
module.subscription.2.rap = 1
module.subscription.2.rh = 1
占位符
| 占位符 | 含义 |
|---|---|
| %c | clientId |
| %u | username |
六、延迟发布
延迟发布可以使发布的消息延迟指定的时间后推送
-
配置
无
-
启用命令
v4.1.0及以上:emqx_ctl modules load emqx_mod_delayed(挂载模块)
v4.0.0:emqx_ctl plugins load emqx_delayed_publish(挂载插件)
-
说明
延迟发布使用主题前缀 $delayed/{DelayInterval}/{TopicName} ,该功能以主题重写为基础,若使用延迟发布主题前缀,则会将该主题重写,并以指定seconds时间后发布消息至指定的主题。
$delayed: 使用 $delay 作为主题前缀的消息都将被视为需要延迟发布的消息。延迟间隔由下一主题层级中的内容决定。
{DelayInterval}: 指定该 MQTT 消息延迟发布的时间间隔,单位是秒,允许的最大间隔是 4294967 秒。如果 {DelayInterval} 无法被解析为一个整型数字,EMQX 将丢弃该消息,客户端不会收到任何信息。
{TopicName}: MQTT 消息的主题名称。
七、订阅系统主题
系统主题是以$SYS开头的主题,默认只允许本机用户订阅,其他用户需要在配置中配置规则允许订阅。
系统主题介绍可参考官方文档:EMQX文档-系统主题
-
配置
在etc/acl.conf中配置 {allow, {ipaddr, ""}, pubsub, ["$SYS/#", "#"]}.
-
启用命令
无
-
说明
若emqx非系统服务部署本地,则需要添加此配置信息允许服务所在主机订阅系统主题。
八、消息大小限制
-
配置
在etc/emqx.conf中配置zone.external.max_packet_size = 4MB(具体大小根据实际数据而定)
-
启用命令
无
-
说明
官方文档中指出配置项为mqtt.max_packet_size,经过实测,在版本4.0.0及4.1.0中,需配置zone.external.max_packet_size 而非mqtt.max_packet_size
如果此项配置有错误请指正,谢谢。
九、dashboard配置
-
配置
dashboard相关配置在plugins/emqx_dashborad.conf中,dashboard以插件形式存在,默认启动
-
启用命令
无(默认启动)
-
说明
使用http://localhost:18083 访问dashboard页面,用户名和密码在配置文件中更改,默认账户为u:admin,p:public。
10、消息保留
-
配置
在etc/emqx.conf中,修改mqtt.retain_available为true或者false,默认为true,即消息保留。
该功能由插件emqx_retainer配置管理,该插件默认启动,可以调整 EMQ X 储存保留消息的位置,限制接收保留消息数量和 Payload 最大长度,以及调整保留消息的过期时间。
-
启用命令
无(默认启动)
-
说明
服务端收到 Retain 标志为 1 的 PUBLISH 报文时,会将该报文视为保留消息,除了被正常转发以外,保留消息会被存储在服务端,每个主题下只能存在一份保留消息,因此如果已经存在相同主题的保留消息,则该保留消息被替换。当客户端建立订阅时,如果服务端存在主题匹配的保留消息,则这些保留消息将被立即发送给该客户端。
-
注意:若关闭消息保留机制,则在发布消息时retain参数只能传入false,传入true则会异常并断开连接
建议在客户端中配置使用retain=false字段而非直接关闭消息保留,否则易报异常并断开连接
十、关闭遥测
-
配置
在data/loaded_plugins 文件,删除 emqx_telemetry. 这一行数据(注意后面有一个 "." 字符),删除后就表示永远不会启用遥测插件。
-
说明
遥测功能用于向EMQ社区通过http请求上报遥测数据,项目中无需此配置,关掉。
有兴趣的小伙伴可以关注公众号【暴走的怪兽君】,常更新Java干货资讯,免费提供大量教程和工具下载。