Тема Python не работает одновременно - PullRequest
0 голосов
/ 24 января 2019

В настоящее время я работаю с python и хочу получать данные через MQTT, а затем отправлять их на сервер. Когда я получаю «0», я хочу запустить таймер, который должен работать в фоновом режиме, чтобы я все еще мог получать данные и отправлять их на сервер. Я запускаю таймер с потоком, но в моем случае программа останавливается до истечения времени таймера, а затем продолжает получать и отправлять.

Код:

import threading
import time
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
     client.subscribe("test/test/projekt")

def timer_started():
     global timer_thread
     print("timer started")
     shutdown_timer = time.time()
     elapsed = 0
     while elapsed < 5:
          elapsed = time.time()-shutdown_timer
     print("Timer finished")

def on_message(client, userdata,msg):
     global thread_active 
     if msg.payload =="0" and thread_active == False:
           thread_active =True
           global timer_thread
           timer_thread.start()

timer_thread = threading.Thread(target=timer_started)
client=mqtt.CLient()
client.on_connect() = on_connect
client.on_message= on_message
client.connect("test.mosquitto.org",1883,60)
client.loop_forever()

Кто-нибудь знает, что я делаю не так?

1 Ответ

0 голосов
/ 24 января 2019

Виновной может быть переменная thread_active и сравнение msg.payload.Полезная нагрузка MQTT должна быть преобразована в строку перед ее сравнением.Я сделал проверку для вышеуказанного кода с модификацией, он мог получать данные, находясь в потоке таймера.

Ниже приведен рабочий пример:

import threading
import time
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print('connection')
    print (rc)
    client.subscribe("Test")

def timer_started():
    global timer_thread, thread_active
    print("timer started")
    shutdown_timer = time.time()
    elapsed = 0
    while elapsed < 5:
        elapsed = time.time()-shutdown_timer
    print("Timer finished")
    thread_active =False

def on_message(client, userdata,msg):
    print("Message")
    print(msg.payload)
    global thread_active
    if msg.payload.decode("utf-8") =="0" and thread_active == False:
        thread_active =True
        global timer_thread
        timer_thread.start()


timer_thread = threading.Thread(target=timer_started)
thread_active = False
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("localhost",1883,60)
client.loop_forever()

При публикации значения фиктивной темы 'Test' с '0' таймер запускается и во время запуска таймера для проверки '5'опубликовано в той же теме.Ниже выводится ожидаемый результат:

connection
0
Message
b'0'
timer started
Message
b'5'
Timer finished
...