Как сделать каждое сообщение MQTT Publih отдельным пакетом?

Я создаю систему электронных билетов, и я использую MQTT V3.1.1, чтобы позволить пользователю открывать ворота (ворота были созданы с использованием Raspberry Pi 3 Model B +).

в этом случае я хочу загрузить тестовый брокер и raspberry с 10000 опубликовать сообщение и разные темы для каждого сообщения (диапазон тем от bcn / bcn0000 - bcn / bcn00010000) с полезной нагрузкой unix nano timestamp за один раз. тест прошел успешно, но когда я пытаюсь захватить пакеты MQTT, которые поступают в мой Raspberry Pi во время теста, он захватывает только менее 10000 (это должно быть 10000 пакетов, верно?) Сообщение MQTT Publish и я использую MQTT QoS 0. брокер Я использую Mosquitto, установленный на моем VPS.

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

Изменить: серверное программирование и логика с использованием golang (paho.mqtt.golang) и малины с использованием python (paho.mqtt.python), и я установил set_tcp_nodelay на mosquitto.conf в значение true, но не повезло

составные MQTT публикуют сообщения в одном пакете MQTT  список перехваченных пакетов на raspberry pi, просматриваемых на wirehark


person Ade Putra Nurcholik Santito    schedule 27.12.2018    source источник
comment
Как вы думаете, почему они должны быть отдельными пакетами? Нет необходимости разбивать сообщения MQTT на отдельные TCP-пакеты, и это НАМНОГО эффективнее.   -  person hardillb    schedule 27.12.2018


Ответы (2)


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

Я установил set_tcp_nodelay на mosquitto.conf в значение true, но не повезло

set_tcp_nodelay должен работать, но, возможно, отправить сообщение в одно и то же время, поэтому некоторые сообщения связываются вместе, доставляются на уровень tcp / ip из уровня приложения.

есть ли такой метод, как flush () в (paho.mqtt.golang)?

или самая плохая идея - опубликовать одно сообщение, закрыть соединение и перезапустить новое соединение, чтобы отправить следующее сообщение. сумасшедший...

и, как и @hardillb, мне любопытно, почему вы хотите отправлять отдельные пакеты? согласно модели tcp / ip, нас не волнует, как отправка сообщения на уровне tcp / ip, мы можем получить правильное сообщение на уровне приложения, и этого достаточно.

person linxingyang    schedule 29.12.2018

Используйте строку ниже в клиенте python paho, чтобы отключить алгоритм Нагла, который не будет отправлять несколько сообщений в одном пакете / кадре.

client.connect("0.0.0.0", 1883, 60)  
client.socket().setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)
person ImranRazaKhan    schedule 24.02.2021