Python/Django постоянная подписка на тему MQTT Mosquito и получение данных
В моем проекте django я хочу подписаться на тему MQTT навсегда и запускать действия при изменении темы.
В моем __init__.py
файле приложения я пытаюсь:
client1 = mqtt.Client(hex(uuid.getnode()))
data_dict = init_client('IOT/Data/#')
for k, v in data_dict.items():
...do some stuff with data
функция init_client
подключается к моему MQTT серверу и запускает цикл (я использую paho.mqtt.client):
def init_client(t_topic='IOT/Data/#'):
# Instantiate and check connection about MQTT instance
client1.on_connect = on_connect # attach function to callback
client1.on_message = on_message # attach function to callback
if t_topic == 'IOT/Data/#':
client1.message_callback_add(t_topic, on_message_data)
else:
client1.message_callback_add(t_topic, on_message_reg)
client1.on_publish = on_publish # attach function to callback
# client1.on_subscribe =on_subscribe
# attach function to callback
try:
client1.tls_set(mqtt_ca_crt, mqtt_cli_crt, mqtt_cli_key)
client1.tls_insecure_set(True)
except ValueError:
logging.info("SSL/TLS Already configured")
time.sleep(1)
try:
if not client1.is_connected():
client1.connect(mqtt_server, mqtt_port) # connect to broker
client1.connected_flag = False
except Exception:
logging.error("Cannot connect MQTT Client1")
client1.loop_forever()
...and some other stuff
проблема в том, что когда запускается loop_forever(), все приложение django замирает, ожидая вечность.
Итак, мой вопрос заключается в следующем: Как я могу подписаться на тему с помощью paho.mqtt (асинхронно) при запуске моей django allpication и получать уведомления каждый раз, когда тема меняется в реальном времени? Есть ли другие более умные способы сделать это с помощью django?
Заранее большое спасибо
Из Python Paho doc
loop_start() / loop_stop()
loop_start() loop_stop(force=False)
Эти функции реализуют потоковый интерфейс к сетевому циклу. Вызов функции loop_start() один раз, до или после connect*(), запускает поток в фоновом режиме для автоматического вызова loop(). Это освобождает основной поток для другой работы, которая может быть блокирована. Этот вызов также обрабатывает повторное подключение к брокеру. Вызовите loop_stop(), чтобы остановить фоновый поток поток. Аргумент force в настоящее время игнорируется.