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

Wemos D1 R1向Firebase实时数据库传数据返回400响应码原因排查

Wemos D1 R1向Firebase实时数据库传输数据时出现HTTP 400错误排查

问题描述

我在使用Wemos D1 R1开发板向Firebase实时数据库传输温湿度数据时,串口监视器返回了HTTP 400响应码。以下是我的代码及串口输出信息,请求协助排查问题原因:

代码实现

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <DFRobot_DHT11.h>

const char* ssid = "WCS_LAB 2.4G";
const char* password = "secret";
const char* firebaseProject = "arduino-secret-secret-default-rtdb";
const char* databasePath = "/"; 

int ledPin = D3; // Connect LED to this pin

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");

DFRobot_DHT11 DHT;
#define DHT11_PIN D2

// sendDataToFirebase function definition
void sendDataToFirebase(float temperature, float humidity) {
  // Rest of the Firebase transmission code...
  Serial.println("Firebase transmission started");
  timeClient.update();
  String kstTimestamp = convertToKST(timeClient.getEpochTime());
  String data = "{ \"temperature\": " + String(temperature, 2) + ", \"humidity\": " + String(humidity, 2) +
                 ", \"timestamp_kst\": \"" + kstTimestamp + "\" }";

  Serial.println("Data: " + data);

  WiFiClient client;
  HTTPClient http;

  String firebaseURL = "https://" + String(firebaseProject) + ".firebaseio.com" + databasePath;
  http.begin(client, firebaseURL);

  http.addHeader("Content-Type", "application/json");

  // Debug information
  Serial.println("HTTP request started");
  Serial.println("URL: " + firebaseURL);
  Serial.println("Data: " + data);

  int httpResponseCode = http.POST(data);

  if (httpResponseCode > 0) {
    Serial.print("Data sent to Firebase successfully, response code: ");
    Serial.println(httpResponseCode);
  } else {
    Serial.print("Failed to send data to Firebase, response code: ");
    Serial.println(httpResponseCode);

    String response = http.getString();
    Serial.println("Server response: " + response);

    Serial.print("Error: ");
    Serial.println(http.errorToString(httpResponseCode).c_str());
  }

  Serial.println("HTTP request ended");
  http.end();
}

// convertToKST function definition
String convertToKST(time_t utcTime) {
  struct tm *timeinfo;
  timeinfo = gmtime(&utcTime);

  // Convert to KST by adding 9 hours to UTC
  timeinfo->tm_hour += 9;

  char kstBuffer[50];
  strftime(kstBuffer, sizeof(kstBuffer), "%Y-%m-%d %H:%M:%S", timeinfo);

  return String(kstBuffer);
}

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  WiFi.begin(ssid, password);
  
  Serial.println("Setup started");

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  Serial.println("WiFi connected");
  timeClient.begin();

  while (!timeClient.update()) {
    timeClient.forceUpdate();
  }

  Serial.println("Time synchronization completed");
}

void loop() {
  Serial.println("Loop started");
  DHT.read(DHT11_PIN);
  float temperature = DHT.temperature;
  float humidity = DHT.humidity;

  Serial.println("Temperature: " + String(temperature, 2) + ", Humidity: " + String(humidity, 2));

  if (!isnan(temperature) && !isnan(humidity)) {
    Serial.println("Attempting to send data to Firebase");
    sendDataToFirebase(temperature, humidity);
  }

  delay(5000); // Execute every 5 seconds
}

串口监视器输出

10:05:18.777 -> HTTP请求已启动
10:05:18.777 -> URL: secret
10:05:18.841 -> 数据: { "temperature": 19.00, "humidity": 20.00, "timestamp_kst": "2023-12-04 10:05:17" }
10:05:19.085 -> 数据已成功发送至Firebase,响应码: 400
10:05:19.126 -> HTTP请求结束

问题排查与解决

1. 核心URL错误

从串口输出可见,请求URL显示为secret,说明两个关键问题:

  • firebaseProject变量的值被错误替换为占位符,需改为Firebase控制台中获取的实际项目ID(格式类似your-project-id-default-rtdb)。
  • Firebase实时数据库REST API要求URL末尾必须添加.json后缀,否则会返回HTTP 400错误。修改URL拼接代码:
    String firebaseURL = "https://" + String(firebaseProject) + ".firebaseio.com" + databasePath + ".json";
    

2. 数据库权限设置

默认情况下,Firebase实时数据库的规则仅允许认证用户读写,未认证请求会被拒绝。测试阶段可临时修改规则为公开读写(上线后务必改回安全规则):

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

3. 其他检查项

  • 确认WiFi连接正常,开发板能访问公网。
  • 验证JSON数据格式:串口输出的JSON结构正确,可通过在线工具确认格式合法性。
  • 避免直接写入数据库根路径,建议设置具体子路径(如"/sensorData"),便于数据管理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:29:53