ESP32 Mesh网络下esp_http_client发起HTTPS请求失败求助
解决Mesh环境下esp_http_client无法发起HTTPS请求的问题
问题本质
日志里的getaddrinfo() returns 202对应ESP-IDF的ESP_ERR_DNS_FAILURE,核心是根节点的DNS解析失败。虽然根节点已连接外部WiFi,但Mesh模式下系统网络栈的路由或DNS配置未正确继承STA接口的设置,导致无法解析服务器域名。
解决步骤
1. 手动指定DNS服务器
Mesh模式下默认DNS配置可能异常,直接硬指定公共DNS服务器:
esp_netif_dns_info_t dns_info; memset(&dns_info, 0, sizeof(dns_info)); dns_info.ip.u_addr.ip4.addr = ipaddr_addr("8.8.8.8"); // 也可使用114.114.114.114 dns_info.ip.type = IPADDR_TYPE_V4; // 为根节点的STA网口设置主DNS esp_netif_set_dns(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"), ESP_NETIF_DNS_MAIN, &dns_info);
2. 调整网络路由优先级
根节点同时维护Mesh和STA连接,需让STA接口的路由优先级高于Mesh,避免请求误走Mesh内部链路:
// 获取STA和Mesh的网口句柄 esp_netif_t *sta_netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); esp_netif_t *mesh_netif = esp_netif_get_handle_from_ifkey("MESH_NETIF_DEF"); // 数值越小优先级越高,将STA设为高优先级 esp_netif_set_netif_impl_arg(sta_netif, ESP_NETIF_ARG_ROUTE_PRIORITY, (void *)1); esp_netif_set_netif_impl_arg(mesh_netif, ESP_NETIF_ARG_ROUTE_PRIORITY, (void *)10);
3. 给esp_http_client绑定STA接口
创建HTTP客户端配置时,明确指定使用STA接口发起请求,排除Mesh接口干扰:
esp_http_client_config_t config = { .url = "你的HTTPS固件下载地址", .transport_type = HTTP_TRANSPORT_OVER_SSL, .netif_ctx = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"), // 绑定STA网口 // 补充HTTPS证书配置,如.cert_pem字段(若服务器证书未被ESP根证书信任) }; esp_http_client_handle_t client = esp_http_client_init(&config);
4. 先验证根节点的网络状态
发起请求前,确认根节点已成功连接WiFi并获取到有效IP:
wifi_ap_record_t ap_info; if (esp_wifi_sta_get_ap_info(&ap_info) == ESP_OK) { esp_netif_ip_info_t ip_info; if (esp_netif_get_ip_info(esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"), &ip_info) == ESP_OK) { // 确认网络正常后再发起请求 } }
5. 禁用Mesh的DNS转发功能
若之前开启了Mesh的DNS转发,可能与STA的DNS解析冲突,直接关闭:
esp_mesh_config_t mesh_config = { .dns_forward = false, // 禁用DNS转发 // 其他原有Mesh配置参数 }; esp_mesh_init(&mesh_config);
验证方法
修改配置后重新烧录固件,观察日志是否仍有DNS解析错误。若解析成功,esp_http_client应能正常建立HTTPS连接并返回200状态码。
内容的提问来源于stack exchange,提问作者user119374753
相关产品推荐
相关产品推荐

