2014-04-07 210 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