移远官网

MQTT接收到信息后就重连问题

本人是初学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))

已经知道原因,是因为QoS设为2了,改成0就好