MQTT подписка намного медленнее, чем публикация - PullRequest
0 голосов
/ 10 февраля 2020

Я использую MQTT для передачи данных датчика гидролокатора с устройства EV3DEV на P C. Для этого я настроил брокера MQTT Mosquitto в Ubuntu, работающего в подсистеме Microsoft Windows Linux (WLS), как показано на рисунке ниже.

Schematic of current arquitecture

На стороне EV3DEV я использую модуль umqtt.simple, а на стороне P C я использую модуль Paho MQTT.

Сообщения от EV3DEV к брокеру, кажется, идут быстро, как я и ожидал (с той же скоростью, с которой я мог экспериментировать, когда использовал носки в более ранней версии). Проблема возникает на стороне подписчика, где я вижу, что сообщения принимаются со скоростью МНОГО МЕНЬШЕ, в результате чего сообщения помещаются в очередь в браузере. Когда я останавливаю EV3DEV даже через несколько секунд, я продолжаю получать сообщения на P C в течение некоторого времени.

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

ДОПОЛНИТЕЛЬНЫЕ ЗАМЕЧАНИЯ - Я установил mosquito под WLS, потому что он казался проще, а версия windows, похоже, не работала, просто устанавливая ее. - Я не уверен в скорости, с которой я отправляю сообщения. Вероятно, так быстро, как их принимает брокер, так как он в oop предназначен для получения данных датчика и отправки их брокеру. В любом случае проблема заключается в том, что скорость, с которой брокер принимает сообщения от издателя, намного выше, чем скорость, с которой он отправляет сообщения подписчику. - Вот пример кода, который я использую для функции обратного вызова on_message:

def ProcessMessage(self, client, userdata, msg):
    logging.info("Message received from broker:" +msg.payload.decode())
    Switch = {'robot/sonar': self.PutInSonarQueue, "robot/odo": 
    self.PutInOdometryQueue}
    payloadasobject = ast.literal_eval(msg.payload.decode())
    Switch[msg.topic](payloadasobject)

Оператор switch вызывает функции, которые просто помещают сообщение в очередь.

1 Ответ

0 голосов
/ 10 февраля 2020

Хорошо. Похоже, я подавлял брокера сообщений слишком высокой скоростью обработки сообщений. Теперь вместо непрерывного l oop я делаю перерыв на 50 миллисекунд между публикациями сообщений, и теперь кажется, что подписчик получает сообщения более или менее с той же скоростью, с которой они отправляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...