...

RaspberryPi 監視カメラの可能性:出席確認

by user

on
Category: Documents
8

views

Report

Comments

Transcript

RaspberryPi 監視カメラの可能性:出席確認
平成 26 年度卒業研究論文
RaspberryPi 監視カメラの可能性:出席確認
近畿大学工学部
情報システム工学科情報メディアコース
和泉大介
学籍番号:1010960070
目次
1. 研究の背景と目的
1.1 RaspberryPi とは
1.1.1 RaspberryPi のハードウェア
1.1.2 RaspberyyPi のソフトウェア
1.1.3 RaspberryPi を windows でリモート操作する
1.2 RaspberryPi の実用例
1.3 IoT とは
2. RaspberryPi を使う上で知っておきたい知識
2.1 sudo
2.1.1 sudo のリスクとメリット
2.2 パッケージマネージャー
2.2.1 パッケージマネージャに必要な要素
2.3 Apache
2.3.1 Apache とは
3. システム設計
3 環境構築
3.1 CGI の導入
3.1.1 Apache の設定
3.1.2 CGI
4 機能
4.1 動作を確認し自動撮影
4.2 ブラウザで現在の撮影状況を確認
4.3 ブラウザで撮影した画像確認
5.まとめ・考察
6.謝辞
7.参考文献・引用
8. 付録(ソースコード)
1. 研究背景と目的
インターネット利用者が日本の人口の 80%となっている現在,世代を問わず PC が必要不可欠
になっている.それに伴いパソコンの値段は下がりインターネットを利用するのであれば 5 万円
あれば充分なスペックのものが手に入るようになた.しかし,中高生が自分で購入するには高す
ぎる値段なのには変わりない.RaspberryPi はそういった PC でプログラミング制御したい人など,
高すぎて自分専用の PC が手に入らないといった人や,研究などで PC に色んなものをダウロー
ドした事で今の開発環境に悪影響を及ぼしたくない人にはうれしいハードウェアである.その安
価な PC を使って何か役に立つものはできないかと思いついたのでこの研究に取り組んだ.
今回研究する目的として,近畿大学の研究室は教授とゼミ生の部屋が別れていることが多いた
め教授がゼミ生の出席状況を自分の研究室にいながら把握するのはできない現状である.なので
RaspberryPi の機能を生かしてブラウザを使ってリアルタイムでゼミ生のいる研究室の状況を把握
できれば教授の研究の妨げにならないようになるのではないかと考え出席確認という点に着目し
た.
1.1 RaspberryPi の概要
RaspberryPi(ラズベリーパイ)とは,ケンブリッジ大学のエンジニアの人達が制作したもので,
低コストであり,クレジットカードサイズのコンピュータである.スクラッチや Python のよう
な言語でのプログラミング方法を学ぶためすべての年齢の人が使える小さなデバイスである.
RaspberryPi はインターネット閲覧や高精細ビデオの再生から,表計算,ワープロ,ゲーム作成ま
で,デスクトップパソコンができるすべて事が出来る.
図 1 RaspberryPi 接続前
[5]
図 2 RaspberryPi 接続後[6]
1 電源・2 HDMI・3 ランケーブル・4USB・5 SD カード(図 3)
図 3 接続場所を数字に見立てたもの
1.1.1 RaspberryPi のハードウェア
RaspberryPi は CPU プロセッサコアとして 700 MHz の ARM1176JZF-S、GPU に VideoCore IV、
当初出荷分は 256MB、後の出荷分は 512MB に増量した DRAM を内蔵した Broadcom BCM2835
SoC を搭載している[10].Soc(System-on-a-chip)とは,ある装置やシステムの動作に必要な機能の
すべてを、一つの半導体チップに実装する方式[11]のことで,RaspberryPi に搭載されている Soc の
BCM2835 の性能はコストを重視したスマートフォン程度である.
1.1.2 RaspberryPi の OS
RaspberryPi の OS には Linux を使用して走らせる事を意図しているため,Debian をカスタムし
た Raspbian の仕様が推薦されている[10].Raspbian の他の OS との違いとして,RaspberryPi を使用
している人達が簡単にインストールできるようコンパイルされた 35000 以上のパッケージが付属
されているという点がある[7].
1.1.3 RaspberryPi を windows でリモート操作する
RaspberryPi を windows でリモートそうするまでの過程として,
1・RaspberryPi の LXTerminal で「ifconfig」の命令を行うことによって RaspberryPi の IP アドレス
を確認する.
2・先ほどと同じく LXTerminal を使い「sudo apt-get install xrdp」という命令を実行し RaspberryPi
に xrdp をインストールする.xrdp とは,RDP(Remote Desktop Protocol)プロトコルのフリーかつ
オープンソースのサーバーである.[9]
3・windows にはじめから搭載されているリモートデスクトップを使い過程 1 で確認した IP アド
レスを入力する(図 4).
図 4 リモートデスクトップ Windows での設定画像[8]
4・リモート接続確認の注意が出てくるのではいを選択する(図 5).
図 5 リモート接続許可の確認画面[8]
5・RaspberryPi のアカウント名とパスワード入力画面が出てくるので入力する(図 6).
図 6 Windows でリモート接続した RaspberryPi のログイン画面[8]
6・RaspberryPi のホーム画面が確認できれば接続成功である(図 7).
図 7 RaspberryPi をリモート接続した Windows の画面[8]
1.2 RaspberryPi の実用例
・天気ステーション
RaspberryPi を使って降雨から風速まですべて記録するように RaspberryPi にプログラムできる.
そこからさらに,気象情報を掲載したウェブサイトを自動的に更新するように RaspberryPi をプ
ログラムすることも可能である.
・デジタルフォトフレーム
家電量販店で高価なデジタルフォトフレームを買う代わりに,半分のコストで 2 倍の機能を持
つ製品を RaspberryPi で作ることができる.機能としては,写真だけでなく動画,音楽,天気予
報なども表示可能である.
1.3 Iot とは
2. RaspberryPi を使う上で知っておきたい知識
2.1 sudo
RaspberryPi を使う上で LXterminal という RaspberryPi にソフトウェアをインストールさせたり,
そのソフトウェアをアップデートする為に必要なコマンドプロンプトがあり,その LXterminal を
使う際,命令の最初にほとんどの場合 sudo を使っていたので気になり調べるに到った.
2.1.1 sudo のリスクとメリット[3]
パソコンのセキュリティ上 root 権限または root パスワードを一般ユーザーに与えるのは大変危
険なことである.しかし,正当な理由があって root 権限下での処理を実行する必要に迫られた一
般ユーザーが出てきた場合はどうすればいいか.そうした問題には非常に簡単に解決できる方法
がある.sudo を使えば,root パスワードを公開することなくアクセス範囲を最小限化した上で必
要な権限を一般ユーザーに与えることができるのである.
sudo(superuser do の略)は,管理権限を制限付きでほかのユーザーに与えるためのプログラム
で,実際これで許可される権限では事前の指定範囲内のコマンドしか行えないようになっている.
また sudo で行われる操作はすべてオーディットトレール(追跡記録)に残されるので,仮にこ
うしたユーザーが何らかの方法で権限外の処理を行ったとしても,システム管理者がログ記録を
確認すれば問題点の特定と修正が行えるはずである.そのほかに sudo 設定を介して複数のホス
トに与える権限を中央管理するという使い方も可能である.
sudo のインストールおよびホストの設定が完了すると,指定されたユーザーは「sudo
aForbiddenCommand」という構文を用いることで,新たに許可された範囲のコマンドを実行でき
るようになる.sudo の実行には root 用とは別のパスワード入力が必要とされているが,これは端
末から目を離した隙に第三者が不正使用することを防止するための措置である.また sudo によ
り本来の権限を越えた操作を許されたユーザーであっても,各自の欲しいままにシステムを自由
に操作できるという訳ではなく,あくまでシステム管理者が sudo 設定で許可した範囲内でしか
コマンドを実行できないため,システムがダメージを受けるリスクは最小限化できると考えられ
る.
sudo の設定で注意すべき点は,想定の範囲外の権限を与えないようにすることである.当然な
がら su の実行を許してしまうと,実質的にそのユーザーに root 権限を与えたのと同じになる.
ある意味こうしたものは明白な設定ミスと見なせなくもないが,それよりも厄介なのは,ある程
度の経験を積まないと気づきにくい形で小さな罠が隠されていることである.例えば「sudo
less」を実行できるユーザーがコマンドを使うと,そのほかのコマンドを root 権限で実行可能と
なってしまう場合がある.いずれにせよコマンドへのアクセス設定に関しては慎重な姿勢で対処
するのが重要であり,SANS Institute などのセキュリティ問題を扱ったサイトを参考にして,こ
の種類のリスクにおいてどのような脆弱性や手口が確認されているかをチェックしておくべきで
ある.
そのほかに犯しやすい単純なミスとしてコマンドを相対パスで指定するというものがあり,あ
る程度の知識を有すユーザーであれば,これを糸口にしてすべての権限を取得されかねない.例
えば FOO というエイリアスに bin/foo と設定したとしよう.その状況下においてあるユーザーが
適当な場所に bin ディレクトリを作成して,その中に自分が実行したいコマンドを格納しておく
と(ここでの重要なポイントはその名称を foo としておくこと),これを root 権限下で実行する
ことであらゆる操作が行えるようになってしまう事がある.
残念ながら,一般のユーザーがいわゆる特権昇格(privilege escalation)を行う手口を見つけて
不正に root 権限を取得してしまうような事態はあり得ないと保証することはできないのだが,特
定ユーザーにのみ上位のアクセス権限を必要とする一部の操作だけを許可するという処理を簡単
に実行できる現実的な手法は,sudo のほかに存在していないのである.
このように sudo の使用にはある程度のリスクが伴うが(その大部分は設定時のミスで余分な
権限まで与えることに関連している),指定ユーザーに通常以上の権限を与えて特定タスクの実
行を許すといった柔軟なシステム運用を可能にしてくれる存在という点には間違いがないといえ
る.
2.2 パッケージマネージャー
パッケージマネージャとは、コンピュータに何のソフトウェアがインストールされたかを記録
し、新しいソフトウェアのインストール・新しいバージョンへのソフトウェアの更新・以前イン
ストールしたソフトウェアの削除を容易に行えるようにするプログラムである。名前が示すよう
に、パッケージマネージャはパッケージを取り扱うということである。パッケージとは、ファイ
ル群を一つにし、インストールや削除をまとめてできるようにしたものである。RaspberryPi の
アップデートを行う際に,パッケージマネージャーが使用されているため,調べるに到った.
2.2.1 パッケージマネージャに必要な要素[4]
・パッケージマネージャに必要な要素としてパッケージのバージョン管理
・パッケージをそろえる事で同じ環境が再現できる.
・パッケージのインストール/アンインストール
・パッケージのアップグレード/ダウングレード
・パッケージ間の依存関係の管理
まず,パッケージのバージョン管理について,パッケージと呼ばれる単位に何らかのバージョ
ン識別子をつけて,中身を細かく比べることなく更新を知ることができるようにする.もしバー
ジョンの概念がないと,git や svn(Subversion)のような管理システムなしにソースコードを管理す
るようなものでそれはとてもできないことだといえる.
パッケージをそろえることで同じ環境が再現できることについて,同じ環境を再現するために
は様々なバージョンのパッケージをホスティングされる方法も柔軟に指定できることが必要であ
る.パッケージは大体の場合自分が開発したもの意外を使うわけだが,そのものをどうやって入
手すればいいかということを含めて確保しておかなければ,たとえ入っておかなければならない
パッケージとリストがあったとしても入手できずインストールできなくなってしまう.
パッケージのインストール/アンインストールについて,通常のパッケージ管理というと,イ
ンストールができることを指すことが多いと思われる.もちろんパッケージとバージョンを指定
したら,その OS 上で使うことができる様にインストールしてくれるのは大事な機能である.イ
ンストール時にはコンパイル済みのバイナリを配置するだけのものもあればその場でコンパイル
するものもある.もちろん,先の依存関係に基づいて必要なパッケージも同時にインストールし
てくれる必要もある.難しいのはそれを再起的に解決しなければならないところである.アンイ
ンストールは色々と気をつけなければならない点がある.なので標準では実装していないパッ
ケージ管理もある.気をつけなければならない点として,例えばプロセスが起動するようなパッ
ケージだとプロセスを止めないといけないなど,先の依存関係で自分が誰かに依存されてる場合
は,それらのパッケージもアンストールしないといけない点である.さらに,インストール前に
あるファイルを変更するようなパッケージの場合,完全にアンインストールするためにはその一
行をきれいに消さなければいけないが,一行消すのはかなりの手間が掛かってしまう.
パッケージのアップグレード/ダウングレードについて,yum update と打てば一回で最新のパッ
ケージ群にしてくれるのは一般の人とってはとても頼もしいものである.これができるためには,
バージョン,依存関係,インストールとすべてできる必要がある.ダウングレードはアンインス
トール以上に難易度が高い.なぜならほとんどの開発者がアップグレード方法に気は使うが,ダ
ウングレード方法には普通気を使わないためである.
パッケージマネージャ間の依存関係の管理について,バージョンを持ったパッケージ間に依存
関係を記述できるようにすることである.あるバージョンのパッケージ A を使うためには,バー
ジョン何とか以上のパッケージ B が必要になるような感じである.使う側が完全に依存を把握で
きていて順番を定義可能であったら,パッケージ関係において依存関係の記述はいらないと考え
られる.だが,パッケージ管理では色んな人が作ったパッケージを組み合わせることが多いわけ
であり,そうなると他人の作ったパッケージの中に自分が依存するパッケージ記述するほうが効
率が良いと考えられる.
3.システム設計
4.環境構築
4.1CGI の導入
4.1.1Apache の設定
・Apache のインストール
図1のように打つことにより Apache をインストールできる。
図 1 Apache を導入するための命令
・Apache の設定
/etc/apache2/mods-available/mime.conf の AddHandler cgi-script .cgi(図 2)のコメントアウトをはずす
ことにより CGI を使えるようにする。
図 2 #AddHandler cgi-script .cgi の#をはずす前
docroot で cgi を利用できるようにする
/etc/apache2/sites-available/default を編集して /var/www/(図 3 の 10 行目) の設定に「 +ExecCGI」を
追記する(図 3)。
図 3 10 行目に「+ExecCGI」を追記した後の設定
これで設定完了したので図 4 の命令を実行して Apache を再起動する。
図 4 Apache を再起動する命令
3.1.2CGI
図 5 のように命令を実行することにより leafpad を開いた後 test.cgi の名前でファイルを作成する
図 5 ディレクトリを指定して leafpad を開く命令
図 6 の命令を実行して test.cgi を実行可能にする
この作業をしないとブラウザで確認した際 InternetServerError がでる。
図 6 chmod を使って test.cgi を実行可能する命令
図 7 のように test.cgi にプログラムをかくことによりブラウザ上に図 8 のように HelloWorld!と表示さ
れる。
図 7 ブラウザに HelloWorld!を表示させるためのプログラム
図 8 CGI を使ってブラウザ上に HelloWorld!を表示したもの
・CGI を使ってディレクトリ内の画像一覧を表示する
監視カメラとしてやく立てるためには motion を使って撮影できた画像を一覧としてブラウザで
確認できればいいと考えディレクトリ内の画像一覧を取得できるプログラムを作成した。
/var/www/motionImage の中にある画像をブラウザ上に表示する。図 9
図 9 ブラウザに表示するための画像一覧
次に図 10 にあるプログラミングを打つことによりブラウザに画像一覧図 11 が表示される。
プログラミング言語はシェルスクリプトを使用する。図 11 の画像は同じに見えるが違う画像で
ある。
図 10 ブラウザにディレクトリ内にある画像を表示するためのプログラム
図 11 ブラウザ上にディレクトリ内の画像を表示
4.機能
4.1 動作を確認して自動撮影
RaspberryPi には motion という名前のパッケージがあり,それをインストールすることにより
USB カメラや純正カメラ(カメラモジュール)を入力装置として使うことができるようになる.
motion とは,カメラからの映像に動き(変化)があったときにのみその映像または画像を記録する
ことができる.
3.2 ブラウザで現在の撮影状況を確認
motion の機能の一つとしてブラウザでリアルタイムに撮影している映像を 1 秒ごとに表示する
という機能がある.ブラウザで確認するための方法はブラウザを起動後 url に http://{RaspberryPi
の IP アドレス}:{設定したポート番号}を入力するとログイン名とパスワードを聞かれるので
そこの欄に RaspberryPi のユーザー名とパスワードを入力すればブラウザに表示される。
3.2.1 ブラウザごとの挙動
ブラウザごとに motion での撮影状況の確認画面が変わるため有名なブラウザの挙動をまとめる.
・Chrome
Chrome では URL を入力後応答なし.
図 3 Chrome で motion を確認しようとした結果
・IE
ログイン名・パスワードの確認画面はでるがその後応答なし.
図 4 IE で motion を確認しようとした結果
・Firefox
ログイン名・パスワードを聞かれその後ブラウザで確認できた.
図 5 Firefox で motion を確認した結果
確認したのは上記の 3 つのブラウザで他のブラウザでの確認は行っていない.
4.3 ブラウザで撮影した画像確認
撮影された画像は図のように保存されその保存されたものをブラウザで表示できるようにする
図.
図では図で表示された画像がスライドショーのような形で表示される.
図の機能として①で画像をスライドする速度を変える 100 単位で 100~1000 まで変更可能.②
を押すことによって画像のスライドをスタートすることができる.③で画像のスライドをとめる
ことができる.④が表示されている画像をスライドさせている部分である.注意点として,①の
スピードを変更する際に一度③のボタンを押して画像のスライドをとめてからでないとスピード
が変更されない.
5.まとめ・考察
今回開発したものは出席確認としては最低限の機能はしっかりと備わったものが開発できた.
しかし,更に機能を追加して精度や機能の充実度を上げることは可能である.たとえば,保存し
た画像を1日ごとに別のフォルダに自動で移しメインのフォルダの中身は1日ごとにリセットさ
れるや日付ごとにブラウザで表示するなどが考えられる.まだまだ可能性はあったので自分の力
不足であまり充実でき無かったことは大変残念である.
この機能が完成すれば学生は少し窮屈な思いをするかもしれないが,教授にとってはかなりの
負担削減にはなると考えられる.
6.謝辞
7.参考文献
[1]サービスをセキュアにするための利用制限(3)~管理者権限の制限のための su と sudo の基
本~
http://www.atmarkit.co.jp/ait/articles/0311/05/news001.html
[2]Sudo in a Nutshell
http://www.sudo.ws/sudo/intro.html
[3]ユーザーの実行権限を柔軟に割り当てる sudo のリスクとメリット
http://www.itmedia.co.jp/enterprise/articles/0802/19/news013.html
[4]若者がパッケージ管理について思うこと
http://blog.riywo.com/2012/03/29/043426
[5]
http://arctica.sakura.ne.jp/cent/wp-content/uploads/2012/12/R7568308-01.jpg
[6]初回起動と初期設定
http://www.hiramine.com/physicalcomputing/raspberrypi/setup_firstbootandconfig.h
tml
[7]Welcome to Raspbian
http://www.raspbian.org/
[8]RaspberryPi で遊ぼう
http://assimane.blog.so-net.ne.jp/2013-05-12
[9]weblio 辞書
http://www.weblio.jp/content/xrdp
[10]RaspberryPi ウィキペディア
http://ja.wikipedia.org/wiki/Raspberry_Pi#.E3.83.8F.E3.83.BC.E3.83.89.E3.82.A6.E3.82.A7.E3.82.A2
[11]e-Words
http://e-words.jp/w/SoC.html
http://www.e-ark.jp/2013/05/08/raspberry-pi-%E3%81%A7-cgibash%E3%82%92%E5%8B
%95%E3%81%8B%E3%81%99/
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230751/
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231159/?ST=oss
http://raspberrywebserver.com/cgiscripting/writing-cgi-scripts-in-python.html
https://github.com/carloscrespog/Berries-DrEWE/blob/master/motion-mmalcam.conf
https://ubun12.wordpress.com/tag/motion-conf/
http://safe-linux.homeip.net/web/motion/motion-03.html
8.付録(ソースコード・RaspberryPi 設定)
8.1 motionImage.cgi
#!/bin/bash
echo "Content-type:text/html"
echo ""
echo '<!DOCTYPE html>'
echo '<html>'
echo '<head>'
echo '<meta charset=UTF-8>'
echo '<title>motionImage</title>'
echo '</head>'
echo '<style>
img{ display: block;
position: absolute;
top:50px;
left:30px;
width: 300px;
}
</style>'
echo '<body>'
files="/var/www/motionImage/*"
④
for filepath in ${files}
do
file=`echo $filepath | cut -c 9-45`
echo "<img src="${file}">"
done
read wait
echo '<div>'
①
echo '<input id="timeSlider" type="range" min="100" max="1000" step="100"
onchange="showValue()" />'
echo '<span id="showRange">0</span>'
②
echo '<button onClick="startSlideShow()">slide start</button>'
③
echo '<button onClick="stopSlideShow()">stop</button>'
echo '</div>'
echo '<script>'
echo 'var intervalTime = 200;'
echo 'document.getElementById("timeSlider").value=intervalTime ;'
echo 'document.getElementById("showRange").innerHTML = intervalTime;'
echo 'function showValue () {
intervalTime = document.getElementById("timeSlider").value;
document.getElementById("showRange").innerHTML = intervalTime;
}'
echo 'var photos = document.getElementsByTagName("img");'
echo 'var timer = null;'
echo 'var N = photos.length; //alert("N="+N);'
echo 'var n = 0;'
echo '//zBase = photos[N].style.zIndex;'
echo 'zBase = 100 ; //alert("zBase="+zBase);'
echo 'topZindex = 0;'
echo 'function nextPhoto(){
++topZindex;
photos[n].style.zIndex = zBase + topZindex;
n++ ; n = n % N;
}'
echo 'function startSlideShow(){
if( timer == null ){
timer = setInterval("nextPhoto()", intervalTime );
}
}'
echo 'function stopSlideShow(){
clearInterval(timer); timer = null;
}'
echo '</script>'
echo '</body>'
echo '</html>'
プログラムメモ書き
echo:引数に与えられた文字列を表示する。
files=”/var/www/motionImage/*”:files に motionImage 下のファイル名を代入する
for filepath in ${files}:${}で{}ないの変数の中身を出力するという命令なので変数 file の中に入れ
た files=”/var/www/motionImage/*”を filepath の中に入れるという
命令である。
for
do(正)
done(誤)
``バックコート:バックコートの中にある処理の結果を返すという意味で
cut:文字列を抜き出す命令
cut -c:-c は cut のオプションで指定した文字数をとりだすというものである。
file=`echo $filepath | cut -c 9-45`:file に filepath に入った画像のファイル名の 9~45 文字めまでを入
れるという命令になる
cut を利用した理由として<img src=”画像ファイル指定”>といった風にしたいのだが画像ファイ
ル指定の部分が「/motionImage/ファイル名」だと表示されるが「/var/www/motionImage/ファイル
名」うまく表示できなかった。なので cut を使い files に入れた/var/www/motionImage/ファイル名
の前の/var/www の部分以外を抜き出すよう設定した。
Fly UP