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

使用Python的paho-mqtt向MQTT Broker发布数据时遇ECONNRESET错误

ECONNRESET错误排查与修复方案(MQTT + test.mosquitto.org)

针对你遇到的ECONNRESET错误,结合代码和test.mosquitto.org的特性,核心排查方向和修复方案如下:

问题根源分析

  1. Keepalive设置过长:当前keepalive=3600(1小时)远超公共Broker的常规阈值,服务器会因长时间未收到客户端心跳判定连接失效,主动断开导致ECONNRESET。
  2. 客户端ID冲突:固定的client_id='idc'若被其他设备重复使用,Broker会踢掉旧连接触发连接重置。
  3. 缺乏发布失败重连逻辑:原代码仅在初始化时处理连接失败,循环发布过程中连接断开后无法自动恢复。
  4. 未监控WiFi状态:WiFi断连后仍尝试发布消息,会直接引发连接错误。

修复步骤

1. 调整Keepalive参数

将keepalive改为60秒(test.mosquitto.org推荐的合理范围),确保服务器能及时识别客户端在线状态。

2. 生成唯一客户端ID

利用设备硬件唯一ID生成client_id,避免多设备冲突:

client_id = 'idc-' + ubinascii.hexlify(machine.unique_id()).decode()

3. 增加发布错误捕获与重连逻辑

在循环发布时捕获OSError,优先尝试重新连接MQTT,而非直接重启设备。

4. 定期检查WiFi连接

在循环中添加WiFi状态检查,确保网络正常后再发布消息。

修改后的完整代码

import network
import time
import dataCollectOnly as data
import machine
import ubinascii
from umqtt.simple import MQTTClient

conversion_factor = 3.3 / (65535) 
sensor_temp = machine.ADC(machine.ADC.CORE_TEMP)

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('Jordi', '65352170T')

max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    time.sleep(1)

if wlan.status() != 3:
    raise RuntimeError('network connection failed')
else:
    print('connected')
    status = wlan.ifconfig()
    print( 'ip = ' + status[0] )
        
mqtt_server = 'test.mosquitto.org'
# 生成唯一客户端ID
client_id = 'idc-' + ubinascii.hexlify(machine.unique_id()).decode()
topic_pub = 'project/room/stats/temp'

def mqtt_connect():
    # 调整keepalive为60秒
    client = MQTTClient(client_id, mqtt_server, keepalive=60)
    client.connect()
    print('Connected to %s MQTT Broker'%(mqtt_server))
    return client

def reconnect():
    print('MQTT connection lost. Reconnecting...')
    time.sleep(2)
    # 优先尝试重新连接MQTT,而非直接重启设备
    try:
        global client
        client = mqtt_connect()
    except OSError as e:
        print('Reconnect failed, retrying...')
        reconnect()
        
try:
    client = mqtt_connect()
except OSError as e:
    reconnect()

while True:
    # 检查WiFi连接状态
    if wlan.status() != 3:
        print('WiFi disconnected, reconnecting...')
        wlan.connect('Jordi', '65352170T')
        time.sleep(5)
        continue
    
    try:
        client.publish(topic_pub, data.stats())
        print('Message published successfully')
    except OSError as e:
        print(f'Publish failed: {e}')
        reconnect()
    
    time.sleep(5)

额外注意事项

  • test.mosquitto.org是公共测试服务器,5秒/次的消息频率远低于其限制阈值,因此频率不是主要问题。
  • 若仍出现异常,可尝试更换端口:默认1883端口,也可使用8080(WebSocket)或8883(SSL)端口。

内容的提问来源于stack exchange,提问作者JMartí

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:15:16