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

