umqtt通过SSL连接AWS IoT Core时无法识别连接断开的问题排查
AWS IoT Core连接异常:无法识别断开连接与Keepalive失效问题
我正在搭建一款基于MQTT和AWS的IoT设备,当前版本使用umqtt.simple通过SSL连接AWS IoT Core。设备能正常建立连接,但1-2分钟后就停止接收Broker的更新。LED持续闪烁表明client.check_msg()一直在无异常运行,但无法接收更新,且从未主动调用client.disconnect()。
我已将keepalive设置为60秒,同时尝试了umqtt.simple和umqtt.robust(后者本应具备自动重连功能),但在此场景下自动重连未生效,似乎无法识别连接已断开。
最初版本使用用户名密码连接Adafruit IO的MQTT Broker,连接时长从不超过几分钟,但通过简单的while/try/except就能实现可靠重连,设备可连续运行数日。
请问为何无法识别连接断开?设置keepalive=60为何不起作用?
原main.py代码如下:
import device, lib.keys as keys, machine, network, ntptime, lib.robust as robust, ssl, time, ubinascii MQTT_CLIENT_ID = ubinascii.hexlify(machine.unique_id()) led = machine.Pin("LED", machine.Pin.OUT) def read_pem(file): with open(file, "r") as input: text = input.read().strip() split_text = text.split("\n") base64_text = "".join(split_text[1:-1]) return ubinascii.a2b_base64(base64_text) def led_pulse(n): half_pulse = 0.1 for i in range(0,n): led.on() time.sleep(half_pulse) led.off() time.sleep(half_pulse) time.sleep(0.5) def internet_connect(): print("Connecting to WiFi ...") wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(keys.WIFI_SSID, keys.WIFI_PASSWORD) while not wlan.isconnected(): led_pulse(2) print("Connected to WiFi\n") def mqtt_callback(topic, msg): topic_str = topic.decode() msg_str = msg.decode() print(f"RX: {topic_str}\t{msg_str}") for command in device.commands: if msg_str == command[0]: led.on() command[1]() def mqtt_setup(): key = read_pem(keys.MQTT_CLIENT_KEY) cert = read_pem(keys.MQTT_CLIENT_CERT) ca = read_pem(keys.MQTT_BROKER_CA) mqtt_client = robust.MQTTClient( client_id = MQTT_CLIENT_ID, server = keys.MQTT_BROKER, keepalive = 60, ssl = True, ssl_params = { "key": key, "cert": cert, "server_hostname": keys.MQTT_BROKER, "cert_reqs": ssl.CERT_REQUIRED, "cadata": ca, }, ) mqtt_client.set_callback(mqtt_callback) return mqtt_client def mqtt_connect(client): print("Connecting to MQTT Broker ...") led_pulse(3) client.connect() led_pulse(4) client.subscribe(keys.MQTT_TOPIC) print("Connected to MQTT Broker\n") def mqtt_listen(client): print(f"Listening to {keys.MQTT_TOPIC} ...") while True: client.check_msg() led_pulse(1) def mqtt_disconnect(client): print("Disconnecting from MQTT Broker ...") client.disconnect() print("Disconnected from MQTT Broker\n") while True: internet_connect() ntptime.settime() mqtt_client = mqtt_setup() try: mqtt_connect(mqtt_client) mqtt_listen(mqtt_client) except: mqtt_disconnect(mqtt_client)
更新内容
我修改了main.py,手动每分钟断开并重连,此方法可行,但每分钟会有5秒处于断开状态。之后我修改为每几秒发布一条消息,截至目前设备已保持连接并正常运行30分钟。
修改后的代码片段:
wlan = network.WLAN(network.STA_IF) while True: internet_connect(wlan) ntptime.settime() mqtt_client = mqtt_setup() mqtt_connect(mqtt_client) while wlan.isconnected(): for i in range(0, 20): mqtt_client.check_msg() led_pulse(1) mqtt_client.publish(keys.MQTT_TOPIC, "poke")
内容的提问来源于stack exchange,提问作者Llado
相关产品推荐
相关产品推荐

