The umqtt.simple module is sync.You'd better use peterhinch's uasync mqtt lib.
While you only need subscribe to some topic.
my solution is :
- use check_msg() instead of wait_msg(),cause check_msg() return immediately.
import uasyncio
from umqtt.simple import MQTTClient
loop = uasyncio.get_event_loop()
async def my_callback(topic,msg):
await uasyncio.sleep(1)
def sub_callback(topic, msg):
global loop
loop.create_task(my_callback(topic,msg))
async def my_main():
c = MQTTClient("umqtt_client", server)
c.set_callback(sub_callback)
c.connect()
c.subscribe(b'foo_con')
pass
loop.creat_task(my_main())
loop.run_forever()
The official umqtt.simple from micropython-lib does not support setting the 'sock'.
Only client_id,server, port, user, password, keepalive, ssl is possible.
Also umqtt.simple uses a normal socket. When using Websockets, all MQTT packets are wrapped in a Websocket packet so it is not possible, without significant modifications, to use it in umqtt.simple.
I have made a async MQTT-client using Websockets. I use a patched version of aiohttp. The modifications to aiohttp were necessary because aiohttp does not accept headers (which are needed for almost every broker). Even then, aiohttp can still be blocking because the used getaddrinfo is still a blocking function, therefore I use my own developed, fully async, version of getaddrinfo.