最进公司要把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/[email protected]/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/[email protected]/uptime: qos=0
$SYS/brokers/[email protected]/sysdescr: qos=0
打开文件vm.args,把节点名称修改为:
#-name [email protected] -name [email protected]
eg:
$SYS/brokers/[email protected]/uptime: qos=0
$SYS/brokers/[email protected]/sysdescr: qos=0
订阅客户端上下线的主题
具体某个节点的某个clientId方式的主题是:
$SYS/brokers/(node)/clients/(clientId)/connected $SYS/brokers/[email protected]/clients/861694030142478/connected $SYS/brokers/[email protected]/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通过