[Python] Asyncio e mqtt

Vinny Mautone vinny74man a gmail.com
Gio 10 Dic 2020 18:29:37 CET


Ciao a tutti sto provando ad integrare asyncio ed mqtt ma con scarsi
risultati, attualmente ho un programma che in un while True legge ogni
secondo lo stato di un sensore con la funzione get del modulo requests, se
questo sensore cambia stato vado avanti col programma, il mio scopo sarebbe
quello di leggere lo stato del sensore tramite la sottoscrizione di un
topic mqtt e usando asyncio.Event settare l'evento in modo che con un'altra
funzione sempre fatta con asyncio che resta in attesa dell'evento farla
partire solo in quel caso.

questo è il codice di prova 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 #set flag
        print("connected OK Returned code=",rc)
        client.subscribe("acquario/input_boolean/manutenzione/status")
    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 print_msg_2():
    print("sono in async")
    global msg_test
    while True:
        print("print_msg_2",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(), print_msg_2())
    event.set()
    loop.run_forever()

logicamente non è questo lo script che mi servirà lo sto solo usando per
comprendere il modo giusto di come integrare asyncio ed mqtt.

Spero di essermi spiegato e che qualcuno possa aiutarmi.
Grazie
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20201210/809e4293/attachment.html>


Maggiori informazioni sulla lista Python