我正在研究Arduino-firebase家庭自动化项目。现在,Firebase数据通过移动应用程序更改,Arduino Esp8266模型从firebase读取数据。所以每次循环都会调用
FirebaseObject firebaseObject=Firebase.get(path_command);
它不断消耗数据。所以这是我的问题,有没有办法只在firebase服务器上更改数据时获取数据?
我试过下面的代码,但它崩溃了设备
if(Firebase.available())
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.stream("/devices/_18_fe_34_d6_9_4f_/command");
if (Firebase.failed()) {
Serial.println("streaming error");
Serial.println(Firebase.error());
}
if (Firebase.available()) {
FirebaseObject firebaseObject = Firebase.readEvent();
String deviceToken=firebaseObject.getString("device_token");
Serial.println(deviceToken);
}
如果有更好的解决方案,请指导我,谢谢。
我们已经找到了大量数据使用的解决方案。以前我们使用下面的代码获取所有json数组。
FirebaseObject firebaseObject=Firebase.get(path_command);
其中消耗几个字节或Kb数据。现在我们首先检查它是由额外标志版本对数据进行的任何更改。它是增量的。我们将它存储在每个节点级别的数据库中,每次数据更新时我们需要通过递增来更改它。现在我们需要在获取所有json数组之前检查版本,如下所示
int version =Firebase.getInt(version_path);
if(version!=previosVersion)
FirebaseObject firebaseObject=Firebase.get(path_command);
。如果我们得到版本差异,那么我们只需要获取json对象。在此之前的一个小时内,Arduino每小时耗费大约3到5 MB,现在每小时消耗700-800 KB。我们仍然在寻找最佳的优化。谢谢。
使用此函数Firebase.available()
返回一个布尔值(true或false)。
如果它返回true,表示数据库中发生了某种数据更改,因此您可以检索它。
但只有在此函数后调用上述函数,此函数才有效:
Firebase.stream("path u wish to monitor changes");
有关更多信息,请阅读Firebase.available()的文档