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

如何让ESP32通过主机名连接Windows11上的Mosquitto MQTT代理?

ESP32通过主机名连接Windows 11 Mosquitto MQTT代理失败的解决办法

你遇到的问题是ESP32能用IP正常连接Windows主机上的Mosquitto,但用主机名home或home.local时出现Error transport connect,本质是主机名解析失败,以下是针对性的解决步骤:

1. 先排查局域网内的主机名解析可用性

先在其他局域网设备(比如手机、另一台电脑)上执行:

ping home
ping home.local

如果这两个命令都无法解析到192.168.0.5,说明问题不在ESP32,而是Windows主机或局域网DNS的配置问题:

  • 开启Windows的网络发现:设置→网络和Internet→高级网络设置→高级共享设置,勾选“启用网络发现”。
  • 确保TCP/IP NetBIOS Helper服务运行:Win+R输入services.msc,找到该服务,设置为“自动”并启动。
  • 若用home.local,需确保Windows开启mDNS服务:安装Bonjour(或通过iTunes附带安装),并启动Bonjour Service。

2. 配置ESP32的DNS解析

ESP32默认使用路由器的DNS,但可能路由器无法解析局域网主机名,可手动指定DNS服务器为Windows主机IP或路由器IP:

方法1:WiFi初始化时指定DNS

wifi_config_t wifi_config = {
    .sta = {
        .ssid = "你的WiFi名称",
        .password = "WiFi密码",
        // 配置DNS服务器为Windows主机IP 192.168.0.5
        .dns = {
            .ip_addr[0] = {.addr = htonl(0xc0a80005)}, // 192.168.0.5的网络字节序
            .ip_addr[1] = {.addr = htonl(0x00000000)},
        },
    },
};

方法2:WiFi连接后手动设置DNS

#include "esp_netif.h"

// WiFi连接成功后调用
void set_custom_dns() {
    esp_netif_t *sta_netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");
    esp_netif_dns_info_t dns_info;
    dns_info.ip.u_addr.ip4.addr = htonl(0xc0a80005); // Windows主机IP
    dns_info.ip.type = IPADDR_TYPE_V4;
    esp_netif_set_dns(sta_netif, ESP_NETIF_DNS_MAIN, &dns_info);
}

3. 启用ESP32的mDNS支持(针对home.local)

若要使用home.local,需开启ESP32的mDNS功能:

  1. 在menuconfig中开启:Component config → mDNS → 勾选Enable mDNS
  2. 在代码中初始化mDNS:
#include "mdns.h"

void app_main() {
    // ... 先完成WiFi初始化 ...
    esp_err_t err = mdns_init();
    if (err != ESP_OK) {
        printf("mDNS初始化失败: %d\n", err);
        return;
    }
    mdns_hostname_set("esp32-mqtt-client"); // 设置ESP32自身的mDNS主机名(可选)
}

4. 手动添加主机名映射(终极方案)

如果以上方法都无效,可以在ESP32中手动绑定主机名和IP:

  1. 在menuconfig中开启:Component config → LWIP → IP options → 勾选Enable custom hosts file
  2. 在项目根目录创建lwip_hosts文件,内容:
192.168.0.5 home
192.168.0.5 home.local
  1. 在项目的CMakeLists.txt中添加:
target_add_binary_data(${PROJECT_NAME}.elf "lwip_hosts" TEXT)

验证与调试

修改配置后重新编译烧录ESP32,若仍报错,可开启LWIP的DNS调试日志:
在menuconfig中进入Component config → LWIP → Debugging → 勾选Enable debug output for DNS,查看日志中是否有DNS解析失败的信息,进一步定位问题。

参考你的完整MQTT配置

修改后的配置只需保持主机名格式正确即可,比如:

esp_mqtt_client_config_t mqtt_cfg = {
    // .uri = "mqtt://192.168.0.5:1883",
    .uri = "mqtt://home:1883", // 或 mqtt://home.local:1883
    .event_handle = mqtt_event_handler,
    .client_id = (const char *)SN,
    .lwt_topic = "/device/send-data/mqtt-will",
    .lwt_msg = (const char *)local_data,
    .lwt_msg_len = 50,
    .task_stack = 4096,
    .buffer_size = 2000,
    .lwt_qos = 0,
    .keepalive = 30,
    .lwt_retain = 0,
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:40:34