2017-04-26 4 views
0

私はsensortagとラズベリーpi.Raspberryのパイを持っているがsensortagからデータを収集し、cloud.I使用がcollection.Hereためのスクリプトをnodejs Googleにデータを送信しようとするコードです:nodejs async.seriesポストオブジェクト

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); 
 
     } 
 
    ] 
 
); 
 
});

重要な部分は、非同期series.Iの終わりでは、データを正常に収集し、それJSON形式にし、その後、切断機能はcalled.Howeverで、何があるので切断機能では、要求が正しく実行されませんされていますステータスコード出力( "send func。 "が印刷されます)。 問題はGoogleクラウドから発生していると思われますが、実行されたときに別のnodejsスクリプトにjsonオブジェクトを投稿できます。は、このインスタンスで要求が正しく機能しない理由を認識していません。

+0

最小限の再現可能な例を提示する必要があります。 –

+0

コードはハードウェア(TIのsensortag)が実行を開始し、出力を生成する必要があります。私はどのように生産可能なexample.Actually、問題はデータ収集(ハードウェアの部分)に関連していないとjsonデータ上記の問題は、非同期シリーズの最後に私がリクエストを行うことができないことです。途中であなたのコメントをいただきありがとうございます。 –

答えて

0

私はそれは次のようにだ疑いがある:あなたが戻って応答を取得する前に

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

send_data()はそうprocess.exit(0)、非同期でリクエストを呼び出し、呼び出されつつあります。 send_data()にコールバックを追加し、応答が返ってからprocess.exit()を実行します。次の変更により、問題が解決される可能性があります。

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

解決策を実装したとき、「home/pi/node_modules/noble/lib/peripheral.js:53 callback(null); TypeError:コールバックが関数ではありません」というエラーが発生します。私はこの問題がsensortag切断ライブラリに関連していると思います。機能には期待されていますが、どのように把握できるのか分かりません。途中で、「切断されました」というエラーが表示されます。 「send func。」と呼ばれています。 –

+0

私はsensortagについてよく分かりませんが、矢印関数である可能性があります(sensortagはまだ矢印関数をサポートしていない可能性がありますか?) '()=> process.exit(0)'を 'function(){process.exit )} 'を呼び出し、そのエラーを解決するかどうかを確認します。 –

+0

このソリューションはありがとうございます!!!! –