本人是初学quecpython,直接拿MQTT的示例来修改,想实现程序一直侦听MQTT信息,并控制GPIO脚。但是,每次收到信息,MQTT就会重连。
代码如下:
from umqtt import MQTTClient
import utime
import log
import checkNet
import ujson
from machine import Pin
‘’’
下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值
‘’’
PROJECT_NAME = “QuecPython_MQTT_example”
PROJECT_VERSION = “1.0.0”
checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION)
设置日志输出级别
log.basicConfig(level=log.INFO)
mqtt_log = log.getLogger(“MQTT”)
gpio5 = Pin(Pin.GPIO5, Pin.OUT, Pin.PULL_DISABLE, 0) #USIM_DET,引脚13
gpio9 = Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_DISABLE, 0) #SLEEP_IND,引脚3
gpio15 = Pin(Pin.GPIO15, Pin.OUT, Pin.PULL_DISABLE, 0) #I2C2_SCL,引脚141
gpio16 = Pin(Pin.GPIO16, Pin.OUT, Pin.PULL_DISABLE, 0) #I2C2_SDA,引脚142
state = 0
def sub_cb(topic, msg):
global state
mqtt_log.info(“Subscribe Recv: Topic={},Msg={}”.format(topic.decode(), msg.decode()))
state = 1
# 将json转换为Dict
outp = ujson.loads(msg)
mqtt_log.info(outp.items())
for k in outp:
if k == ‘gpio15’:
if outp.get(k) == ‘off’:
gpio15.write(1)
elif outp.get(k) == ‘on’:
gpio15.write(0)
if k == ‘gpio5’:
if outp.get(k) == ‘off’:
gpio5.write(1)
elif outp.get(k) == ‘on’:
gpio5.write(0)
if k == ‘gpio9’:
if outp.get(k) == ‘off’:
gpio9.write(1)
elif outp.get(k) == ‘on’:
gpio9.write(0)
‘’’
if outp.has_key(‘gpio14’):
mqtt_log.info(outp.get(‘gpio14’))
if outp.get(‘gpio14’) == ‘off’:
gpio14.write(0)
elif outp.get(‘gpio14’) == ‘on’:
gpio14.write(1)
‘’’
if name == ‘main’:
stagecode, subcode = checknet.wait_network_connected(30)
if stagecode == 3 and subcode == 1:
mqtt_log.info(‘Network connection successful!’)
# 创建一个mqtt实例
c = MQTTClient("umqtt_client", "emqx.aio.lzgd.tech", 1883)
# 设置消息回调
c.set_callback(sub_cb)
#建立连接
c.connect()
# 订阅主题
c.subscribe(b"/testtopic_4G/ctr", 2)
mqtt_log.info("Connected to emqx.aio.lzgd.tech, subscribed to /testtopic_4G/ctr topic" )
# 发布消息
c.publish(b"/testtopic_4G/sta", b"my name is Quecpython!", 0, 2)
mqtt_log.info("Publish topic: /testtopic_4G/sta, msg: my name is Quecpython")
while True:
c.wait_msg() # 阻塞函数,监听消息
utime.sleep_ms(500)
#if state == 2:
#break
# 关闭连接
c.disconnect()
else:
mqtt_log.info('Network connection failed! stagecode = {}, subcode = {}'.format(stagecode, subcode))