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

ESP32使用Arduino HTTPClient访问SSL API时出现内存分配失败等随机错误

解决ESP32使用HTTPClient+WifiClientSecure访问SSL Web API的间歇性问题

在使用ESP32通过Arduino的HTTPClient和WifiClientSecure访问SSL加密的Web API时,我遇到了以下间歇性问题:

  • 弹出esp-sha: Failed to allocate buf memory内存分配错误
  • 随机出现connection refused(连接被拒绝)
  • 随机出现DNS failure(DNS解析失败)

经过数周反复试错,我整理出了可行的解决方案,以下是关键代码示例及配置说明:

// 定义超时常量,可根据实际网络环境调整
#define CLIENT_HANDSHAKE_TIMEOUT 15000
#define HTTP_TIMEOUT 10000

// 初始化SSL客户端
WiFiClientSecure apiClient;
// 配置CA证书(若无需验证可改用setInsecure())
apiClient.setCACert(apiRootCACertificate);
// 设置SSL握手超时,避免长时间阻塞
apiClient.setHandshakeTimeout(CLIENT_HANDSHAKE_TIMEOUT);

// 初始化HTTP客户端
HTTPClient http;
// 设置HTTP请求超时
http.setTimeout(HTTP_TIMEOUT);
// 设置连接超时
http.setConnectTimeout(HTTP_TIMEOUT);
// 强制使用HTTP/1.0,减少内存占用
http.useHTTP10(true);
// 禁用连接复用,避免内存泄漏
http.setReuse(false);
// 严格遵循重定向规则
http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);

// API配置
const char* host = "www.someapi.com";
const int port = 443;
const char* apiUri = "/functionname";
const bool useSSL = true;

// 启动HTTP请求
http.begin(apiClient, host, port, apiUri, useSSL);

int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK)
{
    // 解析返回的JSON数据,按需调整DynamicJsonDocument大小
    DynamicJsonDocument jsonDoc(8000);
    DeserializationError e = deserializeJson(jsonDoc, http.getStream());
    // 后续处理逻辑...
}

// 务必释放HTTP客户端资源
http.end();
// 关闭SSL客户端连接
apiClient.stop();

关键配置说明:

  1. setReuse(false):禁用连接复用,避免因长期持有连接导致的内存泄漏,这是解决内存分配错误的核心配置之一。
  2. useHTTP10(true):HTTP/1.1的持久连接会占用更多内存,改用HTTP/1.0可降低内存消耗。
  3. 超时设置:合理设置握手、连接及请求超时,避免因网络阻塞导致的资源占用。
  4. 资源释放:请求结束后必须调用http.end()和apiClient.stop(),确保所有网络资源被正确释放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:12:51