Paho-mqtt подписаться на одноразовое сообщение - PullRequest
0 голосов
/ 01 мая 2020

Существует ли элегантный способ получить одно сообщение от брокера без необходимости:

  1. подписаться
  2. создать on_message ()
  3. получить сообщение
  4. отписаться

Я спрашиваю, потому что мы используем json сообщение с несколькими полями. Когда приходят новые данные, я хочу ТОЛЬКО обновить это конкретное поле в сообщении json, но не удалять оставшиеся данные. Так как у нас есть тонна этих json тем, мы на самом деле не хотим хранить их все в памяти программы (также в случае, если программа должна быть перезапущена). Кроме того, эта программа может работать месяцами без присмотра.

Так что в идеале я хотел бы отправить сообщение json на ID topi c с установленным флагом сохранения Правда. Затем, когда поступают новые данные для этого идентификатора, я выполняю извлечение информации об этой топи c, обновляю это конкретное поле в сообщении json и помещаю репост в ту же топи c.

Я могу опубликовать пример кода, но я надеюсь, что есть простая функция, о которой я не знаю.

Заранее спасибо за любые предложения.

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Клиент Paho Python поставляется с набором классов справки, которые делают для вас этот тип одиночного выстрела.

Do c здесь

например, следующее подключается к брокеру, подписывается на topi c и возвращается после получения первого сообщения на этом topi c.

import paho.mqtt.subscribe as subscribe

msg = subscribe.simple("paho/test/simple", hostname="mqtt.eclipse.org")
print("%s %s" % (msg.topic, msg.payload))

И соответствующий вызов publi sh:

import paho.mqtt.publish as publish

publish.single("paho/test/single", "payload", hostname="mqtt.eclipse.org")
0 голосов
/ 01 мая 2020

Я не думаю, что это возможно. Вы говорите: «Когда приходят новые данные ...» Именно поэтому вам нужно подписаться и использовать функцию обратного вызова. Это в основном «тяга, когда что-то действительно есть».

Просто чтобы понять, как это должно работать: вы отправляете это сообщение json через MQTT, верно? И вы повторно отправляете его, когда он меняется?

Но вам не нужно хранить их все в оперативной памяти. Вы можете использовать сохраненное сообщение в сочетании с фиксированным topi c (без идентификатора) и отправить идентификатор в сообщении.

Если вы используете сохраненные сообщения с идентифицированными темами, это может заполнить память.

Что означает идентификатор? Уникальный ie номер? Что-то вроде отметки времени? А га sh? Отправитель?

Я думаю, что вы можете решить эту проблему, четко разделив свои вещи, например, в data и message, где data - это то, что вы поддерживаете в Python (например, база данных или что-то в ОЗУ), а message - это то, что вы фактически отправляете / получаете через MQTT.

Затем вы можете добавить / отправить / обновить data в зависимости от того, что получено в MQTT, и вам не нужно отправлять / обновлять полный набор.

...