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
相关产品推荐
相关产品推荐

