Реализация MQTT ACK - перерыв в прослушивании событий

1

У меня возникли проблемы с реализацией ACK, чтобы получить обратную связь, что сообщение было доставлено с использованием MQTT. Моя концепция заключается в предоставлении идентификатора среди сообщения, отправленного отправителем, так что получатель отправляет обратно ACK с тем же идентификатором на другом канале. Теперь проблема заключается в том, что я не могу сломать прослушивание события, когда получаю 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();
  }
}
Теги:
event-handling
mqtt

1 ответ

0

Такой подход не сработает, потому что то, что произойдет, если другой конец никогда не отреагирует (например, разбился). Невозможно это знать на уровне протокола MQTT, в отличие от синхронного протокола, такого как HTTP.

Правильный подход состоит в том, чтобы настроить прослушиватель on('message') перед вызовом для subscribe и использовать конечный автомат для записи идентификатора отправленных сообщений и удаления их при ответе. Таким образом вы можете настроить таймер чтобы обеспечить время и ответы на них соответственно.

  • 0
    @hardlib Я согласен с вашими предложениями, но первое, что мне нужно сделать, - это включить событие («message») и вернуть какое-то значение.
  • 0
    Сохраните обещание в конечном автомате с идентификатором и используйте его для возврата значения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню