이벤트가 발생하면 외부 서버에서 PC로 웹 요청을 보낸다.
PC에서는 웹 요청을 분석하여 정보를 저장하고 이벤트 여부를 기록한다.
라즈베리파이에서 서버로 1초에 한번씩 신호를 보낸다.
PC에서는 이벤트가 있을 경우 이벤트의 정보를 라즈베리파이에 응답으로 보낸다.
1. 모듈 설치
라즈베리파이의 Smartlamp_pi2 디렉토리로 이동하여 진행한다.
다음의 명령어로 웹 요청을 보내기 위한 모듈인 request를 설치한다.
$ sudo npm install request --save
2. 라즈베리파이 코드 수정
다음과 같이 index.js 파일을 수정한다.
$ sudo vi index.js
var express = require("express");
var request = require('request');
var app = express();
var port = 5000;
var optionsSmartLamp = {
uri : "http://PC서버ip주소:포트번호/smartLamp",
method : "GET",
headers : { "Content-Type" : "application/x-www-form-urlencoded"}
};
app.get('/', function(req,res) {
console.log('smart void lamp');
res.send('Smart Voice Lamp');
});
app.listen(port,function() {
console.log("create Server");
//1초마다 smartLamp 함수 호출
setInterval(smartLamp,1000);
});
function smartLamp() {
//GET 요청 전송
request(optionsSmartLamp, function(error, response, body) {
if(body == "empty" ) {
console.log("no data");
}
else {
console.log(body);
}
});
}
optionsSmartLamp 변수에 웹 요청을 보내기 위한 옵션을 저장한다.
GET 요청을 http://PC서버ip주소:포트번호/smartLamp로 보내는 옵션을 설정하였다.
app.listen() 메소드에서 setInterval 함수로 smarLamp를 1초마다 호출한다.
smartLamp()에서는 request모듈을 이용하여 PC서버로 GET 요청을 보낸다.
응답의 body를 검사하여 body가 empty일 경우 no data를 콘솔에 출력하고,
그렇지 않을 경우 body의 내용을 콘솔에 출력한다.
3. PC 서버 코드 수정
PC의 index.js 파일을 다음과 같이 수정한다.
var express = require("express");
var bodyParser = require("body-parser");
var app = express();
var port = 3000;
var isData = false;
var empty = "empty";
var longtext = "";
app.use(bodyParser.urlencoded({extended : false}));
app.get('/', function (req,res) {
console.log('app.get "/" ');
res.send("Smart Lamp Server");
});
//파이로부터 1초마다 호출됨
app.get('/smartLamp', function(req,res) {
if(isData) {
isData = false; //한번 데이터 출력한 후 초기화
res.send(longtext);
}
else {
res.send(empty);
}
});
app.post('/facebook', function(req,res) {
var from = req.body.from;
var myMessage = req.body.myMessage;
var updateAt = req.body.updateAt;
longtext = "페이스북에" + req.body.from + "님이" + req.body.myMessage + "라고 게시했습니다.";
console.log(longtext);
isData = true;
res.send("Success");
});
app.listen(port, function () {
console.log('Smart Lamp Server app listening on port ' + port);
});
app.get('/smartLamp' ..... 부분이 파이로부터 1초마다 호출되는 함수이다.
호출되면 새로운 데이터가 있는지 확인하여 있을경우 데이터를 보내고, 없을경우 empty라는 메시지를 보낸다.
app.post('/facebook',...... 의 함수 내부도 수정되었다.
IFTTT로부터 받은 내용을 longtext라는 변수에 저장하고, 이를 출력한다.
isData변수를 true로 만들어 새로운 데이터가 있다는 것을 기록한다.
4. 실행 & 테스트
PC서버와 라즈베리파이 서버를 실행하고
페이스북에 게시글을 작성하면 아래와 같이 pc서버와 라즈베리파이에 출력되는것을 볼 수 있다.
'프로젝트 > Smart Lamp - 라즈베리파이' 카테고리의 다른 글
7. TTS 출력 (0) | 2017.01.07 |
---|---|
6. 라즈베리파이에서 네오픽셀LED 제어 (2) | 2017.01.05 |
4. IFTTT와 서버 연동 (0) | 2017.01.05 |
3. nodejs 서버 구축 - 윈도우&라즈베리파이 (0) | 2017.01.05 |
2. 깃허브 (0) | 2017.01.05 |