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

ESP8266无法连接服务器写入MySQL数据库问题求助

排查ESP8266连接服务器失败的问题

我帮你梳理下代码里的几个关键问题,这些都是导致连接失败或者请求无效的核心原因:

1. 初始版本代码的致命错误

  • HTTPS与客户端不匹配:你用了https://开头的服务器地址,但WiFiClient仅支持普通HTTP连接,HTTPS需要使用WiFiClientSecure类,且HTTPS默认端口是443而非8095。
  • 端口配置错误:8095不是HTTP/HTTPS的标准端口,ngrok默认给HTTP分配的是80端口,HTTPS是443,除非你特意配置了自定义端口,否则这里的端口设置完全错误。
  • HTTP请求格式违规:你把请求拆分成了多行,且没有遵循HTTP协议规范——完整的请求行应该是GET /路径?参数 HTTP/1.1,同时必须包含Host请求头,否则服务器无法识别请求的目标站点。

2. 更新后代码的遗留问题

你修正了端口为80、服务器地址改为HTTP,但请求格式仍然存在问题:

  • 你把GET /ethernet/data.php?和movement=xxx分成两个println发送,这会导致HTTP请求被拆分成不完整的两行,服务器无法解析为有效请求。
  • 缺少必要的Host请求头,很多反向代理服务器(比如ngrok)会直接拒绝这种不规范的请求,表现为连接后立即断开,看起来像连接失败。
  • 传感器读取逻辑位置错误:你在连接成功后才读取传感器值,且循环内频繁尝试连接,既浪费资源又可能导致数据发送不及时。

修正后的完整代码

#include "ESP8266WiFi.h"

// 服务器地址仅保留域名部分,不要加http://
const char server[] = "b90e9280.ngrok.io"; 
const char* MY_SSID = "Gastzugang";
const char* MY_PWD = "12345678";
String mov;
WiFiClient client;

// 全局定义传感器引脚,避免重复定义
const int PIR_PIN = 16;

void setup() {
  Serial.begin(115200);
  // 修复字符串拼接错误:*MY_SSID会只取第一个字符,改为直接打印SSID
  Serial.print("Connecting to ");
  Serial.println(MY_SSID);
  
  // 必须设置PIR引脚为输入模式,否则读取值不稳定
  pinMode(PIR_PIN, INPUT);
  WiFi.begin(MY_SSID, MY_PWD);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  
  Serial.println("\nWL connected");
  Serial.println("Credentials accepted! Connected to WiFi");
}

void loop() {
  // 先读取传感器值,再尝试连接发送
  if(digitalRead(PIR_PIN) == HIGH) {
    mov = "1";
    Serial.println("Movement detected: 1");
  } else {
    mov = "0";
    Serial.println("No movement: 0");
  }

  // 连接服务器,端口80对应HTTP协议
  if (client.connect(server, 80)) {
    Serial.println("Connected to server");
    
    // 发送完整合规的HTTP GET请求
    client.print("GET /ethernet/data.php?movement=");
    client.print(mov);
    client.println(" HTTP/1.1");
    // 必须添加Host头,ngrok依赖此识别转发目标
    client.print("Host: ");
    client.println(server);
    // 空行表示请求头部结束,这是HTTP协议要求
    client.println();
    
    // 可选:读取服务器响应,用于调试排查问题
    while(client.available()){
      String line = client.readStringUntil('\n');
      Serial.println(line);
    }
    
    client.stop();
    Serial.println("Request sent, connection closed");
  } else {
    Serial.println("Connection failed");
  }
  
  // 调整延迟时间,避免过于频繁发送请求(比如5秒一次)
  delay(5000);
}

额外注意事项

  • 引脚模式配置:之前的代码未设置PIR引脚为INPUT,这会导致传感器读取值异常,必须添加该配置。
  • ngrok地址变动:免费版ngrok的临时地址每次重启都会变更,如果你重启了ngrok服务,务必同步更新代码中的服务器地址。
  • 请求规范:所有HTTP请求必须包含Host头,尤其是使用反向代理的场景,否则服务器无法正确路由请求。
  • 调试技巧:保留代码中读取服务器响应的逻辑,能帮助你看到服务器返回的错误信息,进一步排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:09:11