IoT(사물인터넷) 보안 2016년 2학기 4. 라즈베리파이 카메라
4. 라즈베리파이 카메라
파이 카메라 카메라 연결하기 흰색 커버를 들어올린 후 케이블을 밀어넣고 다시 커버를 닫음 고화질 FULL HD(1080p) 500만 화소 라즈베리파이 전용 카메라 흰색 커버를 들어올린 후 케이블을 밀어넣고 다시 커버를 닫음
파이 카메라 최신 버전 업그레이드 라즈베리 파이 설정에서 카메라 사용을 enable로 변경 사진 찍기 동영상 찍기 $ sudo apt-get update $ sudo apt-get upgrade 라즈베리 파이 설정에서 카메라 사용을 enable로 변경 $ sudo raspi-config $ 리부팅 사진 찍기 $ raspistill -o image.jpg $ raspistill --help 동영상 찍기 $ raspivid -o video.h264 $ raspivid --help
웹스트리밍 참고 사이트 폴더 생성 프로젝트 초기화 및 패키지 설치 소스 작성 http://thejackalofjavascript.com/rpi-live-streaming/ 폴더 생성 $ mkdir liveStreaming $ cd liveStreaming 프로젝트 초기화 및 패키지 설치 $ npm init $ npm install express socket.io --save 소스 작성 $ nano index.js $ nano index.html
소스 작성 Index.js Index.html var express = require('express'); var app = express(); var http = require('http').Server(app); var fs = require('fs'); var io = require('socket.io')(http); var path = require('path'); var spawn = require('child_process').spawn; var proc; app.use('/', express.static(path.join(__dirname, 'stream'))); res.sendFile(__dirname + '/index.html'); app.get('/', function(req, res) { }); var sockets = {}; io.on('connection', function(socket) { sockets[socket.id] = socket; console.log("Total clients connected : ", Object.keys(sockets).length); socket.on('disconnect', function() { delete sockets[socket.id]; // no more sockets, kill the stream if (Object.keys(sockets).length == 0) { app.set('watchingFile', false); if (proc) proc.kill(); fs.unwatchFile('./stream/image_stream.jpg'); } }); socket.on('start-stream', function() { startStreaming(io); http.listen(3000, function() { console.log('listening on *:3000'); function stopStreaming() { if (Object.keys(sockets).length == 0) { app.set('watchingFile', false); fs.unwatchFile('./stream/image_stream.jpg'); if (proc) proc.kill(); } } function startStreaming(io) { if (app.get('watchingFile')) { io.sockets.emit('liveStream', 'image_stream.jpg?_t=' + (Math.random() * 100000)); return; var args = ["-w", "640", "-h", "480", "-o", "./stream/image_stream.jpg", "-t", "999999999", "-tl", "100"]; proc = spawn('raspistill', args); console.log('Watching for changes...'); app.set('watchingFile', true); fs.watchFile('./stream/image_stream.jpg', function(current, previous) { }) <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Stream My Lab </title> <!-- Bootstrap CSS --> <link href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet"> <style type="text/css"> #stream { height: 99%; margin: 0px auto; display: block; margin-top: 20px; } </style> <!-- jQuery --> <script src="http://code.jquery.com/jquery.js"></script> <!-- Bootstrap JavaScript --> <script src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script> <script src="/socket.io/socket.io.js"></script> <script> var socket = io(); socket.on('liveStream', function(url) { $('#stream').attr('src', url); $('.start').hide(); }); function startStream() { socket.emit('start-stream'); </script> </head> <body class="container"> <h1 class="text-center">My Lab <small>Powered by PI</small> </h1> <hr> <button type="button" id="" class="btn btn-info start" onclick="startStream()">Start Camera</button> <div class="row"> <img src="" id="stream"> </div> </body> </html> Index.js Index.html <script src="/socket.io/socket.io.js"></script>의 주소를 https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js 으로 변경
웹스트리밍 하부 폴더 생성 실행 브라우저로 접속 $ mkdir stream (이미지가 저장되는 폴더) $ sudo node index.js 브라우저로 접속 로컬 접속 http://localhost:3000 원격 접속 http://IP주소:3000
비디오 서버 raspberry-pi-mjpeg-server 소스 복사 설치 서버 실행 서버 접속 https://github.com/john-doherty/raspberry-pi-mjpeg-server 소스 복사 $ git clone https://github.com/john-doherty/raspberry-pi- mjpeg-server 설치 $ cd raspberry-pi-mjpeg-server $ npm install 서버 실행 $ sudo node raspberry-pi-mjpeg-server.js -w 1280 -l 1024 서버 접속 Localhost:8080
사진 찍기 서비스 참고 사이트 소스 다운로드 설치 http://irisschaffer.com/taking-photos-with-raspberry-pi-socket- io/ 소스 다운로드 $ git clone https://github.com/irisSchaffer/rpi-socket- streaming.git 설치 $ cd rpi-socket-streaming $ npm install