@leonidvoroninthebest

Как передать значения из данной функции в основную программу?

Добрый день, столкнулся с проблемой. Есть импортированный в код модуль paho MQTT, в нем есть функция on_message, которая получает из подключения значения msg.topic и msg.payload. Пожалуйста, подскажите, как вытащить полученные значения из этой функции, если сама она выглядит вот так, то есть ни через return, ни через добавление в очередь из нее самой, эти значения у меня достать никак не получилось. Мне же нужно, чтобы при получении сообщений код перебрасывал их в отдельно мною созданный класс очереди, откуда бы дальше с ним шла дальнейшая работа. Пожалуйста, помогите, весь мозг уже себе сломал, никак не получается. def on_message(client, userdata, msg): print(msg.topic, msg.payload) - эти значения мне нужно вычленить в основной код отсюда. client.on_message = on_message (так эта функция выглядит в основном коде) мне нужно что-то вроде return хотя бы как в обычных функциях это всегда работало или хотя бы понять, как реализовать, чтобы из функции можно было перекидывать данные во что-то, что было бы доступно основной программе далее в коде.
import psycopg2
from psycopg2 import Error
import collections
import time
import paho.mqtt.client as mqtt
import logger_file
import postgre
import codecs
import config


class  Data_MQTT():
    """Общий класс входящей информации"""
    def __init__(self, topic, payload):
        self.topic = str(topic)
        self.payload = str(payload, 'UTF-8')
      


def connection():
    try:
        client.connect('host', 'port')
    except OSError:
        logger_file.logging.error('OSError: [Errno 51] Network is unreachable', exc_info=True)
        print('Ошибка соединения!')
        time.sleep(1)
        connection()


def on_connect(client, userdata, flags, rc):
    print("Connected with result code", rc)
    client.subscribe("some_topic/#")


def on_message(client, userdata, msg):
    # print(msg.topic, msg.payload)
    data_mqtt = Data_MQTT(msg.topic, msg.payload)

    # logger_file.logging.info(msg.topic)
    # logger_file.logging.info(msg.payload)
    queue_to.append(msg.payload)
    topic_to_record = data_mqtt.topic
    # print(data_mqtt.topic)
    record_to = data_mqtt.payload
    queue_to.popleft()
    postgre.postgre_code(record_to, topic_to_record)


queue_to = collections.deque()


client = mqtt.Client(client_id="client",
                     clean_session=True,
                     userdata=None,
                     protocol=mqtt.MQTTv311,
                     transport="tcp")

client.on_connect = on_connect
client.on_message = on_message


client.username_pw_set(username=config.config['mqtt']['user'],
                       password=config.config['mqtt']['password'])
print("Connecting...")
connection()
client.connect(config.config['mqtt']['host'], int(config.config['mqtt']['port']))
client.loop_forever()
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
нио каком 'return' тут речь быть не может. Это calback.
Если ваш "основной код" работает в том же потоке, то можете сделать глобальный обьект (синглтон), который будет "виден" на уровне модуля и в on_message и в вашем "основном коде". В него вы затягивайте сообщения, а в другом месте их вынимаете. Для этого очереди и существуют.
Если речь идёт о разных потоках, то так не получится. Тогда оптимально будет поднять внешнюю очередь, например RabbitMQ и пользоваться ею. Но судя по вашему вопросу, знаний у вас пока не хватит на это. Подучить бы сперва питон на более простых вещах.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы