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

ESP32以太网访问HTTPS失败求助:返回状态码-2及替代库咨询

问题解决:以太网HTTPS请求返回状态码-2及库推荐

一、状态码-2的修复方案

状态码-2通常对应SSL握手失败或服务器连接/解析错误,你的代码存在几处关键问题,修正如下:

1. 修正服务器地址定义

原代码中服务器地址的类型和格式错误:

  • 单个char无法存储完整域名,需改为const char*
  • 不需要携带https://前缀,库会自动处理SSL协议

修正代码:

const char* server = "jsonplaceholder.typicode.com";

2. 清理冗余端口定义

你同时定义了SSL_PORT 443和port 8080,但HTTPS默认端口为443,直接删除多余的int port = 8080;即可。

3. 添加连接状态检查

发起请求前必须确认服务器连接成功,避免无效请求:

if (!httpClient.connect()) {
  Serial.println("Failed to connect to server");
  delay(5000);
  return;
}

4. 请求后释放连接

每次请求结束调用httpClient.stop()关闭连接,避免资源占用导致后续请求失败。

修正后的完整代码

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetHttpClient_SSL.h>

const char* server = "jsonplaceholder.typicode.com";
#define SSL_PORT 443

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
EthernetClient client;
EthernetHttpClient httpClient(client, server, SSL_PORT);

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    ; 
  }
  Ethernet.init(5);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    for (;;)
      ;
  }
  Serial.print("IP address: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  Serial.println("\nmaking GET request");
  
  if (!httpClient.connect()) {
    Serial.println("Failed to connect to server");
    delay(5000);
    return;
  }

  httpClient.get("/posts/1");

  int statusCode = httpClient.responseStatusCode();
  String response = httpClient.responseBody();

  Serial.print("Status code: ");
  Serial.println(statusCode);
  Serial.print("Response: ");
  Serial.println(response);
  
  httpClient.stop(); // 关闭连接释放资源
  Serial.println("Wait five seconds");
  delay(5000);
}

二、简单易用的以太网HTTPS库推荐

1. EthernetWebServer_SSL

你当前使用的库的扩展版本,封装完善,支持HTTPS请求、以太网Web服务器功能,示例文档齐全,适配多数以太网模块。

2. BearSSL + EthernetClient

适合需要底层控制的场景,利用Arduino核心自带的BearSSL库实现SSL加密,手动构造HTTP请求,灵活性高:

#include <SPI.h>
#include <Ethernet.h>
#include <BearSSLClient.h>

BearSSLClient sslClient;
EthernetClient ethClient;
const char* server = "jsonplaceholder.typicode.com";

void loop() {
  sslClient.setClient(ethClient);
  if (!sslClient.connect(server, 443)) {
    Serial.println("Connection failed");
    return;
  }
  // 发送GET请求
  sslClient.println("GET /posts/1 HTTP/1.1");
  sslClient.print("Host: ");
  sslClient.println(server);
  sslClient.println("Connection: close");
  sslClient.println();

  // 读取响应
  while (sslClient.connected()) {
    String line = sslClient.readStringUntil('\n');
    if (line == "\r") break;
  }
  String response = sslClient.readString();
  Serial.println(response);
  sslClient.stop();
  delay(5000);
}

3. ArduinoHttpClient

官方维护的轻量HTTP客户端库,支持以太网/WiFi,配合BearSSLClient可快速实现HTTPS请求,API简洁,学习成本低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:01:19