Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 正确创建/解析JSON_Node.js_Firebase_Firebase Realtime Database_Arduino_Google Cloud Functions - Fatal编程技术网

Node.js 正确创建/解析JSON

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

我有一个ESP8266能够读取温度和湿度。我们的想法是将这些读数上传到Firebase数据库,一旦上传了这些数据,就使用Firebase的函数触发器采取一些措施

我有一个Arduino代码,可以从ESP8622上传数据。上传的数据是时间戳、传感器id、温度和湿度。详情如下:

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很高兴我能帮助您,感谢您接受答案。如果您认为有帮助,您也可以通过单击答案左侧的灰色向上大箭头进行向上投票。请参阅。谢谢!我确实这样做了!最后一个问题:如何转换常量温度和恒湿浮动值,我可以用,例如,比较其他数字?非常感谢!看看。