EMQ 问答社区

订阅topic失败拿不到错误码

环境信息

  • 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可以看到

dashboard上看的不现实,只有测试的时候能用,真的多起来的时候没法看,客户端对自己订阅成功与否是无感知的

  1. 一般的库订阅都有回调函数
  2. 判断接收到的包
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返回的

不需要 普通的库能支持

你有修改过 etc/acl.conf 文件下的默认 ACL 规则吗?默认配置下非本机连接是无法订阅 $SYS 前缀的系统主题的。

多谢 go版本库拿这个错误码有点麻烦,已经解决

已经解决了,不是要真正的订阅,是要拿到订阅失败后的错误码