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

ESP8266 NodeMCU连接Firebase实时数据库写入失败求助

ESP8266 写入Firebase公开实时数据库失败解决办法

我正在开发一个基于ESP8266的垃圾分类IoT项目,尝试将数据发送至Firebase实时数据库。使用Arduino IDE中的最新FirebaseESP8266库(FirebaseESP8266.h),数据库已配置为公开测试模式,无需认证,仅需写入简单整数值。ESP8266已成功连接Wi-Fi,但写入Firebase的操作始终失败。

硬件配置

  • ESP8266(NodeMCU或通用ESP-12E)
  • Wi-Fi网络(已知SSID,无密码)

Firebase设置

  • 实时数据库:已启用公开访问(测试模式)
  • 公开模式下未使用认证密钥

已尝试的代码

#include <ESP8266WiFi.h>
#include <FirebaseESP8266.h>

const char* ssid = "mySSID";
const char* password = "";

#define FIREBASE_HOST "myURL"

FirebaseData fbData;
FirebaseConfig fbConfig;

void setup() {
  Serial.begin(115200);
  delay(2000);

  WiFi.begin(ssid, password);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("✅ Wi-Fi Connected");

  fbConfig.host = FIREBASE_HOST;
  fbConfig.api_key = "";  // 公开数据库留空

  // 公开数据库传nullptr作为认证参数
  Firebase.begin(&fbConfig, nullptr);
  Firebase.reconnectWiFi(true);
}

void loop() {
  if (Firebase.setInt(fbData, "/testValue", millis()/1000)) {
    Serial.println("✅ Data written");
  } else {
    Serial.println("❌ Failed to write:");
    Serial.println(fbData.errorReason());
  }
  delay(5000);
}

错误现象

串口监视器输出:

✅ Wi-Fi Connected
❌ Failed to write:
token is not ready (revoked or expired)
❌ Failed to write:
token is not ready (revoked or expired

问题原因及解决办法

出现token is not ready错误,是因为即使数据库设为公开可写,FirebaseESP8266库的初始化逻辑仍会触发内部token校验,空API密钥或nullptr认证参数会导致校验失败。以下是两种可行的修改方案:

方案1:明确配置公开模式参数

调整初始化代码,禁用认证相关的token校验:

void setup() {
  Serial.begin(115200);
  delay(2000);

  WiFi.begin(ssid, password);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("✅ Wi-Fi Connected");

  fbConfig.host = FIREBASE_HOST;
  // 公开模式下填任意非空字符串作为API密钥(兼容库的逻辑)
  fbConfig.api_key = "dummy_key"; 
  // 清空所有认证token,禁用认证流程
  fbConfig.signer.tokens.legacy_token = "";
  fbConfig.signer.tokens.access_token = "";
  fbConfig.signer.tokens.id_token = "";

  Firebase.begin(&fbConfig, nullptr);
  Firebase.reconnectWiFi(true);
  // 调整SSL缓冲区大小,避免部分环境下的连接问题
  fbData.setBSSLBufferSize(4096, 1024);
}

方案2:使用简化初始化方式

部分版本的FirebaseESP8266库支持直接通过简化接口初始化公开数据库,替换原有的配置代码:

// 移除FirebaseConfig fbConfig;这一行
void setup() {
  // Wi-Fi连接代码保持不变

  // 直接初始化公开数据库,第二个参数传空字符串
  Firebase.begin(FIREBASE_HOST, "");
  Firebase.reconnectWiFi(true);
}

额外检查点

  1. 确认FIREBASE_HOST格式正确,应为xxx-default-rtdb.firebaseio.com,不要包含https://或末尾的/
  2. 检查Firebase数据库规则是否确实设置为公开读写,规则内容如下:
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
  1. 确保使用的是最新版本的FirebaseESP8266库,旧版本对公开模式的支持可能存在缺陷

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 04:43:09