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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:07:50