Каков наилучший способ подписаться и опубликовать sh на несколько тем в paho-mqtt? - PullRequest
1 голос
/ 17 апреля 2020


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

request_list = [('sensors/system/temperature', 0), 
                ('sensors/system/gyroscope', 1), 
                ('sensors/system/acceleration', 2)]

, который содержит мои темы, которые я должен опубликовать sh мои сообщения.
Мой второй список определяет сообщения, которые я хочу опубликовать sh и темы, в которых я хочу получить мой ответ (== темы, на которые я должен подписаться, чтобы получить мои ответы).

request_value = ['{"response":"similarity/sensors/system/temperature","duration":"60s"}',
                  {"response":"similarity/sensors/system/gyroscope","duration":"60s"}', 
                 '{"response":"similarity/sensors/system/acceleration","duration":"60s"}'] 

Мой брокер для каждого topi c одинаков и определен с HOST = "192.168.137.1" на PORT = "8083".
На данный момент я использую для l oop, чтобы подписаться на один topi c, опубликовать sh мое сообщение и ждать прихода сообщения. Потому что мне приходится ждать каждой подписки и публикации. sh чтобы преуспеть в этом очень много времени. Псевдокод моего текущего кода выглядит следующим образом:

list_measurments = []
for topic in request_list:
    client.connect("Broker","Host")
    client.loop_start() 
    client.subscribe("sub_topic")
    client.pub("pub_topic","pub_message")
    client.callback("append list_measurements")
    client.loop_stop() #stop the loop
    client.disconnect

Я пытался использовать потоки из моего вопроса здесь , но оказалось, что нормальное использование потоков будет опубликовать sh одно и то же сообщение для многих разных брокеров. Я тоже думал о нескольких подписках .
Если бы кто-нибудь мог дать мне подсказку, каким будет самый чистый и быстрый подход, я был бы очень благодарен.

1 Ответ

1 голос
/ 17 апреля 2020

Вы должны только подключиться к брокеру и запустить клиент l oop один раз за пределами для l oop.

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

Вы также должны просто подписаться на все темы, которые вы хотите один раз при запуске. Хорошо, вы можете добавить больше или отменить подписку, если необходимо, но если они всегда одинаковы, просто подпишитесь при подключении.

Общий подход c должен выглядеть следующим образом.

def on_connect(client, userdata, flags, rc):
  for i in request_value:
    client.subscribe(i.response)

  for i in request_list:
    //this loop needs to be a bit more complicated
    //as you need to pull the topic from the request_list
    //and the payload from request_value
    client.publish(i)

def on_message(client, userdata, message):
  if message.topic == "similarity/sensors/system/temperature":
    //update temperature
  elif message.topic == "similarity/sensors/system/gyroscope":
    //update gyro
  elif message.topic == "similarity/sensors/system/acceleration":
    //update accel

client.on_connect = on_connect
client.on_message = on_message
client.connect("BrokerIP")
client.loop_start()

При необходимости вы также можете снова запустить publi sh l oop (похоже, вы запрашиваете только 60 с лишним данных одновременно). Возможно, вам лучше объединить структуры данных request_list и request_value в один список.

...