Notice
Recent Posts
Recent Comments
Today
Total
04-17 00:08
Archives
관리 메뉴

Jeongchul Kim

라즈베리파이 카메라 촬영과 이메일로 동영상 및 사진 전송과 웹 서버 구성(express, nodemailer) 본문

라즈베리파이

라즈베리파이 카메라 촬영과 이메일로 동영상 및 사진 전송과 웹 서버 구성(express, nodemailer)

김 정출 2016. 4. 6. 15:54


라즈베리파이 카메라 촬영과 이메일로 동영상 및 사진 전송과 웹 서버 구성(express, nodemailer)



라즈베리파이

라즈베리 카메라 보드와 사진 및 동영상 촬영


이전 포스트에서 라즈베리 카메라 보드를 통해 사진과 동영상 촬여을 하였습니다.

오늘은 node js에서 express를 이용해 웹 서버를 구성하고, 카메라를 통해 사진 촬영 또는 비디오를 촬영하여 nodemailer를 이용해 G 메일을 통해 메일을 발송하여 첨부 파일을 통해 사진과 동영상을 확인하고, 또한 웹 서버 주소로 접근하여 사진과 동영상을 확인해보겠습니다.


자 우선 웹 서버를 구성하기 위해서는 다음과 같은 소스가 필요합니다.


우선 main.js 폴더를 생성합니다.

웹 서버 구성

main.js

var http = require('http');

var express = require('express');

var smartmirror = express();

smartmirror.use(express.static(__dirname+"/public"));

http.createServer(smartmirror).listen(9091,function() {

console.log('server on 9091...');

});


위의 최소 5줄로 웹 서버를 구성할 수 있습니다. 주소는 해당 ip이며, 포트는 9091입니다.

포트는 원하시는 대로 작성해서 사용하셔도 됩니다.


이어서 프로세스를 통해 사진 촬영을 진행해봅시다.


사진 촬영

다음의 두 줄은 프로세스를 생성하기 위한 코드 입니다.

var exec_video = require('child_process').exec;

var exec_photo = require('child_process').exec;


사진과 동영상을 저장할 위치를 정의해주셔야 합니다.

저는 ip주소를 이용해 접근하여 볼 수 있는 웹 서버의 public 디렉터리의 video와 photo 디렉터리에 따로따로 사진과 비디오를 저장할 것입니다.

사진과 비디오의 이름은 현재 날짜와 시간을 찍는 Date.now()를 이용할 것이며, 마지막은 확장자 명을 붙여 주셔야합니다.

var video_path = __dirname+"/public/video/"+Date.now()+'.h264';

var photo_path = __dirname+"/public/photo/"+Date.now()+'.jpg';


다음의 코드는 저번 포스트에서 사진 또는 동영상을 촬영하던 명령어입니다.

raspivid 는 라즈베리 카메라 동영상 촬영 명령어이구, raspistill은 라즈베리 카메라 사진 촬영 명령어입니다.


var cmd_video = 'raspivid -o '+video_path+' -t 4000';

var cmd_photo = 'raspistill -o '+photo_path;


주의해야 할 점!! 밑의 코드를 동시에 사용하시면 안되구요 프로세스 상 충돌이 일어나 따로따로 주석처리하시고, 실행하셔야 합니다.

코드를 보시면 우선 exec_video 실행을 통해 명령어를 실행해주고 메일을 전송합니다.


exec_video(cmd_video, function(errror, stdout, stderr) {

console.log('Video Saved : ',video_path);

require('./mailer').sendEmail(video_path);

});


exec_photo(cmd_photo, function(error, stdout, stderr){

console.log('Photo Saved : ',photo_path);

require('./mailer').sendEmail(photo_path);

});


전체 소스입니다.

var http = require('http');

var express = require('express');

var smartmirror = express();

smartmirror.use(express.static(__dirname+"/public"));

http.createServer(smartmirror).listen(9091,function() {

console.log('server on 9091...');

});

var exec_video = require('child_process').exec;

var exec_photo = require('child_process').exec;

var video_path = __dirname+"/public/video/"+Date.now()+'.h264';

var photo_path = __dirname+"/public/photo/"+Date.now()+'.jpg';

var cmd_video = 'raspivid -o '+video_path+' -t 4000';

var cmd_photo = 'raspistill -o '+photo_path;

exec_video(cmd_video, function(errror, stdout, stderr) {

console.log('Video Saved : ',video_path);

require('./mailer').sendEmail(video_path);

});

/*

exec_photo(cmd_photo, function(error, stdout, stderr){

console.log('Photo Saved : ',photo_path);

require('./mailer').sendEmail(photo_path);

});

*/

function exit() {

process.exit();

}


메일 전송

mailer.js

자 다음은 nodemailer를 이용한 메일 전송입니다.

제일 중요한 부분은 nodemailer.createTransport 안에서

auth:의 인증 부분입니다. user는 메일을 보낼 본인의 메일이며, pass는 본인 메일의 암호가 필요합니다.

메일이 틀리다면 오류가 발생됩니다.

mail options을 보시면 from는 보내는이, to는 받는이의 주소를 subject는 메일의 제목이며 html은 메일의 내용이 되겠습니다.

attachments를 통해 우리가 촬영한 사진과 동영상이 전송됩니다.


전체 코드입니다.


var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({

 service: 'Gmail',

 auth: {

   user: '**************@gmail.com',

   pass: '*********'

 }

});

var timerId;

module.exports.sendEmail = function(file) {

 if (timerId) return;

 timerId = setTimeout(function() {

   clearTimeout(timerId);

   timerId = null;

 }, 10000);

 console.log('Sendig an Email..');

 var mailOptions = {

   from: 'Smart Mirror <********@gmail.com>',

   to: '*************@gmail.com',

   subject: '[Smart mirror] Your video',

   html: '<b>Hi</b>,<br/><br/> Please check the your video<br/><br/> Smart Mirror : ' + Date() + ' <br/><br/>Dear,<br/><i>Smart Mirror</i>',

   attachments: [{

     path: file

   }]

 };

 transporter.sendMail(mailOptions, function(error, info) {

   if (error) {

     console.log(error);

   } else {

     console.log('Message sent: ' + info.response);

   }

 });

}

node install

express를 이용하기 위해

$sudo npm install express


nodemailer를 이용하기 위해

$sudo npm install nodemailer


프로그램 실행

동영상 코드를 실행하였습니다.


node main.js

동영상이 촬영됩니다.

터미널을 보면 9091 포트로 서버가 동작 중입니다.

Message sent : 250 2.0.0 OK가 뜨면 메일이 전송된 것입니다.

메일로 갔습니다.



메일을 확인해보지요.

확장자가 h264인 동영상을 열어보기 위해서는 다음의 팟플레이어를 설치해야 합니다.

잘나옵니다.


좋습니다.


웹브라우저에서 해당 ip로 접속하면 동영상을 다운 받을 수 있습니다.


사진 코드를 이용해보겠습니다.

실행해봅니다. 이번엔 다른 각도에서 찍어보았습니다.



메일 전송도 완료되었습니다.

좋습니다. 주소로 접속해보겠습니다.

화질이 좋네요 ^^


포스트를 마치겠습니다.




Comments