[보안][cast] 인터넷 실시간 화상 감시 시스템 구축
### USB CAM 을 이용한 실시간 웹 화상 감시 시스템 구축 ###
작성일 : 2005 년 11월 2일
작성자 : 서 진우 / 시스존
1. 인터넷 웹 화상 감시 시스템 구축 준비 사항
저가 USB Cam 을 이용하여 리눅스로 IDC 내부 감시 및 중요한 감시 구간에 실시간 인터넷 화상
감시 시스템을 구축 하는 법에 대해 알아 보도록 한다.
이 문서는 1년간 좋은 추억을 나에게 선사한 나의 D-70 Nikon 카메라와 3개의 렌즈에게 바친다.
나쁜 도둑놈들…버룩의 간을 ~~ 힝…ㅠ.ㅠ
이는 리눅스 시스템을 원격지에서 운영 시 3~4만원 정도의 USB CAM 하나만으로 장소와 시간에
구애 없이 언제든지 인터넷에서 시스템의 물리적인 보안을 체크 할 수 있는 방안이 될것이다.
또한 회사 공간에 리눅스 서버를 운영하고 있으면 그 서버를 이용하여 회사 내부의 환경을
감시 할 수 있을 것이다. 단 .. 개인적인 사생활 침해의 요지가 있으니 이용 시 주의를 필요 할
수 있다.
* 주요 준비 사항
– USB Web Cam
– LINUX 서버 시스템 ( Kernel-2.4.x. Kernel-2.6.x )
– USB Web Cam Linux driver ( spca5xx ) : http://mxhaard.free.fr/download.html
– Xawtv ( webcam view, capture image ) : http://www.strusel007.de/linux/xawtv
2. 리눅스 드라이브 설치
Linux Driver (spca5xx) 를 다운 받아 설치 한다.
# tar xzvf spca5xx-20051101.tar.gz
# cd spca5xx-20051101
– Kernel 2.4.x
# make dep
# make clean
# make
# make install
– Kernel 2.6.x
# make clean
# make
# make install
혹 make 시 Kernel 관련 헤더 파일등을 찾을 수 없다는 에러가 발생하면, 현재 Kernel 의 source
에 /usr/src/linux 란 link 를 걸어 두도록 한다.
# modprobe videodev
# modprobe spca5xx
3. Webcam View, Image Capture Tool 설치
Webcam View 에는 gqcam, xawtv 등을 주로 사용하는데 여기에서는 xawtv 를 이용하여 구축하도록
한다. xawtv 는 리눅스 데스크탑의 TV 튜너를 이용할 수 있는 소프트웨어로 알아져 있다.
하지만 Webcam 에 대한 다양한 기능을 제공하고 있기 때문에 이를 이용하면 인터넷 화상 감시 시스템
을 손쉽게 구축 할 수 있다.
# tar xzvf xawtv-3.94.tar.gz
# cd xawtv-3.94
# ./configure
# make
# make install
그럼 /usr/local/bin 에 xawtv, motv, streamer, webcam 등 몇가지 명령어 들이 설치가 되어 있을 것
이다.
xawtv, motv 는 USBCAM 이 설치된 리눅스의 X 에서 CAM 화상을 볼수 있는 명령어 이다.
# xawtv
# motv
streamer 는 CAM 의 화상을 Image 혹은 동영상으로 저장하는 명령어 이다.
간단한 사용 방법은 다음과 같다.
# streamer -o foobar.ppm : 현재 화상을 foobar.ppm 파일을 이미지 캡쳐를 한다.
# streamer -t 10 -r 2 -o foobar00.jpeg : 2초 간격으로 10프레임의 화상을 연속으로 캡쳐한다.
저장 파일 이름은 foobar00.jpeg ..foobar10.jpeg 식으로 저장된다.
# streamer -t 0:30 -O soundtrack.wav -F stereo : 30초 동안 음성을 Stereo 로 저장한다.
단 이는 음성 지원 CAM 일 경우에 해당한다.
# streamer -t 0:30 -o movie.mov -f jpeg -F mono16 : quick time movie 방식의 저장
# streamer -t 0:30 -s 352×240 -r 24 -o movie.avi -f mjpeg -F stereo
# lav2wav +p movie.avi | mp2enc -o audio.mp2
# lav2yuv +p movie.avi | mpeg2enc -o video.m1v
# mplex audio.mp2 video.m1v -o movie.mpg
화상내용을 avi 로 캡쳐하여 mpg 동영상 파일을 만드는 절차이다.
인터넷 실시간 화상 감시 시스템의 구축에 필요한 명령어는 webcam 이란 명령어 이다.
webcam 이란 명령어는 정의된 시간 간격으로 화상 이미지를 캡쳐 하여 정해진 웹 서버로 이미지를
FTP 전송하도록 하는 기능을 한다.
webcam 명령어를 이용하기 위해서는 .webcamrc 란 설정 파일이 필요하다.
아래 설정은 인터넷 실시간 화상 감시 시스템에 필요한 설정 예제이다.
~/.webcamrc
———————————————————————————————-
[ftp]
host = www.webserver.xxx
user = ftp id
pass = ftp password
dir = /www/webcam # cam image file 이 전송될 디렉토리이다.
file = webcam.jpeg # 파일 이름
passive = 1
debug = 1
auto = 0
local = 0
# local 설정은 웹서버가 USB CAM 이 설치된 서버가 아닌 경우에 0 이라 설정한다.
# 만일 웹서버가 USB CAM 이 설치된 시스템에 구축 되어 있으면 1 이라 설정한다.
[grab]
device = /dev/video0
text = “www.syszone.co.kr %Y-%m-%d %H:%M:%S” # CAM 이미지에 표기된 문장이다.
width = 320
height = 240
delay = 2
input = 0
norm = 1
rotate = 0
top = 0
left = 0
bottom = 240
right = 320
quality = 80
trigger = 0
once = 0
————————————————————————————————
이제 webcam 명령을 실행하도록 하자 webcam 명령을 실행 하면 기본적으로 실행 권한 유저의 홈폴더
밑에 있는 .webcamrc 파일을 참조한다. 만일 특정 위치에 있는 설정 파일을 참조 시에는 webcam 명령
뒤에 설정 파일 절대 경로를 적어 주도록 한다.
# webcam
————————————————————————————————
[ftp]<< 200 Type set to I
[ftp]<< ftp>
[ftp]>> umask 022
[ftp]<< umask 022
[ftp]<< 500 ‘SITE UMASK’ not understood
[ftp]<< ftp>
video4linux webcam v1.5 – (c) 1998-2002 Gerd Knorr
grabber config:
size 320×240 [24 bit TrueColor (LE: bgr)]
input 0, norm 1, jpeg quality 80
rotate=0, top=0, left=0, bottom=240, right=320
ftp config [ftp]:
www@www.syszone.co.kr:/www/webcam
uploading.jpeg => webcam.jpeg
————————————————————————————————
이제 해당 웹 서버로 가서 webcam.jpeg 파일이 생성 되었는지를 확인한다.
정상적으로 작동하면 이제 webcam 실행 시 콘솔에 뿌려지는 log 를 숨기고 background 로 동작하도록
한다.
# webcam > /dev/null 2> /dev/null &
4. 실시간 웹캠이미지 확인 웹 프로그램
이제 웹서버에 지정 시간 간격으로 웹캠이미지가 전송이 되어 질것이다. 이를 인터넷에서 확인하면
된다. 하지만 기본적으로 브라우져에서 같은 파일의 경우 브라우져 캐싱에서 파일을 로딩함으로
변경되는 상황이 적용되지 않을 것이다. 이런 문제를 해결하기 위해 xawtv 에서는 webcam.cgi 이라는
perl cgi 를 제공한다.
하지만..이는 Mozilla 기반에서는 정상 작동하고 windows 의 explorer 에서는 새로고침을 계속 눌려
줘야 이미지가 변경된다. 일단 기본 제공되는 webcam.cgi 에 대해 살펴 보도록 하자.
webcam.cgi 는 xawtv 의 source 에 scripts 디렉토리에 포함되어 있다. 이를 웹서버의 cgi 가 해석이
가능한 위치에 올려 놓고 몇 가지 변수를 해당 시스템에 환경에 맞게 변경한다.
# vi webcam.cgi
————————————————————————————————
#!/usr/bin/perl
use strict;
# config
my $IMAGE = “/www/webcam/webcam.jpeg”; # 이미지 파일 위치
my $MAXSEC = 360; # 10분이 지나면 전송이 종료되게 함.
##############################################
undef $/;
$|=1;
my $BO = “wrdlbrmpft”;
my $serverpush = ($ENV{HTTP_USER_AGENT} =~ /^Mozilla/ &&
$ENV{HTTP_USER_AGENT} !~ /[Cc]ompatible/);
my $start = time;
my @st = stat($IMAGE) or die “stat $IMAGE: $!”;
my $mtime = $st[9];
if ($serverpush) {
print “Content-Type: multipart/x-mixed-replace;boundary=\\”$BO\\“\\r\\n”;
print “\r\n”;
print “\r\n–$BO\r\n”;
}
for (;;) {
# read image
open IMG, “<$IMAGE”;
my $image = <IMG>;
close IMG;
# send it
print “Content-Type: image/jpeg\r\n”;
printf “Content-Length: %d\r\n”,length($image);
print “\r\n”;
print $image;
last unless $serverpush;
# send multipart border
if (time – $start > $MAXSEC) {
print “\r\n–$BO–\r\n”;
last;
} else {
print “\r\n–$BO\r\n”;
}
# wait until there is a new image
foreach my $i (1 .. $MAXSEC) {
sleep 1;
@st = stat($IMAGE);
if ($st[9] != $mtime) {
$mtime = $st[9];
last;
}
}
}
exit;
————————————————————————————————
위 webcam.cgi 는 다소 많은 부하를 유발하며, 브라우져의 제한이 있기때문에 사용을 권장하지는
않는다.
아래 java scripts 와 php 를 이용하여 리소스 소모량도 적고, 어떤 브라우저에서도 잘 동작하는
코드를 공개한다.
# vi webcam.html
————————————————————————————————
<html>
<head>
<script language=”JavaScript”>
<!– hide code
window.onerror = myOnError
function myOnError() {
return true
}
var t = “2” // 2초 간격으로 이미지를 refresh 한다.
function startClock(){
t–;
document.form1.countdown.value = t;
if (t < 1) {
reloadImg();
t=”2″; // 2초 간격으로 이미지를 refresh 한다.
}
timerID = setTimeout(“startClock()”, 1000)
}
function reloadImg() {
window.status = “이미지 갱신중 …”;
uniq = new Date();
uniq = “?”+uniq.getTime();
newImage = new Image(320,240);
newImage.src= “http://syszone.co.kr/webcam/webcam.jpeg” + uniq; // 이미지 경로
window.document.images.imgToLoad.src = newImage.src;
window.status = document.images.imgToLoad.src;
}
// end hide –>
</script>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<meta http-equiv=”Content-Style-Type” content=”text/css”>
<title>Syszone Web Cam ( 회사 )</title>
</head>
<body bgcolor=”#E5E5E5″ text=”#000000″ link=”#006699″ vlink=”#5493B4″ onload=”startClock()”>
<span class=”gen”><a name=”top”></a></span>
<table width=”100%” border=”0″ cellspacing=”0″ cellpadding=”10″ align=”center”>
<tr>
<td class=”bodyline”>
<table width=”100%” border=”0″ cellspacing=”0″ cellpadding=”0″>
<tr>
<td align=center>
<br><p>
<form name=”form1″>
<img src = “http://syszone.co.kr/webcam/webcam.jpeg” name = “imgToLoad” width = “320” height = “240”><br>
<span class=”mainmenu”>웹캠이미지는 <input name=countdown type=text size=2 value=””>초 후에 자동으로 갱신됩니다.</span>
</form>
<br><p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
————————————————————————————————-
지금까지 방법으로 인터넷 실시간 화상 감시 시스템을 구축 할 수 있을 것이다. 하지만 보다 시스템의
안정성을 고려하여 마지막으로 Ram disk 를 이용하여 2초 간격으로 계속 갱신되는 webcam.jpeg 이미지
가 저장되는 공간을 만들어 보도록 하자.
이는 같은 파일이름으로 같은 block 가 같은 크기의 파일이 계속 반복해서 갱신되면 해당 block 에
bad 가 생길 확률이 매우 높아 지므로 webcam.jpeg 가 생성되는 파일 시스템을 ram memory 공간에
생성되도록 함으로 성능과 안정성을 높일 수 있을 것이다.
5. Ram disk 에 Webcam 이미지 생성 공간 만들기
램디스크는 다음과 같이 잡는다.
램디스크 마운트할 곳 방만든다.
# mkdir -p /home/xxx/www/webcam
램디스크를 포멧한다.(약 4메가)
# mkfs -t ext3 /dev/ram0
램디스크를 마운트 한다.
# mount /dev/ram0 /home/xxx/www/webcam
/home/xxx/www/webcam 폴더의 퍼미션을 ftp 로 업로드 가능하게 조정한다.
# chown ftpuser. /home/xxx/www/webcam
인터넷 실시간 감시 시스템 구축에 대한 기술 정리를 마치도록 한다.
4 Responses
2uncontrollable
… [Trackback]
[…] Find More on to that Topic: nblog.syszone.co.kr/archives/1982 […]
… [Trackback]
[…] Read More Info here to that Topic: nblog.syszone.co.kr/archives/1982 […]
… [Trackback]
[…] Here you will find 386 more Info to that Topic: nblog.syszone.co.kr/archives/1982 […]