Как создать поток подписки mqtt и сервера socket.io - PullRequest
0 голосов
/ 15 июня 2019

Я попытался настроить приложение на python, которое запускает подписку или публикацию mqtt, и в то же время я запускаю сервер Socket.io. Моей первой попыткой было объединить эти две задачи - никаких проблем с функцией mqtt, но я не могу решить, как запустить сервер Socket.io в потоке. Вот мой код:

mqtt_sub.py

import paho.mqtt.client as mqtt
import test.constants as constants

MQTT_PATH = "sensor/water/level"

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe(MQTT_PATH)

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

def start_mqtt_subs():
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect(constants.MQTT_SERVER, constants.MQTT_SERVER_PORT, constants.MQTT_SERVER_KEEPALIVE)
    client.loop_forever()

socket.py

from aiohttp import web
import socketio

sio = socketio.AsyncServer(async_mode='aiohttp')
app = web.Application()
sio.attach(app)

async def index(request):
    with open('index.html') as f:
        return web.Response(text=f.read(), content_type='text/html')

@sio.on('test')
async def print_message(sid, message):
    print("Socket ID: " , sid)
    print(message)

app.router.add_get('/', index)

def start_socket_server():
    web.run_app(app, host='0.0.0.0', port=1986)

main.py

from test.socket import start_socket_server
from test.mqtt_sub import start_mqtt_subs
import threading

def main():
    t1 = threading.Thread(target=start_mqtt_subs)
    t2 = threading.Thread(target=start_socket_server)
    t1.start()
    t2.start()

if __name__ == '__main__':
   main()

Результатом этого является ошибка во время выполнения.

RuntimeError: There is no current event loop in thread 'Thread-2'.

Я попытался запустить socketio в обработчике, но ничего не произошло. Есть ли другое возможное решение моей проблемы. Заранее спасибо!

...