在前面两章中分别介绍了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
    

    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干货资讯,免费提供大量教程和工具下载。

    分类:
    后端