У меня возникли проблемы с реализацией 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();
}
}
Такой подход не сработает, потому что то, что произойдет, если другой конец никогда не отреагирует (например, разбился). Невозможно это знать на уровне протокола MQTT, в отличие от синхронного протокола, такого как HTTP.
Правильный подход состоит в том, чтобы настроить прослушиватель on('message')
перед вызовом для subscribe
и использовать конечный автомат для записи идентификатора отправленных сообщений и удаления их при ответе. Таким образом вы можете настроить таймер чтобы обеспечить время и ответы на них соответственно.