2014-04-07 160 views
1

我有一个门传感器连接到树莓派。要检查门是否已经打开,下面的脚本以2秒为间隔运行。如果已打开,则会向外部API服务器发出POST请求。NodeJS事件循环与事件侦听

这个伟大的工程,但我们的目标是使含门多久打开,当它打开信息的POST请求。我的第一个想法是使用节点事件& EventEmitter功能,但我不确定这个实现。

var rest = require('restler'); 
var gpio = require('pi-gpio'); 

setInterval(function(){ 
    gpio.read(16, function(err, value) { // sensor is attached to pin 16 
    if(err) throw err; 
    if(value === 1){ // If closed, the value is 0 
     console.log("Door Opened"); 
     rest.post('http://192.168.6.109:3000/door/save', { 
       data: { 
       door: 'Open' 
       } 
     }).on('complete', function(data, response){ 
      console.log('door status code: ' + response.statusCode); 
     }); 
    } 
    }); 
},2000); 
+0

只需要保存你需要的东西并发送它?或者将更改记录在服务器中? – Mosho

+0

对不起,你是什么意思'保存你所需要的'? – Anconia

回答

0

您需要2件事:时间戳和打开和关闭事件之间的时间间隔。然后您可以将信息发送到服务器。像这样的东西可以工作:

var rest = require('restler'); 
var gpio = require('pi-gpio'); 

var open; 

setInterval(function(){ 
    gpio.read(16, function(err, value) { // sensor is attached to pin 
     if(err) throw err; 
     if(value == '1'){ // If closed, the value is '0' 
      console.log("Door Opened"); 
      open = Date.now(); 
     }else{ 
      //"0" is assumed 
      console.log("Door Closed"); 

      //Check whether the door was opened 
      if (open){ 
       var elapsed = Date.now() - open; 

       rest.post('http://192.168.6.109:3000/door/save', { 
        data: { 
         door: 'Open', 
         openTime: open, 
         elapsedTime: elapsed 
        } 
       }).on('complete', function(data, response){ 
         console.log('door status code: ' + response.statusCode); 
       }); 

       open = null; 
      } 
     } 
    }); 
},2000); 

但我怕经过的时间将是2000年一直尝试的倍数,以减少间隔时间。

+0

如果我在'open'变量的实例化中包含了'if(typeof open ==='undefined'){open = Date.now();}',那么在这个变量的每一次代码循环 – Anconia