如何将Firebase推送数据同步到Arduino并适配动态新增设备
解决方案
你需要把硬编码读取固定设备ID的逻辑,改为遍历JSON根节点的所有键值对即可适配动态新增的设备场景,修改后的代码如下:
// String input; // 若后续设备数量增加,可适当调大文档容量,或改用DynamicJsonDocument StaticJsonDocument<1024> doc; DeserializationError error = deserializeJson(doc, input); if (error) { Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); return; } // 遍历所有设备节点 for (JsonPair deviceItem : doc.as<JsonObject>()) { // 获取设备唯一ID(即Firebase自动生成的push ID) const char* deviceId = deviceItem.key().c_str(); // 获取当前设备的详情对象 JsonObject deviceInfo = deviceItem.value().as<JsonObject>(); // 读取设备属性 const char* devicePlace = deviceInfo["Place"]; const char* deviceState = deviceInfo["State"]; const char* deviceTitle = deviceInfo["Title"]; // 此处替换为你自己的业务逻辑,例如存储到本地数组、打印日志、控制硬件等 Serial.printf("设备ID:%s\r\n", deviceId); Serial.printf("设备名称:%s\r\n", deviceTitle); Serial.printf("安装位置:%s\r\n", devicePlace); Serial.printf("运行状态:%s\r\n", deviceState); Serial.println("------------------------"); }
补充说明
- 上述代码不需要提前知道任何设备的ID,Firebase新增设备后返回的JSON里的新节点会自动被遍历到
- 如果你的设备最大数量超过10台,建议把
StaticJsonDocument的容量从1024调大到合适值,或者直接使用DynamicJsonDocument自动分配内存 - 如果你需要本地持久化存储所有设备数据,可以自定义结构体存储遍历得到的属性,示例参考:
// 定义设备结构体 typedef struct { char id[32]; char title[32]; char place[32]; char state[8]; } DeviceInfo; // 最多存储20台设备,可根据需求调整 DeviceInfo deviceList[20]; uint8_t deviceTotal = 0;
遍历的时候把数据存入deviceList数组即可随时调用。
内容的提问来源于stack exchange,提问作者Sajith Madhubashana
相关产品推荐
相关产品推荐

