Nodejs生成重复的http请求

时间:2017-06-11 11:57:21

标签: node.js http sap iot

希望有些人可以帮助解决我的问题。我正在使用此SAP Tutorial下面的nodejs代码来读取每个HTTP发布的传感器值。一切都很好,但事实上每条记录都发布了两次(见Screenshot)。我不熟悉服务器端的JS并且不知道为什么重复。同意,值不相同,但是为了进一步处理,我希望每个时间戳有单个数据集。有人可以帮我找到问题,如果可能的话,提供解决方案/解决方法吗?

此脚本每10秒读取并传输数据。我正在寻找一种方法将间隔设置为3分钟。我也很感激这里的每一点帮助

 /*     sensorTag IR Temperature sensor example
*  Craig Cmehil, SAP SE (c) 2015
*/

/* Choose the proper HTTP or HTTPS, SAP Cloud Platformrequires HTTPS */
var http = require('https');

var SensorTag = require('sensortag');
var lv_temp;
var lv_humid;
var lv_deviceid = "";
var DEBUG_VALUE = true;
var xtimestamp;
var date = new Date();
var time = date.getTime ();

// SAP Cloud Platform connection details
var portIoT = 443;
var pathIoT = '/com.sap.iotservices.mms/v1/api/http/data/';
var hostIoT = 'iotmmsXXXXXXXXXXtrial.hanatrial.ondemand.com';
var authStrIoT = 'Bearer XXXXXXXXXXXX';
var deviceId = 'XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX';
var messageTypeID = 'XXXXXXXXXXXX';

var options = {
    host: hostIoT,
  port: portIoT,
    path: pathIoT + deviceId,
    agent: false,
    headers: {
       'Authorization': authStrIoT,
       'Content-Type': 'application/json;charset=utf-8',
     'Accept': '*/*'
    },
    method: 'POST',     
};

/***************************************************************/
/* Coding to access TI SensorTag and values of various sensors */
/***************************************************************/

console.log("If not yet activated, then press the power button.");
SensorTag.discover(function(tag) {
tag.on('disconnect', function() {
    console.log('disconnected!');
    process.exit(0);
});

function connectExecute() {
    console.log('Connect Device and Execute Sensors');
    tag.connectAndSetUp(enableSensors);
}

function enableSensors() {
    /* Read device specifics */
    tag.readDeviceName(function(error, deviceName) {
        console.log('Device Name = ' + deviceName);
    });
    tag.readSystemId(function(error, systemId) {
        console.log('System ID = ' + systemId);
        lv_deviceid = systemId;
    });
    tag.readSerialNumber(function(error, serialNumber) {
        console.log('Serial Number = ' + serialNumber);
    });
    tag.readFirmwareRevision(function(error, firmwareRevision) {
        console.log('Firmware Rev = ' + firmwareRevision);
    });
    tag.readHardwareRevision(function(error, hardwareRevision) {
        console.log('Hardware Rev = ' + hardwareRevision);
    });
    tag.readHardwareRevision(function(error, softwareRevision) {
        console.log('Software Revision = ' + softwareRevision);
    });
    tag.readManufacturerName(function(error, manufacturerName) {
        console.log('Manufacturer = ' + manufacturerName);
    });
    /* Enable Sensors */
    console.log("Enabling sensors:");
    console.log('\tenableIRTemperatureSensor');
    tag.enableIrTemperature(notifyMe);
    console.log('\tenableHumidity');
    tag.enableHumidity(notifyMe);
    console.log("*********************************************");
    console.log(" To stop press both buttons on the SensorTag ");
    console.log("*********************************************");
}

function notifyMe() {
    tag.notifySimpleKey(listenForButton);
    setImmediate(function loop () {
        tag.readIrTemperature(function(error, objectTemperature, ambientTemperature){
            lv_obj = objectTemperature.toFixed(1);
            lv_ambient = ambientTemperature.toFixed(1);
            });
        tag.readHumidity(function(error, temperature, humidity) {
            lv_temp = temperature.toFixed(1);
            lv_humid = humidity.toFixed(1);
        });
        if(DEBUG_VALUE)
            console.log("Sending Data: " + lv_deviceid + " " + lv_temp + " " + lv_humid);
        setSensorData(lv_temp, lv_humid);
        setTimeout(loop, 10000);
    });
  }

function listenForButton() {
    tag.on('simpleKeyChange', function(left, right) {
        if (left && right) {
            tag.disconnect();
        }
   });
}

connectExecute();
});

/******************************************************************/
/* FUNCTION to get Temperature from the Sensor & update into HANA */
/******************************************************************/
function setSensorData(lv_temp,lv_humid){
date = new Date();
  time =date.getTime();

var data = {
    "mode":"sync",
    "messageType": messageTypeID,
    "messages": [{
        "timestamp": time,
        "temperature": lv_temp,
        "humidity": lv_humid
    }]
  };
var strData = JSON.stringify(data);
if(DEBUG_VALUE)
    console.log("Data: " + strData);
if(strData.length > 46){
    if(DEBUG_VALUE)
        console.log("Sending Data to server");
    /* Process HTTP or HTTPS request */
    options.agent = new http.Agent(options);
    var request_callback = function(response) {
        var body = '';
        response.on('data', function (data) {
            body += data;
        });
        response.on('end', function () {
            if(DEBUG_VALUE)
                console.log("REQUEST END:", response.statusCode);
        });
        response.on('error', function(e) {
            console.error(e);
        });    
    }
    var request = http.request(options, request_callback);
    request.on('error', function(e) {
        console.error(e);
    });
    request.write(strData);
    request.end();
}else{
    if(DEBUG_VALUE)
        console.log("Incomplete Data");
}
}

1 个答案:

答案 0 :(得分:0)

它应该只发布一次到系统但是两次到屏幕。

在函数notifyMe中,您需要更改行

setTimeout(loop,10000);

在再次发布之前,将数字更改为您希望延迟的时间间隔。