我在实现ACK方面遇到了麻烦,以便获得使用MQTT传递消息的反馈。我的构想在于在发送方发送的消息中提供id,以便接收方在不同的信道上发回具有相同id的ACK。现在出现的问题是,当我收到确认时,我无法打破事件的监听。
到目前为止,我的代码是
let mqtt = require('async-mqtt')
, cfg = require('./cfg');
let client = mqtt.connect(cfg.server);
client.subscribe('some/other/topic');
client.on('connect', sendWithAck)
let id = 123;
async function sendWithAck() {
try {
await client.publish('some/topic', `Message with id${id}`, () => {
client.on('message', (topic, msg) => {
console.log(`${topic}> ${msg.toString()}`);
//this.stopPropagation(); //doesn't work
})
});
await client.end();
console.log('done');
} catch(e) {
console.log('error', e);
process.exit();
}
}
答案 0 :(得分:0)
这种方法不起作用,因为如果另一端永远不会响应(例如已经崩溃)会发生什么。与HTTP等同步协议不同,无法在MQTT协议级别了解这一点。
正确的方法是在调用on('message')
之前设置subscribe
侦听器,并使用状态机记录已发送消息的ID,并在响应进入时将其删除。这种方式你可以设置一个计时器,以便在响应时间内做出适当的处理并适当地处理它们。