Могу ли я опубликовать несколько тем MQTT в одном запросе?

10

У меня есть устройство с несколькими датчиками, которое публикует показания каждого датчика отдельно в такие темы, как

device1-id/sensor1-id = 10.2
device1-id/sensor2-id = 15.5
[...]

Мы передаем его в AWS IoT с помощью Amazon AWS IoT SDK, т.е.

mqtt_params.qos = QOS1;
mqtt_params.payload = payload;
mqtt_params.payloadLen = payload_len;
rc = aws_iot_mqtt_publish(&client, topic, topic_len, &mqtt_params);

Каждый вызов генерирует отдельный пакет TCP и отдельный ответ от брокера AWS MQTT. Проблема в том, что некоторые из наших узлов находятся в очень медленной сети и ожидают подтверждения после каждого пакета, который задерживает публикацию.

Есть ли способ объединить все показания датчиков в один пакет TCP, опубликовав их в отдельных разделах и сохранив QOS = 1?

мМЕ
источник

Ответы:

7

Похоже, что aws IoT sdk использует синхронную публикацию (так как использует код возврата), поэтому он блокирует каждое сообщение.

На уровне протокола MQTT нет причины, по которой вы не можете иметь несколько сообщений в полете одновременно, поэтому вы можете посмотреть на использование асинхронного клиента paho, чтобы ожидание ответа QOS1 можно было выполнить без блокировки публикации следующего сообщения.

Другой вариант - опубликовать только одно составное сообщение со всеми значениями датчиков за один раз и разделить его на стороне потребителя.

hardillb
источник
1
Пока он не беспокоится о коде ответа. Если вы не получили 200 OKответа, значит ли это, что обе операции завершились неудачно? Единственный? Если да, то какой?
Моуг говорит восстановить Монику
Вы все еще можете проверить код возврата, вам просто нужно проверить его по токену, возвращенному из публикации, чтобы узнать, к какому из них он относится.
Hardillb
Но, в отличие от SUBSCRIBE, мы не можем настроить массив тем и соответствующих им сообщений в одном и том же сообщении MQTT, верно?
cogitoergosum
hardillb вы сказали: « Другой вариант - опубликовать только одно составное сообщение со всеми значениями датчика за один раз и разделить его на стороне потребителя». Под этим вы подразумеваете многоуровневый шаблон ?
user170106
1
@ user170106 Нет, объединение всех обновлений в одно сообщение означает, что вам нужно подписаться только на одну тему.
Hardillb