Задать вопрос
@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()
  • Вопрос задан
  • 221 просмотр
Подписаться 1 Простой 3 комментария
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
нио каком 'return' тут речь быть не может. Это calback.
Если ваш "основной код" работает в том же потоке, то можете сделать глобальный обьект (синглтон), который будет "виден" на уровне модуля и в on_message и в вашем "основном коде". В него вы затягивайте сообщения, а в другом месте их вынимаете. Для этого очереди и существуют.
Если речь идёт о разных потоках, то так не получится. Тогда оптимально будет поднять внешнюю очередь, например RabbitMQ и пользоваться ею. Но судя по вашему вопросу, знаний у вас пока не хватит на это. Подучить бы сперва питон на более простых вещах.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы