使用WiFiClientSecure库无法连接pulse.eco服务器的求助
解决ESP8266 HTTPS连接pulse.eco失败的问题
问题分析
你的代码存在几个关键问题导致连接失败:
- 变量作用域冲突:全局声明了
WiFiClientSecure client,但setup()里又重新定义了局部的BearSSL::WiFiClientSecure client,局部变量覆盖全局变量后,证书配置无法正确应用到后续连接操作。 - HTTP请求路径错误:请求URL里的
//wifipoint/store包含双斜杠,不符合HTTP规范,可能被服务器拒绝。 - 缺少错误调试信息:未开启SSL连接调试日志,无法定位证书验证或握手失败的具体原因。
修正后的代码
#include <ESP8266WiFi.h> #include <WiFiClientSecure.h> const char* ssid = "MYSSID"; const char* password = "MYPASSWORD"; const char* server = "pulse.eco"; // 服务器域名 const char* test_root_ca = \ "-----BEGIN CERTIFICATE-----\n" \ "MIIFKDCCBBCgAwIBAgISBNkurCx6tIcbJu6Y/vNQnmv5MA0GCSqGSIb3DQEBCwUA\n" \ "MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD\n" \ "EwJSMzAeFw0yMzAxMDIwNTUwMjRaFw0yMzA0MDIwNTUwMjNaMBYxFDASBgNVBAMM\n" \ "CyoucHVsc2UuZWNvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAszaW\n" \ "6wsEFmS4ulk8FO8Og3R1OpK8gWj7vshPQBc7ZL7q2YHNwx7xgg7XqAvo0fC0+q90\n" \ "18DCMBbEKBS4gpsCJgTRxK1sOg0W5vC6yYOnY7kPgzDY6YK2XCCTnAjCR03fkF59\n" \ "kp8PbAewPQuq7krhde9W1AkKXy7HA9qjy33jAhwnRAC8nEnni1oY0eeKvvDFfHK8\n" \ "/LMf6Xj08ZK9gIwaFMCreIBkhR/FWGWkqVpzoq2X7cs1oU5xgnxq+PgBF06x+HIU\n" \ "315E850QgEvxcjs6Uoyy/6XzbToYu8jWdEmwHW7EOt2xTum2kNfW36qaswwmVRTC\n" \ "NO1zc0Pvhu2LJ7uRRwIDAQABo4ICUjCCAk4wDgYDVR0PAQH/BAQDAgWgMB0GA1Ud\n" \ "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQW\n" \ "BBRp7uN7/KWl9WFDVxqmmpCa8JIVgTAfBgNVHSMEGDAWgBQULrMXt1hWy65QCUDm\n" \ "H6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9yMy5v\n" \ "LmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3IzLmkubGVuY3Iub3JnLzAh\n" \ "BgNVHREEGjAYggsqLnB1bHNlLmVjb4IJcHVsc2UuZWNvMEwGA1UdIARFMEMwCAYG\n" \ "Z4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMu\n" \ "bGV0c2VuY3J5cHQub3JnMIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDxAHYAejKMVNi3\n" \ "LbYg6jjgUh7phBZwMhOFTTvSK8E6V6NS61IAAAGFcT7iOQAABAMARzBFAiBceDpE\n" \ "g8Bcs4BAuvizcOSUE2Uo/aflKBq6c/kfS5WqSQIhAOYy9Aqa3VmQnfrLcS9cVMG7\n" \ "cBBAKmljRkJCXUpATC8FAHcArfe++nz/EMiLnT2cHj4YarRnKV3PsQwkyoWGNOvc\n" \ "gooAAAGFcT7iTgAABAMASDBGAiEAipldcrbRW+rpE1qPIrmnASsvU2EI8JbpX51t\n" \ "3HnKzkgCIQCYQyYCpFPgXADTDHSfi27hxa3vvMdo1oCpeJBXOjLIrTANBgkqhkiG\n" \ "9w0BAQsFAAOCAQEAJBIxigpDDpbvd+zcwGeiecn5BJudLQLmNp5F3aI1D84PDePm\n" \ "PB6nbs46kiLTi3ICSn4PiNQitcHU/VeZV+pdDxxET7Aw/djxDJhqRsD1uNiNXxmH\n" \ "uwVt0zDwMBabGfTb9i6kDgWTCdN6WWaXPFLrpirxJYl1fRx7i1d4wQP5/KrIMHmX\n" \ "TlTxIlf3KEzEjDQJKMfVdcVSCjMhxijj7JVsJp1bvYAGyFayjd8EW6hX/0jYxhY+\n" \ "5f0ITQ3P7ywDNgXn2cC++YwHK2aYAbjo6zUImFb0cXjLauzOZ/wpBJpKQ2Nr22NW\n" \ "oM3Hk8CnJ9YW3LfueHiKKp8CInb7Zsm06nvzSg==\n" \ "-----END CERTIFICATE-----\n"; // 使用全局BearSSL客户端对象,避免作用域冲突 BearSSL::WiFiClientSecure client; void setup() { Serial.begin(115200); delay(100); Serial.print("连接WiFi: "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(1000); } Serial.print("已连接到 "); Serial.println(ssid); // 开启SSL调试日志,便于定位问题 client.setDebugLevel(SSL_DEBUG_ALL); // 加载CA证书到信任锚点 std::unique_ptr<BearSSL::X509List> cert(new BearSSL::X509List(test_root_ca)); client.setTrustAnchors(cert.get()); Serial.println("\n开始连接服务器..."); if (!client.connect(server, 443)) { Serial.println("连接失败!"); Serial.print("错误代码: "); Serial.println(client.lastError()); Serial.print("SSL错误代码: "); Serial.println(client.sslLastError()); } else { Serial.println("已连接到服务器!"); // 修正请求路径的双斜杠问题 client.println("GET /wifipoint/store?devAddr=1BZRW373&version=2&pm10=14&pm25=10&noise=12&temperature=25&humidity=46&pressure=990&altitude=192&gasresistance=10820 HTTP/1.0"); client.println("Host: pulse.eco"); client.println("Connection: close"); client.println(); while (client.connected()) { String line = client.readStringUntil('\n'); if (line == "\r") { Serial.println("已接收响应头"); break; } } while (client.available()) { char c = client.read(); Serial.write(c); } client.stop(); } } void loop() { }
关键修改点说明
- 统一客户端对象:将全局的
WiFiClientSecure替换为BearSSL::WiFiClientSecure,移除局部客户端定义,确保证书配置生效。 - 修复请求路径:将
https://pulse.eco//wifipoint/store改为/wifipoint/store,因为client.connect(server,443)已指定服务器,GET请求仅需路径部分。 - 添加调试信息:开启SSL调试日志,同时打印连接错误代码和SSL错误代码,方便定位具体失败原因(如证书验证失败、握手超时等)。
- 优化代码结构:清理冗余定义,确保配置的证书被正确应用到连接流程中。
额外排查步骤
- 确认证书有效性:用浏览器导出pulse.eco的根CA证书,与代码中的证书内容比对。
- 检查网络环境:确保设备能正常访问公网,无防火墙或代理拦截HTTPS流量。
- 验证服务器端口:用电脑的curl或telnet命令测试pulse.eco的443端口是否可访问。
内容的提问来源于stack exchange,提问作者R0b0tn1k
相关产品推荐
相关产品推荐

