Node.js 正确创建/解析JSON
我有一个ESP8266能够读取温度和湿度。我们的想法是将这些读数上传到Firebase数据库,一旦上传了这些数据,就使用Firebase的函数触发器采取一些措施 我有一个Arduino代码,可以从ESP8622上传数据。上传的数据是时间戳、传感器id、温度和湿度。详情如下:Node.js 正确创建/解析JSON,node.js,firebase,firebase-realtime-database,arduino,google-cloud-functions,Node.js,Firebase,Firebase Realtime Database,Arduino,Google Cloud Functions,我有一个ESP8266能够读取温度和湿度。我们的想法是将这些读数上传到Firebase数据库,一旦上传了这些数据,就使用Firebase的函数触发器采取一些措施 我有一个Arduino代码,可以从ESP8622上传数据。上传的数据是时间戳、传感器id、温度和湿度。详情如下: void updateDatabase(String &temp, String &humidity, String &temp_feeling) { String path = "/Me
void updateDatabase(String &temp, String &humidity, String &temp_feeling)
{
String path = "/Measurements";
String SensorID = "1";
timeClient.update();
// timeClient.setTimeOffset(3600);
long timeStamp = timeClient.getEpochTime();
json.clear().set("id",DEVICE_ID);
json.set("timestamp",(String)timeStamp);
json.set("temperature",temp_feeling);
json.set("humidity",humidity);
mostrarJSON(json);
if (Firebase.pushJSON(firebaseData, path,json))
{
Serial.println("PASSED");
Serial.println("PATH: " + firebaseData.dataPath());
Serial.println("TYPE: " + firebaseData.dataType());
Serial.println("ETag: " + firebaseData.ETag());
Serial.print("VALUE: ");
printResult(firebaseData);
Serial.println("------------------------------------");
Serial.println();
}
else
{
Serial.println("FAILED");
Serial.println("REASON: " + firebaseData.errorReason());
Serial.println("------------------------------------");
Serial.println();
}
}
此JSON上载到Firebase数据库。上传数据的结果如下:
void updateDatabase(String &temp, String &humidity, String &temp_feeling)
{
String path = "/Measurements";
String SensorID = "1";
timeClient.update();
// timeClient.setTimeOffset(3600);
long timeStamp = timeClient.getEpochTime();
json.clear().set("id",DEVICE_ID);
json.set("timestamp",(String)timeStamp);
json.set("temperature",temp_feeling);
json.set("humidity",humidity);
mostrarJSON(json);
if (Firebase.pushJSON(firebaseData, path,json))
{
Serial.println("PASSED");
Serial.println("PATH: " + firebaseData.dataPath());
Serial.println("TYPE: " + firebaseData.dataType());
Serial.println("ETag: " + firebaseData.ETag());
Serial.print("VALUE: ");
printResult(firebaseData);
Serial.println("------------------------------------");
Serial.println();
}
else
{
Serial.println("FAILED");
Serial.println("REASON: " + firebaseData.errorReason());
Serial.println("------------------------------------");
Serial.println();
}
}
Firebase函数具有此代码以处理上传的最新测量
exports.onDataAdded = functions.database.ref('/Measurements').onWrite((change,context)=>{
const snapshot = change.after;
const val = snapshot.child("").val()
console.log(val)
const temperature = snapshot.child("").child("temperature").val()
const humidity = snapshot.child("").child("humidity").val()
console.log(`New data received : temp : ${temperature}, humidity : ${humidity}`)
takeActionSensorUpdate(temperature,humidity)
return null
})
Firebase控制台上的代码结果如下:
控制台输出为:
我有一些问题:
- 我是否在Arduino代码上正确构建JSON对象?我是否应该创建自己的节点名,而不是为每个度量使用随机唯一id?如果是,我怎么做
- 如果我仅在从ESP8266接收新上传时触发代码,为什么我要打印多个数据库实例
- 正如您在控制台上看到的,温度和湿度数据中的输出显示为空。我猜这是因为我在/measures下为每个新的度量添加了一个自动随机id,因为它可以在上传到数据库的对象上看到。如何更改Firebase函数的代码以获得所需的值(在本例中为温度和湿度)
多谢各位 我不知道Arduino,但我想下面会回答你的问题 我是否在Arduino代码上正确构建JSON对象?我应该吗 创建自己的节点名,而不是为每个节点使用随机唯一id 测量如果是,我怎么做 正如我所说的,我不能从Arduino库的角度回答(我猜您会使用这个),但是让数据库使用唯一的键(即您问题中的“节点名”)生成新的子位置是非常标准的,正如在(例如JavaScript SDK)中所解释的,这是非常重要的“将数据添加到项目集合的最常见模式。” 如果触发,为什么要打印多个数据库实例 仅当我从ESP8266接收到新上传时才显示代码 这是因为您在
Measurements
节点级别触发了云功能。
请参见下面如何为测量的一个特定子节点触发它
正如您在控制台上看到的,输出在温度和温度上显示为null
湿度数据。我想这是因为我有一个自动随机id
如图所示,每个新的测量值都添加在/测量值下
在上载到数据库的对象上。如何更改上的代码
Firebase函数获取我想要的值,在本例中是温度和
湿度
与上述原因相同:change.after
表示测量值
节点(触发事件后)的数据。它不表示其一个子节点的数据。此外,通过执行snapshot.child(“”)
您将获得一个未定义的
值,因为您将空字符串传递给child()
。下面是一个云函数代码,可以实现以下功能:
exports.onDataAdded = functions.database.ref('/Measurements/{pushId}').onWrite((change,context)=>{
const afterData = change.after.val();
console.log(afterData)
const temperature = afterData.temperature;
const humidity = afterData.humidity;
console.log(`New data received : temp : ${temperature}, humidity : ${humidity}`)
takeActionSensorUpdate(temperature,humidity) //Double check if this is not asynchronous. If yes you need to wait the asynchronous action is done before returning
return null
})
正如您将在中看到的,我们使用通配符(用花括号括起来)指定路径组件
匹配任何/Measurements
的子项,非常感谢!@Asaak很高兴我能帮助您,感谢您接受答案。如果您认为有帮助,您也可以通过单击答案左侧的灰色向上大箭头进行向上投票。请参阅。谢谢!我确实这样做了!最后一个问题:如何转换常量温度和恒湿浮动值,我可以用,例如,比较其他数字?非常感谢!看看。