Я боролся с MQTT сегодня, и это немного помогло мне, но у меня было больше проблем, и ниже вы можете увидеть мои выводы:
Неправильный способ URL-адреса брокера конфигурации
В моем случаекогда я использовал нелокальный сервер MQTT, я начинал с этого:
const app = await NestFactory.createMicroservice(AppModule, {
transport: Transport.MQTT,
options: {
host: 'test.mosquitto.org',
port: 1883,
protocol: 'tcp',
},
});
await app.listenAsync();
, но, как вы можете прочитать в конструкторе ServerMqtt , они используют только опцию url
(если ее не предоставили)откат к 'mqtt://localhost:1883'
. Хотя у меня нет локального MQTT, он никогда не разрешит app.listenAsync()
, который разрешен только на connect , и также не будет запускать какой-либо обработчик.
Он начал работать, когда я настроил код для использования опции url
.
const app = await NestFactory.createMicroservice(AppModule, {
transport: Transport.MQTT,
options: {
url: 'mqtt://test.mosquitto.org:1883',
},
});
await app.listenAsync();
Для сообщений требуется id
свойство
Вторая очень странная проблема заключалась в том, что при использовании Сценарий клиента не-nest.js от @KimKern Мне пришлось зарегистрировать два MessagePatterns: sum
и sum_ack
:
@MessagePattern('sum')
sum(data: number[]): number {
return data.reduce((a, b) => a + b, 0);
}
@MessagePattern('sum_ack')
sumAck(data: number[]): number {
return data.reduce((a, b) => a + b, 0);
}
Когда я использовал console.log
, я обнаружил, что последнийбежать, но только когда присутствует первый. Вы можете подтолкнуть меня жеssage для брокера с помощью mqtt cli tool, чтобы проверить его:
mqtt pub -t 'sum_ack' -h 'test.mosquitto.org' -m '{"data":[1,2]}'
Но самая большая проблема заключалась в том, что он не ответил (опубликовать sum_res) .
Решением было также предоставить id
при отправке сообщения.
mqtt pub -t 'sum_ack' -h 'test.mosquitto.org' -m '{"data":[1,2], "id":"any-id"}'
Тогда мы могли бы удалить MessagePattern 'sum_ack' и оставить только этот код:
@MessagePattern('sum')
sum(data: number[]): number {
return data.reduce((a, b) => a + b, 0);
}
Причина этого была скрыта внутри handleMessage
метода ServerMqtt, который не будет публиковать ответ от обработчика, если сообщение не имело id
.
TL / DR Укажите URL для брокера сообщений, используя только опцию url
, и всегда предоставляйте id
для сообщения.
Надеюсь, это сэкономит времядругим.
Счастливого взлома!