开发中mqtt遇到MqttException (128)异常问题

本文解决MQTT订阅主题失败的问题,详细分析了异常原因并提供了修改acl.config文件的方法,确保非本地IP能成功订阅特定主题,同时讨论了安全策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最进公司要把mqtt给独立出来,专门给他一个服务器进行部署,然后我就在测试非127.0.0.1连接时抛出异常

异常如下:

MqttException (128)
    at org.eclipse.paho.client.mqttv3.MqttClient.subscribe(MqttClient.java:347)
    at com.dmxj.qianghe.common.push.MqttSub.sub(MqttSub.java:48)
    at com.dmxj.qianghe.common.push.MqttSub.runsub(MqttSub.java:55)
    at com.dmxj.qianghe.common.socket.SocketClientInit.init(SocketClientInit.java:61)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1132)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1079)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:973)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4885)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5199)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743

这个网上找了下是订阅异常了,然后看了下我的订阅,果然订阅主题为

$SYS/brokers/emq@120.0.0.1/clients/#

自然订阅不上,直接修改成对于ip也不行,看来是acl.config文件定义了可订阅$SYS主题的权限

{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.

{allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.

%%%{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.

{allow, all}.

acl.config文件第三行默认是禁止客户端订阅$SYS/#主题。我们把它注释掉。开启一个客户端,订阅$SYS/#主题,消息如下:

module(emqttd_broker)这个模块,它会每秒钟publish消息,主题关键字有uptime和datetime等。

module(emqttd_stats)这个模块,它会每60秒钟publish消息,把Ets表mqtt_stats的信息发出来。

module(emqttd_metrics)这个模块,它的原理同上。

eg: 

$SYS/brokers/emqttd@127.0.0.1/uptime: qos=0

$SYS/brokers/emqttd@127.0.0.1/sysdescr: qos=0

 

打开文件vm.args,把节点名称修改为:

#-name emqttd@127.0.0.1
-name emqttd@172.16.6.161

eg: 

$SYS/brokers/emqttd@172.16.6.161/uptime: qos=0

$SYS/brokers/emqttd@172.16.6.161/sysdescr: qos=0

 

订阅客户端上下线的主题

具体某个节点的某个clientId方式的主题是:

$SYS/brokers/(node)/clients/(clientId)/connected
$SYS/brokers/emqttd@172.16.6.161/clients/861694030142478/connected
$SYS/brokers/emqttd@172.16.6.161/clients/861694030142478/disconnected

 

通配方式的主题是:

$SYS/brokers/+/clients/+/connected
$SYS/brokers/+/clients/+/disconnected
$SYS/brokers/+/clients/#

 

出于安全起见,我们把acl.config文件修改为:

允许客户端订阅"$SYS/brokers/+/clients/#"主题,但是禁止订阅"$SYS/#"主题。

{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.

{allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.

{allow, all, subscribe, ["$SYS/brokers/+/clients/#"]}.

{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.

{allow, all}.

  以上修改重试连接OK通过

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值