NodeMCU ESP8266通过GET方法向服务器API发送数据失败求助
问题描述
我使用NodeMCU v3 ESP8266搭配RFID RC522读卡器,尝试通过服务器上的insert_status.php接口以GET方法将数据写入数据库,但出现连接失败错误;改用HTTP协议时又触发301重定向错误。相关代码及串口输出如下:
insert_status.php代码
<?php $servername = "localhost"; $username = "test_user"; $password = "test_password"; $dbname = "test_db"; $name = $_GET['name']; $time = $_GET['time']; $rfid = $_GET['rfid']; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO status (name, time, uid) VALUES ('$name', '$time', '$rfid')"; if ($conn->query($sql) === TRUE) { echo "Record inserted successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>
ESP8266代码
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <MFRC522.h> #include <SPI.h> #define SS_PIN D4 #define RST_PIN D3 char ssid[] = "Qwerty"; char pass[] = "12345678"; String serverUrl = "https://website.org/insert_status.php"; MFRC522 mfrc522(SS_PIN, RST_PIN); void setup() { Serial.begin(9600); while (!Serial); Serial.printf("\nConnecting to %s", ssid); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nConnected to network"); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); SPI.begin(); mfrc522.PCD_Init(); } void loop() { if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { String rfid = ""; for (byte i = 0; i < mfrc522.uid.size; i++) { rfid += String(mfrc522.uid.uidByte[i], HEX); } Serial.printf("RFID Code: %s\n", rfid.c_str()); HTTPClient http; String url = serverUrl + "?rfid=" + rfid.c_str() + "&name=TEST" + "&time=TEST_TIME"; http.begin(url); int httpCode = http.GET(); if (httpCode > 0) { Serial.printf("HTTP durum kodu: %d\n", httpCode); if (httpCode == 200) { Serial.println("Success!"); } else { Serial.println("Fail!"); } } else { Serial.printf("Fail. Error:: %s\n", http.errorToString(httpCode).c_str()); } http.end(); delay(5000); } }
串口输出结果
�� Connecting to Qwerty... Connected to network IP Address: 192.168.43.177 RFID Code: 97****** (已隐去部分内容) Fail. Error:: connection failed
解决方案
1. 修复HTTPS连接失败问题
ESP8266的ESP8266HTTPClient默认会验证服务器SSL证书,若未配置证书会直接导致连接失败,可通过两种方式解决:
- 跳过证书验证(快速调试用):在
http.begin(url);前添加以下代码,强制跳过证书校验:http.setInsecure(); - 导入服务器证书(生产环境推荐):从服务器导出PEM格式的根证书,将证书内容作为字符串传入
http.begin(),示例:const char* rootCACert = "-----BEGIN CERTIFICATE-----\n[服务器证书内容]\n-----END CERTIFICATE-----"; http.begin(url, rootCACert);
2. 处理HTTP协议301重定向错误
301错误通常是因为服务器配置了HTTP强制跳转至HTTPS,此时无需改用HTTP,修复上述HTTPS连接问题即可。若必须使用HTTP,可让客户端自动跟随重定向,在http.begin(url);前添加:
http.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS);
3. 额外优化建议
- 避免SQL注入风险:当前PHP代码直接拼接GET参数到SQL语句中,存在严重安全隐患,改用预处理语句:
$sql = "INSERT INTO status (name, time, uid) VALUES (?, ?, ?)"; $stmt = $conn->prepare($sql); $stmt->bind_param("sss", $name, $time, $rfid); $stmt->execute(); - 统一RFID格式:当前生成的RFID字符串为小写十六进制,可转为大写保证格式一致:
rfid += String(mfrc522.uid.uidByte[i], HEX); rfid.toUpperCase(); // 添加此行统一为大写 - 优化时间参数:不要使用固定的
TEST_TIME,可让ESP8266连接NTP服务器获取真实时间,或由服务器端自动生成时间戳,提升数据准确性。
内容的提问来源于stack exchange,提问作者theoyuncu13
相关产品推荐
相关产品推荐

