2017-04-26 3 views
0

Ich habe eine sensortag und eine Himbeere pi.Raspberry pi sammelt Daten von sensortag und versucht, Daten zu senden cloud.I Verwendung NodeJS Skript für collection.Here to google ist der Code:NodeJS async.series Post Objekt

var util = require('util'); 
 

 
var async = require('async'); 
 
var request = require('request'); 
 

 
var SensorTag = require('./index'); 
 
var http = require('http'); 
 
var CC2650SensorTag = require('./index').CC2650; 
 

 
var USE_READ = true; 
 
var date = new Date().getTime(); 
 
var json_sensor_value_obj = []; 
 
var json_final_obj; 
 

 
function Sensor_value(type, value) { 
 
    this.value = value; 
 
    this.type = type; 
 
} 
 
function Sensor_object(sensor_value, date) { 
 
    this.sensor_value = sensor_value; 
 
    this.date = date; 
 
} 
 
function send_data(data) { 
 
    console.log("send func. called"); 
 
    request({ 
 
     url: "http://fasensor.tk/post_data", method: "POST", headers: { "content-type": "application/json" }, json: true, body: JSON.stringify(data) 
 
    }, 
 
    function (error, response, body) { 
 
     console.log("connection"); 
 
     console.log(error); 
 
     console.log(response); 
 
    }); 
 
} 
 
    
 
CC2650SensorTag.discover(function (sensorTag) { 
 
    console.log('discovered: ' + sensorTag); 
 

 
    sensorTag.on('disconnect', function() { 
 
     console.log('disconnected!'); 
 
     send_data(json_final_obj); 
 
    process.exit(0); 
 
    }); 
 

 
    async.series([ 
 
     function(callback) { 
 
     console.log('connectAndSetUp'); 
 
     sensorTag.connectAndSetUp(callback); 
 
     }, 
 
     function(callback) { 
 
     console.log('readDeviceName'); 
 
     sensorTag.readDeviceName(function(error, deviceName) { 
 
      console.log('\tdevice name = ' + deviceName); 
 
      callback(); 
 
     }); 
 
     }, 
 
     function(callback) { 
 
     console.log('readSystemId'); 
 
     sensorTag.readSystemId(function(error, systemId) { 
 
      console.log('\tsystem id = ' + systemId); 
 
      callback(); 
 
     }); 
 
     }, 
 
     function(callback) { 
 
     console.log('readSerialNumber'); 
 
     sensorTag.readSerialNumber(function(error, serialNumber) { 
 
      console.log('\tserial number = ' + serialNumber); 
 
      callback(); 
 
     }); 
 
     }, 
 
     function(callback) { 
 
     console.log('readFirmwareRevision'); 
 
     sensorTag.readFirmwareRevision(function(error, firmwareRevision) { 
 
      console.log('\tfirmware revision = ' + firmwareRevision); 
 
      callback(); 
 
     }); 
 
     }, 
 
     function(callback) { 
 
     console.log('readHardwareRevision'); 
 
     sensorTag.readHardwareRevision(function(error, hardwareRevision) { 
 
      console.log('\thardware revision = ' + hardwareRevision); 
 
      callback(); 
 
     }); 
 
     }, 
 
     function(callback) { 
 
     console.log('readSoftwareRevision'); 
 
     sensorTag.readHardwareRevision(function(error, softwareRevision) { 
 
      console.log('\tsoftware revision = ' + softwareRevision); 
 
      callback(); 
 
     }); 
 
     }, 
 
     function(callback) { 
 
     console.log('readManufacturerName'); 
 
     sensorTag.readManufacturerName(function(error, manufacturerName) { 
 
      console.log('\tmanufacturer name = ' + manufacturerName); 
 
      callback(); 
 
     }); 
 
     }, 
 
     function(callback) { 
 
     console.log('enableIrTemperature'); 
 
     sensorTag.enableIrTemperature(callback); 
 
     }, 
 
     function(callback) { 
 
     setTimeout(callback, 2000); 
 
     }, 
 
     function(callback) { 
 
     if (USE_READ) { 
 
      console.log('readIrTemperature'); 
 
      sensorTag.readIrTemperature(function(error, objectTemperature, ambientTemperature) { 
 
      console.log('\tobject temperature = %d °C', objectTemperature.toFixed(1)); 
 
      console.log('\tambient temperature = %d °C', ambientTemperature.toFixed(1)); 
 
      var temp_obj = new Sensor_value('Temperature', ambientTemperature.toFixed(1)); 
 
      json_sensor_value_obj.push(temp_obj); 
 

 
      callback(); 
 
      }); 
 
     } else { 
 
      sensorTag.on('irTemperatureChange', function(objectTemperature, ambientTemperature) { 
 
      console.log('\tobject temperature = %d °C', objectTemperature.toFixed(1)); 
 
      console.log('\tambient temperature = %d °C', ambientTemperature.toFixed(1)) 
 
      }); 
 

 
      console.log('setIrTemperaturePeriod'); 
 
      sensorTag.setIrTemperaturePeriod(500, function(error) { 
 
      console.log('notifyIrTemperature'); 
 
      sensorTag.notifyIrTemperature(function(error) { 
 
       setTimeout(function() { 
 
       console.log('unnotifyIrTemperature'); 
 
       sensorTag.unnotifyIrTemperature(callback); 
 
       }, 5000); 
 
      }); 
 
      }); 
 
     } 
 
     }, 
 
     function(callback) { 
 
     console.log('disableIrTemperature'); 
 
     sensorTag.disableIrTemperature(callback); 
 
     }, 
 
     function(callback) { 
 
     console.log('enableHumidity'); 
 
     sensorTag.enableHumidity(callback); 
 
     }, 
 
     function(callback) { 
 
     setTimeout(callback, 2000); 
 
     }, 
 
     function(callback) { 
 
     if (USE_READ) { 
 
      console.log('readHumidity'); 
 
      sensorTag.readHumidity(function(error, temperature, humidity) { 
 
      console.log('\ttemperature = %d °C', temperature.toFixed(1)); 
 
      console.log('\thumidity = %d %', humidity.toFixed(1)); 
 
      var hum_obj = new Sensor_value('Humidity', humidity.toFixed(1)); 
 
      json_sensor_value_obj.push(hum_obj); 
 
      callback(); 
 
      }); 
 
     } else { 
 
      sensorTag.on('humidityChange', function(temperature, humidity) { 
 
      console.log('\ttemperature = %d °C', temperature.toFixed(1)); 
 
      console.log('\thumidity = %d %', humidity.toFixed(1)); 
 
      }); 
 

 
      console.log('setHumidityPeriod'); 
 
      sensorTag.setHumidityPeriod(500, function(error) { 
 
      console.log('notifyHumidity'); 
 
      sensorTag.notifyHumidity(function(error) { 
 
       setTimeout(function() { 
 
       console.log('unnotifyHumidity'); 
 
       sensorTag.unnotifyHumidity(callback); 
 
       }, 5000); 
 
      }); 
 
      }); 
 
     } 
 
     }, 
 
     function(callback) { 
 
     console.log('disableHumidity'); 
 
     sensorTag.disableHumidity(callback); 
 
     }, 
 
     function(callback) { 
 
     console.log('enableBarometricPressure'); 
 
     sensorTag.enableBarometricPressure(callback); 
 
     }, 
 
     function(callback) { 
 
     setTimeout(callback, 2000); 
 
     }, 
 
     function(callback) { 
 
     if (USE_READ) { 
 
      console.log('readBarometricPressure'); 
 
      sensorTag.readBarometricPressure(function(error, pressure) { 
 
      console.log('\tpressure = %d mBar', pressure.toFixed(1)); 
 
      var air_press_obj = new Sensor_value('Air Pressure', pressure.toFixed(1)); 
 
      json_sensor_value_obj.push(air_press_obj); 
 
      callback(); 
 
      }); 
 
     } else { 
 
      sensorTag.on('barometricPressureChange', function(pressure) { 
 
      console.log('\tpressure = %d mBar', pressure.toFixed(1)); 
 
      }); 
 

 
      console.log('setBarometricPressurePeriod'); 
 
      sensorTag.setBarometricPressurePeriod(500, function(error) { 
 
      console.log('notifyBarometricPressure'); 
 
      sensorTag.notifyBarometricPressure(function(error) { 
 
       setTimeout(function() { 
 
       console.log('unnotifyBarometricPressure'); 
 
       sensorTag.unnotifyBarometricPressure(callback); 
 
       }, 5000); 
 
      }); 
 
      }); 
 
     } 
 
     }, 
 
     function(callback) { 
 
     console.log('disableBarometricPressure'); 
 
     sensorTag.disableBarometricPressure(callback); 
 
     }, 
 
     function(callback) { 
 
      if (sensorTag.type === 'cc2650') { 
 
      async.series([ 
 
      function(callback) { 
 
       console.log('readIoData'); 
 
       sensorTag.readIoData(function(error, value) { 
 
       console.log('\tdata = ' + value); 
 

 
       console.log('writeIoData'); 
 
       sensorTag.writeIoData(value, callback); 
 
       }); 
 
      }, 
 
      function(callback) { 
 
       console.log('readIoConfig'); 
 
       sensorTag.readIoConfig(function(error, value) { 
 
       console.log('\tconfig = ' + value); 
 

 
       console.log('writeIoConfig'); 
 
       sensorTag.writeIoConfig(value, callback); 
 
       }); 
 
      }, 
 
      function(callback) { 
 
       console.log('enableLuxometer'); 
 
       sensorTag.enableLuxometer(callback); 
 
      }, 
 
      function(callback) { 
 
       setTimeout(callback, 2000); 
 
      }, 
 
      function(callback) { 
 
       if (USE_READ) { 
 
       console.log('readLuxometer'); 
 
       sensorTag.readLuxometer(function(error, lux) { 
 
        console.log('\tlux = %d', lux.toFixed(1)); 
 

 
        callback(); 
 
       }); 
 
       } else { 
 
       sensorTag.on('luxometerChange', function(lux) { 
 
        console.log('\tlux = %d', lux.toFixed(1)); 
 
       }); 
 

 
       console.log('setLuxometer'); 
 
       sensorTag.setLuxometerPeriod(500, function(error) { 
 
        console.log('notifyLuxometer'); 
 
        sensorTag.notifyLuxometer(function(error) { 
 
        setTimeout(function() { 
 
         console.log('unnotifyLuxometer'); 
 
         sensorTag.unnotifyLuxometer(callback); 
 
        }, 5000); 
 
        }); 
 
       }); 
 
       } 
 
      }, 
 
      function(callback) { 
 
       console.log('disableLuxometer'); 
 
       sensorTag.disableLuxometer(callback); 
 
      }, 
 
      function() { 
 
       callback(); 
 
      } 
 
      ]); 
 
     } else { 
 
      callback(); 
 
     } 
 
     }, 
 
     function (callback) { 
 
      console.log('Values are converting to json object...'); 
 
      var sensor_obj = new Sensor_object(json_sensor_value_obj, date); 
 
      json_final_obj = JSON.stringify(sensor_obj); 
 
      console.log(json_final_obj); 
 
      console.log('Coverting has finihed.'); 
 
     console.log('disconnect'); 
 
     sensorTag.disconnect(callback); 
 
     } 
 
    ] 
 
); 
 
});

der wichtigste Teil ist Ende des async series.I hat erfolgreich Daten gesammelt und es json-Format machen und dann trennt Funktion ist called.However, in Trennfunktion wird Anforderung nicht ordnungsgemäß ausgeführt, weil es keine Statuscode - Ausgabe (nur "send func. called "wird gedruckt). Ich vermutete, dass das Problem stammt aus Google Cloud, aber ich kann ein Json-Objekt in einem anderen Nodejs-Skript, wenn es ausgeführt wird. I weiß nicht, warum die Anfrage in diesem Fall nicht ordnungsgemäß funktioniert.

+0

Sie sollten ein minimal reproduzierbares Beispiel angeben. –

+0

Der Code erfordert eine Hardware (TI sensortag), um die Ausführung zu starten und eine Ausgabe zu generieren. Ich weiß nicht, wie ich ein produzierbares Beispiel liefern kann. Tatsächlich hängt das Problem nicht direkt mit der Datensammlung (Hardwareteil) zusammen und macht es zu JSON-Daten .Das vorgenannte Problem ist, dass ich am Ende der asynchronen Serie keine Anfrage stellen kann. Danke übrigens für Ihren Kommentar. –

Antwort

0

Ich vermute, es ist in der folgenden:

sensorTag.on('disconnect', function() { 
    console.log('disconnected!'); 
    send_data(json_final_obj); 
    process.exit(0); 
}); 

send_data() ruft die Anforderung, die asynchron ist, so process.exit(0), heißt immer, bevor Sie eine Antwort zurück. Fügen Sie einen Rückruf zu send_data() hinzu und fügen Sie process.exit() ein, nachdem wir die Antwort erhalten haben. Die folgenden Änderungen werden es wahrscheinlich beheben:

sensorTag.on('disconnect', function() { 
    console.log('disconnected!'); 
    send_data(json_final_obj,() => process.exit(0)); 
}); 

function send_data(data, callback) { 
    console.log("send func. called"); 
    request({ 
     url: "http://fasensor.tk/post_data", method: "POST", headers: { "content-type": "application/json" }, json: true, body: JSON.stringify(data) 
    }, 
    function (error, response, body) { 
     console.log("connection"); 
     console.log(error); 
     console.log(response); 
     callback() 
    }); 
} 
+0

als ich die Lösung implementiert habe, bekomme ich den Fehler: "home/pi/node_modules/edel/lib/peripherer.js: 53 Callback (null); TypeError: Callback ist keine Funktion". Ich denke, dieses Problem ist mit Sensortag Disconnect-Bibliothek verbunden.Es wird erwartet, eine Funktion, aber ich weiß nicht, wie ich es herausfinden kann.Außerdem gibt es den Fehler nach dem Drucken "getrennt!" und "send func. called". –

+0

Ich weiß nicht viel über sensortag, aber vielleicht ist es die Pfeilfunktion (sensortag unterstützt möglicherweise noch keine Pfeilfunktionen?) Ersetzen Sie '() => process.exit (0)' durch 'function() {process.exit (0 }} und sehen, ob es diesen Fehler behebt. –

+0

Vielen Dank diese Lösung funktioniert !!!! –