ESP-IDF MQTT TCP示例报错(0x8006&0x8004)及后续问题求助
问题排查:ESP-IDF MQTT TCP示例连接失败
场景1:连接家用WiFi时的错误
操作步骤:
- 使用ESP-IDF的
protocal/mqtt/tcp示例 - 通过
idf.py menuconfig修改MQTT用户名和密码 - 执行
esptool.py --port /dev/ttyUSB0 erase_flash擦除闪存后,编译烧录至ESP32 - 监控时出现以下错误日志:
I (4609) esp_netif_handlers: example_netif_sta ip: 192.168.69.134, mask: 255.255.255.0, gw: 192.168.69.50 I (4609) example_connect: Got IPv4 event: Interface "example_netif_sta" address: 192.168.69.134 I (5609) example_connect: Got IPv6 event: Interface "example_netif_sta" address: fe80:0000:0000:0000:7ae3:6dff:fe18:eeb8, type: ESP_IP6_ADDR_IS_LINK_LOCAL I (5609) example_common: Connected to example_netif_sta I (5619) example_common: - IPv4 address: 192.168.69.134, I (5619) example_common: - IPv6 address: fe80:0000:0000:0000:7ae3:6dff:fe18:eeb8, type: ESP_IP6_ADDR_IS_LINK_LOCAL I (5639) MQTT_EXAMPLE: Other event id:7 E (14809) esp-tls: [sock=54] delayed connect error: Connection reset by peer E (14809) transport_base: Failed to open a new connection: 32772 E (14819) mqtt_client: Error transport connect I (14819) MQTT_EXAMPLE: MQTT_EVENT_ERROR E (14829) MQTT_EXAMPLE: Last error reported from esp-tls: 0x8004 E (14829) MQTT_EXAMPLE: Last error captured as transport's socket errno: 0x68 I (14839) MQTT_EXAMPLE: Last errno string (Connection reset by peer) I (14849) MQTT_EXAMPLE: MQTT_EVENT_DISCONNECTED E (83319) esp-tls: [sock=54] select() timeout E (83319) transport_base: Failed to open a new connection: 32774 E (83319) mqtt_client: Error transport connect I (83319) MQTT_EXAMPLE: MQTT_EVENT_ERROR E (83329) MQTT_EXAMPLE: Last error reported from esp-tls: 0x8006
注:使用ESP-IDF的wifi/getting_started示例执行相同WiFi配置操作时完全正常,说明WiFi连接本身无问题。
对应的错误码及解释:
ESP_ERR_ESP_TLS_FAILED_CONNECT_TO_HOST (0x8004): Failed to connect to host ESP_ERR_ESP_TLS_CONNECTION_TIMEOUT (0x8006): new connection in esp_tls_low_level_conn connection timeouted
场景2:连接ESP32软AP时的错误
操作步骤:将一台ESP32配置为软AP(使用wifi/getting_started/softAP示例),另一台ESP32运行同一MQTT TCP示例时,出现以下错误日志:
E (562605) esp-tls: couldn't get hostname for :mqtt.eclipseprojects.io: getaddrinfo() returns 202, addrinfo=0x0 E (562605) transport_base: Failed to open a new connection: 32769 E (562605) mqtt_client: Error transport connect I (562615) MQTT_EXAMPLE: MQTT_EVENT_ERROR E (562615) MQTT_EXAMPLE: Last error reported from esp-tls: 0x8001 I (562625) MQTT_EXAMPLE: Last errno string (Success) I (562625) MQTT_EXAMPLE: MQTT_EVENT_DISCONNECTED I (572635) MQTT_EXAMPLE: Other event id:7
排查建议
针对场景1的排查点
- 确认
menuconfig中配置的MQTT Broker地址、端口是否正确,用电脑ping默认的mqtt.eclipseprojects.io,测试当前网络能否访问该服务器 - 检查家用路由器/防火墙是否拦截了MQTT默认端口(1883),可尝试临时关闭防火墙或在路由器后台开放对应端口
- 验证MQTT用户名、密码的正确性,确认该账号有权限连接目标Broker
- 更换公共MQTT Broker测试,比如
test.mosquitto.org,排除目标服务器自身问题
针对场景2的排查点
- ESP32软AP默认未连接外网,无法解析公共MQTT Broker的域名,这是预期现象。若要在该环境测试MQTT,需:
- 在作为软AP的ESP32上搭建本地MQTT Broker
- 配置软AP的ESP32同时开启STA模式连接外网,让软AP下的设备能访问公网
- 检查软AP的DHCP配置,确保运行MQTT的ESP32获取到了有效的DNS服务器地址(可在监控日志中查看DNS配置信息)
内容的提问来源于stack exchange,提问作者Ohm
相关产品推荐
相关产品推荐

