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

