Как использовать msg.payload глобально для клиента MQTT Python?

Я хочу спросить, есть ли способ использовать msg.payload глобально, а не только внутри функции обратного вызова.

Ниже приведена базовая функция обратного вызова:

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))
    # I usually then specify my steps here, but how can I use the variable outside?


client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

Например, я хочу сделать что-то вроде этого:

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))
    return msg.payload

global_data= on_message
# do whatever I want with the data. I already tried to do this but it didn't work because 
# the client loops forever using client.loop_forever()

person Ahmed Al-haddad    schedule 14.05.2016    source источник
comment
Что ты имеешь в виду? Сообщение существует только внутри обратного вызова. Если вам это нужно где-то еще, вам нужно передать его туда.   -  person Daniel Roseman    schedule 14.05.2016
comment
Да, но как пройти?   -  person Ahmed Al-haddad    schedule 14.05.2016
comment
Так же, как и любой другой параметр функции. Я не уверен, что вы спрашиваете.   -  person Daniel Roseman    schedule 14.05.2016
comment
Вы можете просто показать мне в ответ, и если это сработало для меня, я с радостью приму ваш ответ. только не знаю как :/   -  person Ahmed Al-haddad    schedule 14.05.2016
comment
Я не могу, потому что понятия не имею, что вы пытаетесь сделать или где у вас проблемы.   -  person Daniel Roseman    schedule 14.05.2016
comment
Проблема в том, что я не знаю, как его пройти. Я отредактирую вопрос   -  person Ahmed Al-haddad    schedule 14.05.2016
comment
Но, как я уже сказал, это не имеет смысла. Почему вы хотите сделать это глобально? Сообщение не является глобальным, это то, что происходит в определенное время и передается обратному вызову. Его просто не существует в точке, где оценивается глобальное пространство имен. Вы должны выполнять свои действия внутри on_message, и это может включать вызов других функций оттуда.   -  person Daniel Roseman    schedule 14.05.2016


Ответы (1)


Используйте функцию client.start_loop вместо функции client.loop. Это запустит сетевой цикл в отдельном потоке, что позволит вам делать что-то свое в основном потоке.

Затем вы можете установить или изменить значение глобальной переменной на содержимое msg.payload из обратного вызова.

E.g.

global_var

def on_message(client, userdata, msg): 
  global global_var
  print(msg.topic+" "+str(msg.payload))
  global_var = msg.payload
person hardillb    schedule 14.05.2016