Mqtt e asyncio
« il: Dicembre 09, 2020, 19:22 »
Ciao a tutti sto scrivendo un piccolo programma e vorrei usare asyncio ed mqtt,  in pratica ho una funzione asincrona che aspetta che un asyncio.Event() venga settato per fare il suo lavoro, e il set dell' event dovrei prenderlo dalla funzione di callback on_message di mqtt, ho scritto una funzione per far partire il loop mqtt e la funzione che deve svolgere il lavoro, le faccio partire entrambe usando asyncio.gather alla ricezione del messaggio facendo una print su "event" vedo che passa da unset a set, ma nella funzione asincrona resta sempre in attesa.

questo è il codice che sto usando per capire come fare

import asyncio
import paho.mqtt.client as mqtt

msg_test = ""
event = asyncio.Event()

def event_set():
    event.set()


def on_message(client, userdata, msg):
    global msg_test
    print("on_message",event)
    print(msg.topic+" "+str(msg.payload.decode()))
    event_set()
    msg_test = str(msg.payload.decode())

def on_connect(client, userdata, flags, rc):
    if rc==0:
        client.connected_flag=True
        print("connected OK Returned code=",rc)
        client.subscribe("test")
    else:
        print("Bad connection Returned code= ",rc)

async def print_msg():
    print("sono in async")
    global msg_test
    while True:
        print("print_msg",event)
        await event.wait()
        print("async def", msg_test)
        await asyncio.sleep(5)
        event.clear()


async def mqtt_connect():
    client = mqtt.Client()
    client.on_connect= on_connect
    client.on_message = on_message
    client.username_pw_set("testuser", password="testuser")
    client.connect_async("localhost", 1883)
    await asyncio.sleep(2)
    client.loop_start()


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    coro = asyncio.gather(mqtt_connect(), print_msg())
    event.set()
    loop.run_forever()



volevo capire se è una cosa possibile oppure proprio non si può fare, nel caso esiste un altro modo per farlo sfruttando gli eventi di asyncio, al momento sto usando un'altro script che va a leggere sempre lo stato di una variabile che cambia raramente, quindi volevo usare mqtt.
Spero di essermi spiegato bene.
Grazie