如何使用 NodeJS mqtt、emqx 订阅所有主题/消息
Posted
技术标签:
【中文标题】如何使用 NodeJS mqtt、emqx 订阅所有主题/消息【英文标题】:How to subscribe to all topics/messages using NodeJS mqtt, emqx 【发布时间】:2022-01-18 16:03:43 【问题描述】:我正在使用 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);
);
);
【问题讨论】:
【参考方案1】:找出问题所在。
问题是,我在 docker 容器中运行 emqx,而 emqx 默认阻止发布和订阅 $SYS/#
和 #
主题。
这可以在etc/acl.conf
文件中被覆盖。
EMQX ACL DOCS
【讨论】:
以上是关于如何使用 NodeJS mqtt、emqx 订阅所有主题/消息的主要内容,如果未能解决你的问题,请参考以下文章