CONNECTIONLOST后如何重新连接到MQTT服务器?

物联网 MQTT 树莓派 Python
2021-05-31 15:10:47

我正在使用带有 SIM7600X 4G HAT 的 Raspberry Pi 3B+ 与 Python 通信。我想通过将MQTT命令直接写入SIM7600的串口来连接到MQTT服务器以接收消息(基于手册示例)。

它可以正常工作一段时间,但几个小时后它失去了 MQTT 连接,而且我无法像第一次连接时那样重新连接。

这是我的主循环:


def loop():
    global isMQTTServerReady
    
    while True:
        if isMQTTServerReady:
            if ser.inWaiting():
                EVENT = ser.read(ser.inWaiting()).decode()
               
                if "+CMQTTCONNLOST" in EVENT:
                    connectToMQTT()
                    

                if "+CMQTTRXPAYLOAD" in EVENT:
                    # do something with the MQTT message
        else:
            connectToMQTT()
        time.sleep(5)

这是我的连接功能:

def connectToMQTT():
    openSerialPortIfNotOpen()
    
    ser.write("AT+CRESET")
    time.sleep(5)
    log(ser.read(ser.inWaiting()))
    time.sleep(1)
    
    ser.write('AT+CMQTTSTART\r\n'.encode())
    time.sleep(3)
    log(ser.read(ser.inWaiting()))
    
    
    ser.write('AT+CMQTTDISC=0,60\r\n'.encode())
    time.sleep(2)
    log(ser.read(ser.inWaiting()))
      
    ser.write('AT+CMQTTREL=0\r\n'.encode())
    time.sleep(2)
    log(ser.read(ser.inWaiting()))
    
    ser.write('AT+CMQTTSTOP\r\n'.encode())
    time.sleep(2)
    log(ser.read(ser.inWaiting()))
    startAndSubscribe()
    
def startAndSubscribe():
    global isMQTTServerReady
    isMQTTServerReady=False
    
    ser.write('AT+CMQTTSTART\r\n'.encode())
    time.sleep(3)
    log(ser.read(ser.inWaiting()))
    
    ser.write('AT+CMQTTACCQ=0,'+MQTT_CLIENT_NAME+'\r\n'.encode())
    time.sleep(5)
    log(ser.read(ser.inWaiting()))

    ser.write(MQTT_BROKER_URL+',60,1\r\n'.encode())
    
    while not isMQTTServerReady:
        connStatus = ser.read(ser.inWaiting())
        log (connStatus.decode())
        
        if "+CMQTTCONNECT: 0,0" in connStatus.decode():
            time.sleep(.1)
            log(ser.read(ser.inWaiting()))
            ser.write('AT+CMQTTSUB=0,12,1,0\r\n'.encode())
            time.sleep(2)
            log(ser.read(ser.inWaiting()))
            ser.write(MQTT_TOPIC_NAME.encode())
            time.sleep(3)
            isMQTTServerReady=True
        
        if "+CMQTTCONNLOST:" in connStatus.decode():
            connectToMQTT()   

它工作了一段时间,但 1-2 小时后我进入了这个循环(这是日志文件):

AT+CRESET

AT+CMQTTSTART

ERROR

AT+CMQTTDISC=0,60

+CMQTTDISC: 0,11       #--> 11 means: No connection

ERROR

AT+CMQTTREL=0

+CMQTTREL: 0,19       #--> 19 means: Client is used

ERROR

AT+CMQTTSTOP

+CMQTTSTOP: 21       #--> 21 means: Client not released

ERROR

AT+CMQTTSTART

+CMQTTSTART: 23       #--> 23 means: Network is opened

ERROR

AT+CMQTTACCQ=0,"client_1"

+CMQTTACCQ: 0,19       #--> 19 means: Client is used

ERROR

AT+CMQTTCONNECT=0,"tcp://test.mosquitto.org:1883",60,1

+CMQTTCONNECT: 0,13       #--> 13 means: Not supported operations

ERROR

我陷入了尝试重新连接的无限循环中,但它再也无法重新连接。但是如果我重新启动设备,它又可以正常工作了。

这有什么问题?我想如果我失去连接,我应该:

  • 断开客户端,-释放客户端,-停止 mqtt,-启动 mqtt,-获取客户端,-连接到 mqtt,然后订阅主题,如Sim 7600X 手册中所述
0个回答
没有发现任何回复~