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); }
额外检查点
- 确认
FIREBASE_HOST格式正确,应为xxx-default-rtdb.firebaseio.com,不要包含https://或末尾的/ - 检查Firebase数据库规则是否确实设置为公开读写,规则内容如下:
{ "rules": { ".read": true, ".write": true } }
- 确保使用的是最新版本的FirebaseESP8266库,旧版本对公开模式的支持可能存在缺陷
内容的提问来源于stack exchange,提问作者Varunkumar
相关产品推荐
相关产品推荐

