micropython 使用MQTT如果不经过配置的话,会自动断开连接,我根据自己的踩过的坑分享一下
主要地方
client = MQTTClient(client_id, mserver, port, user=mq_user, password=mq_password,keepalive=60)
tim.init(period=keepLiveTime*1000, mode=Timer.PERIODIC, callback=lambda t: keepLiveTimeCb(client))
定时ping()要不然过一会指定掉线。
from umqtt.robust import MQTTClient
from machine import Pin
import machine
import network
import time
import utime
def sub_callback(topic, cmd):
"""
收到订阅消息回调
"""
global client
print((topic_ctl, cmd))
print(cmd)
if cmd == 1 or cmd == b'1':
pub_msg = 'LED1: ON-state'
feedFish()
elif cmd == b'led1 OFF' or cmd == b'led1 off':
pub_msg = 'LED1: OFF-state'
elif cmd == b'led2 ON' or cmd == b'led2 on':
pub_msg = 'LED2: ON-state'
elif cmd == b'led2 OFF' or cmd == b'led2 off':
pub_msg = 'LED2: OFF-state'
else:
pub_msg = 'other msg'
client.publish(topic_sta, pub_msg, retain=True)
def connectMQTT():
client = MQTTClient(client_id, mserver, port, user=mq_user, password=mq_password,keepalive=60)
client.set_callback(sub_callback)
client.DEBUG = True
if not client.connect(clean_session=False):
print("New session being set up")
client.subscribe(topic_ctl)
client.publish(topic_sta, 'ESP32 Device online', retain=True)
print("Connected to %s, subscribed to %s topic" % (mserver, topic_ctl))
return client
def keepLiveTimeCb(client):
print("ping....")
client.ping()
do_connect()
try:
do_connect()
client = connectMQTT()
tim = Timer(-1)
keepLiveTime = 30
tim.init(period=keepLiveTime*1000, mode=Timer.PERIODIC, callback=lambda t: keepLiveTimeCb(client))
while True:
client.wait_msg()
time.sleep(5)
except OSError as e:
reconnect()
finally:
if client is not None:
print('off line')
client.disconnect()