You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:28:13