0

我正在使用mqtt包在 NodeJS 中编写一个 MQTT 订阅者。这个订阅者的目标是接收到任何/所有主题的所有消息,但看起来订阅#(订阅所有主题)似乎不起作用。但是当我#用一个实际的主题名称替换它似乎工作正常。不知道为什么它不工作。

PS:我使用的broker是emqx。

这是下面的代码。

const mqtt = require('mqtt');

const TOPIC = '#';
const HOST = process.env.HOST || 'localhost';
const PORT = process.env.PORT || 1883;
const USERNAME = process.env.USERNAME || 'username';
const PASSWORD = process.env.PASSWORD || 'password';
const PROTOCOL = 'mqtt';

const clientOption = {
    port: PORT,
    host: HOST,
    username: USERNAME,
    password: PASSWORD,
    protocol: PROTOCOL
};
const client  = mqtt.connect(clientOption);
console.log(`Connecting to mqtt://${HOST}:${PORT}@${USERNAME} topic:${TOPIC} ...`);

client.on('connect', function () {
  console.log(`Connected!`);

  client.subscribe(TOPIC, function(err) {
    if(err) {
      console.error(err);
    } else {
      console.log(`Subscription to ${TOPIC} successful.`);
    }
  });

  client.on('message', function (topic, message) {
    // message is Buffer
    console.log(`Incoming message to topic = ${topic} ...`);
    console.log(message.toString());

    console.log('Preparing outbound message');
    const outboundMsg = {...message, source: topic}
    console.log('Outbound message below');
    console.log(outboundMsg);
  });

});
4

1 回答 1

0

想通了问题。

$SYS/#问题是,我在 docker 容器中运行 emqx,并且 emqx 默认阻止发布和订阅#主题。

这可以在etc/acl.conf文件中被覆盖。

EMQX ACL 文档

于 2021-12-15T13:33:47.510 回答