我正在使用带有 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 手册中所述