?W-T? 2023-04-14 18:42 采纳率: 100%
浏览 295
已结题

报错 OSError: [Errno 104] ECONNRESET

使用esp32连接mqtt服务器,注册home assistant传感器报错 OSError: [Errno 104] ECONNRESET

img

img

img

  • 写回答

2条回答 默认 最新

  • 语言-逆行者 2023-04-14 21:25
    关注

    基于new Bing的修改:
    根据代码和错误信息,似乎连接到 MQTT 服务器时出现了连接重置的错误(ECONNRESET)。这可能是由于网络连接中断或服务器端出现问题导致的。以下是一些修改代码的建议:

    • 检查网络连接是否可靠,确保 ESP32 正确连接到 Wi-Fi 网络。可以在连接之前打印网络配置信息,并检查是否有任何问题。
    • 确保 MQTT 服务器正常工作,并且主题名称和内容正确。可以使用其他 MQTT 客户端(例如 MQTT.fx)测试连接和发布/订阅操作。
    • 考虑使用带有重试逻辑的错误处理来处理连接错误。例如,在连接时使用 while 循环,直到连接成功或达到最大重试次数。

    以下是修改后的示例代码:

    import time
    import network
    import ujson
    from umqttsimple import MQTTClient
    
    # Home Assistant 设备配置信息
    device_name = "ESP32-04"
    sensor_name = "1"
    sensor_type = "Temp"
    config_topic = "homeassistant/sensor/HA/HA-%s-%s/config" % (device_name, sensor_name)
    config_content = {
        "unique_id": "HA-%s-%s" % (device_name, sensor_name),
        "name": sensor_type,
        "icon": "mdi:thermometer",
        "state_topic": "HA-%s/%s/state" % (device_name, sensor_name),
        "json_attributes_topic": "HA-%s/%s/attributes" % (device_name, sensor_name),
        "device": {
            "identifiers": device_name,
            "manufacturer": "WT有限公司",
            "model": "HA",
            "name": device_name,
            "sw_version": "1.0",
        },
    }
    state_topic = "HA-%s/%s/state" % (device_name, sensor_name)
    
    def do_connect():
        wlan = network.WLAN(network.STA_IF)
        wlan.active(True)
        if not wlan.isconnected():
            print('connecting to network...')
            wlan.connect('WT2', '12345678')
            i = 1
            while not wlan.isconnected() and i <= 10:
                print("正在连接...(第%d次)" % i)
                i += 1
                time.sleep(1)
            if wlan.isconnected():
                print('network config:', wlan.ifconfig())
            else:
                print("连接失败")
    
    def sub_cb(topic, msg):
        print(topic, msg)
    
    def main():
        do_connect()
        c = MQTTClient(device_name, "mqtt_server")
        c.set_callback(sub_cb)
        c.connect()
        c.subscribe(b"my-esp32")
        time.sleep(1)
        send_content = ujson.dumps(config_content)
        c.publish(config_topic.encode(), send_content.encode())
        for i in range(100):
            time.sleep(0.5)
            c.publish(state_topic.encode(), str(i).encode())
            print("esp32...%d" % i)
        c.disconnect()
    
    if __name__ == "__main__":
        main()
    
    
    

    此代码将尝试连接名为 mqtt_server 的 MQTT 服务器,并在连接成功后订阅 my-esp32 主题。然后,它将发布传感器的配置信息和状态信息。如果连接失败,则在尝试最多 10 次

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 已采纳回答 4月15日
  • 赞助了问题酬金15元 4月14日
  • 创建了问题 4月14日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加