环境信息
- EMQ X 版本:4.1.0
- 操作系统及版本:centos7
- 其他
问题描述
客户端订阅后如何知道是订阅成功还是失败了,目前看没有任何消息回来,不知是否是所用库的原因
配置文件及日志
2021-07-02 14:53:29.299 [debug] <<"gtja">>@10.176.118.154:52707 [MQTT] RECV SUBSCRIBE(Q1, R0, D0, PacketId=2, TopicFilters=[{<<"$SYS/brokers/emqx@10.187.129.229/metrics/messages/qos1/received">>,#{nl => 0,qos => 1,rap => 0,rh => 0}}])
2021-07-02 14:53:29.299 [debug] <<"gtja">>@10.176.118.154:52707 [MQTT] SEND SUBACK(Q0, R0, D0, PacketId=2, ReasonCodes=[128])
dashboard上看的不现实,只有测试的时候能用,真的多起来的时候没法看,客户端对自己订阅成功与否是无感知的
- 一般的库订阅都有回调函数
- 判断接收到的包
const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://192.168.50.167:1883')
client.on('packetreceive', (packet) => {
console.log(`recv packet`, packet)
})
client.subscribe('$SYS/#', (error, granted) => {
if (!error) {
console.log(granted)
}
})
output,granted 里面的参数
recv packet Packet {
cmd: 'suback',
retain: false,
qos: 0,
dup: false,
length: 3,
topic: null,
payload: null,
granted: [ 128 ],
messageId: 7695
}
[ { topic: '$SYS/#', qos: 128 } ]
这个是否要库支持mqtt 5.0的协议才能拿到错误码呢,看EMQ的debug日志里面128返回的
t1ger
7
你有修改过 etc/acl.conf 文件下的默认 ACL 规则吗?默认配置下非本机连接是无法订阅 $SYS 前缀的系统主题的。
已经解决了,不是要真正的订阅,是要拿到订阅失败后的错误码