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

使用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() {
}

关键修改点说明

  1. 统一客户端对象:将全局的WiFiClientSecure替换为BearSSL::WiFiClientSecure,移除局部客户端定义,确保证书配置生效。
  2. 修复请求路径:将https://pulse.eco//wifipoint/store改为/wifipoint/store,因为client.connect(server,443)已指定服务器,GET请求仅需路径部分。
  3. 添加调试信息:开启SSL调试日志,同时打印连接错误代码和SSL错误代码,方便定位具体失败原因(如证书验证失败、握手超时等)。
  4. 优化代码结构:清理冗余定义,确保配置的证书被正确应用到连接流程中。

额外排查步骤

  • 确认证书有效性:用浏览器导出pulse.eco的根CA证书,与代码中的证书内容比对。
  • 检查网络环境:确保设备能正常访问公网,无防火墙或代理拦截HTTPS流量。
  • 验证服务器端口:用电脑的curl或telnet命令测试pulse.eco的443端口是否可访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:19:55