MQTT ACK实现 - 事件监听中断

时间:2018-01-06 15:13:43

标签: javascript event-handling mqtt

我在实现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();
  }
}

1 个答案:

答案 0 :(得分:0)

这种方法不起作用,因为如果另一端永远不会响应(例如已经崩溃)会发生什么。与HTTP等同步协议不同,无法在MQTT协议级别了解这一点。

正确的方法是在调用on('message')之前设置subscribe侦听器,并使用状态机记录已发送消息的ID,并在响应进入时将其删除。这种方式你可以设置一个计时器,以便在响应时间内做出适当的处理并适当地处理它们。