ラズパイで防犯カメラを作る!(PHPで外部から起動)

前回の記事で自宅カメラの動画をストリーミング再生できるようになりました。しかし、前回のままだとmjpg-streamerをずっと起動しておく必要があるので、セキュリティ的にも不安です。外出先から見たいときだけ起動して終わったら消せるようになると便利なので、今回はそれに挑戦します。

目的

  • WEBページ上に自宅カメラの動画を埋め込む
  • 読み込んだときに起動・ボタンで終了できるようにする(phpを使用)

準備

前回の記事のセットアップでmjpg-streamerが起動できるようになっていることが前提です。
WEBページでPHPを動かすので、サーバの設定とポート開放をしておきましょう。

方法

こんな感じでcamera.phpをサーバのCGIが動くディレクトリに作成します。

<html>
<head>
<title>Camera Streaming</title>
</head>
<body>
camera streaming.<br>
<?php 
 $output = shell_exec('/home/ppdr/mjpg-streamer/mjpg_streamer -b -i "/home/ppdr/mjpg-streamer/input_uvc.so -f 10 -r 320x240 -d /dev/video0 -y -n" -o "/home/ppdr/mjpg-streamer/output_http.so -w /usr/local/www -p 5555 -c ppdr:password"');
 ?>
 
 <iframe width="320" height="240" src="http://192.168.0.24:5555/stream_simple.html" scrolling="no" frameborder="0"></iframe>

<?php 
 if(isset($_POST['stop'])){
 $output = shell_exec('kill -9 `pidof mjpg_streamer`');
 }
 ?>
 <form action="cam.php" method="post">
 <input type="submit" name="stop" value="stop" style="width:50%; height:10%" />
 </form>
</body>
</html>

一つ目の<?phpで始まる部分でシェルスクリプトを動かし、前回と同じコマンドでカメラを起動しています。

パラメータに-bでバックグラウンドで実行、-pでポート番号を指定、-cでパスワードを設定しています。
サーバから起動するなら実行ユーザはwww-data等になります。そのままでは権限が無いのでカメラが起動できませんので、/dev/vido0の「その他のユーザ」の権限を追加しておきましょう。

sudo chmod o+rw /dev/video0

<iframe>は他のページを埋め込むタグです。アドレスとポート番号を指定し、stream_simple.htmlを指定します。
これはmjpg-streamerの動画だけのページです。

2つめの<?phpでボタンを押したときのコマンドを指定しています。mjpg-streamerの公式ドキュメントにあるコマンドそのままです。

こんな感じで見れました。

ラズパイとWEBカメラで動画ストリーム配信ができる!

こんにちは。最近パソコン周りを整理していたらWEBカメラを見つけました。前からラズパイを使って防犯カメラ的なものを作れたらいいなーと思ってましたので、今回はWEBカメラでストリーミングしてみようと思います。

目的

・WEBカメラをラズパイに接続する
・動画をストリーミング配信する

今回使うカメラはこちらです。たまたま家にあっただけで、USB接続のカメラならもっと安いのでもいいと思います。

ELECOM PCカメラ 200万画素 筒型 UCAM-DLA200Hシリーズ

MJPG-streamerのインストール

Linuxでストリーミング再生できるソフトである「MJPG-streamer」を使います。このソフトはapt-getでインストールできないらしいので、「Subversion」でインストールします。まず必要なソフトをインストールしておきます。

sudo apt-get update
sudo apt-get install subversion libjpeg-dev imagemagick

続いて「MJPG-streamer」を取得してインストールします。

svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
cd mjpg-streamer
make
sudo make install

ストリーミング配信してみる

まずはWEBカメラがラズパイにきちんと認識されているか確認します。

ppdr@raspberrypi:~ $ lsusb
Bus 001 Device 006: ID 14cd:125c Super Top SD card reader
Bus 001 Device 007: ID 056e:700a Elecom Co., Ltd 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Elecom…みたいな感じのカメラの名前が出ていれば認識されています。デバイスとしての名前も確認しておきましょう。

ppdr@raspberrypi:~ $ ls /dev

...
video0
...

私の名前はvideo0という名前で認識されました。どれがカメラかわからない方は抜いたり指したりして追加された名前を確認してみましょう。

次のコマンドでMJPG-streamerを起動しましょう。

cd ~/mjpg-streamer
sudo ./mjpg_streamer -i "./input_uvc.so -f 10 -r 320x240 -d /dev/video0 -y -n" -o "./output_http.so -w /usr/local/www -p 8080 -c ppdr:password"

-fはフレームレートで、1秒に何回動画を更新するかです。少ないほど通信量が小さくなります。
-rは動画のサイズです。あまり大きくしないほうが止まらずに見れます。
-pはストリーミングするポート番号です。webページやリモートデスクトップで使用している80や443など以外の番号ならなんでもいいでしょう。ポートが使用中だと次のようなエラーになります。

bind: Address already in use

WEB上に公開して誰でも見れてしまうとセキュリティ的に(プライバシー的に?)良くないので-cでパスワードをかけます。[ユーザ名]:[パスワード]で指定します。

エラーがでなければストリーミング配信が始まります。
ネットワークにつながっている他のPCのブラウザのアドレス欄に、[ラズパイのIPアドレス]:[ポート番号]を入力してエンターを押します。(例)192.168.0.7:8080

こんな感じのページに移動して、カメラの映像を見ることが出来ました!

使い道① 外出先から自宅カメラの様子を確認

防犯カメラ的な使い方をするなら、外出先から見れると便利です。その場合はVPN接続がおすすめです。ラズパイに外出先からVPNする方法は長くなるので次回解説します。

使い道② 動画をWEBに公開

動画を他の人に見てもらいたい場合は、

  • DDNSサービスを利用してラズパイに接続できるようにする
  • ルーターのポートを開放する

両方とも解説しているサイトが多数あるので、ここでの説明は割愛します。VPNで自分だけ見る場合はいいですが、外部に公開する場合はパスワードをきっちり設定しましょう。

RaspberryPi3のバックアップをmicroSDカードでとる(NOOBSユーザー向け)

こんにちは。先日ラズパイのmicroSDが死んでしまったので再インストールしました。ほんとにすぐ死んじゃう子です。実は以前にもいくつか投稿していたのですが、ファイルシステムが壊れて読み出せなくなってしまいました。

再インストールも楽じゃないので、今回はラズパイ3(Jessie)の完全バックアップを取りたいと思います。

目的

Raspbian Jessie(NOOBS環境)のmicroSDカードの完全バックアップを取りたい&定期的に自動でバックアップしたい。

用意するもの

  • バックアップ用のmicroSDカード(今使っているもの以上の容量)
  • カードリーダ(つけっぱなしにする予定なので小型のものが便利です。)
  • 動作中のラズパイ

方法

まずmicroSDカードのフォーマットを行いました。家に64GBのカードが余っていたのでそれを使いましたが、なんでもいいと思います。カードリーダに差してラズパイのUSBポートに接続します。フォーマットの方法もなんでも良いですが、ラズパイでやるならパーティション分けもできる「gparted」というソフトが使いやすかったです。標準では入っていないのでインストールしましょう。

sudo apt-get install gparted

フォーマットの形式はFAT32にしましたが、特になんでも良いと思います。

続いてカードのコピーを行います。Raspbian Jessieにはなんと動作中のカードを丸ごとコピーできるツールがデフォルトで入っています。簡単操作でパーティション作成からコピーまで全部自動でやってくれるすごいツールです。GUIで操作するので、画面左上のラズパイマークから、「アクセサリ」→「SD Card Copier」を選びます。

From Deviceには/dev/mmcblk0(←稼働中のSDカードです)、To Deviceにはバックアップ用カードを指定します。私の場合は/dev/sdaで認識されましたがここはUSBを指す順番等で変わるようです。
2つ選んだらStartを押すとコピーが始まります。32GBのカードをコピーしたので30分以上掛かってしまいました。その間CPUに負荷がかかって何もできないので、コーヒーを飲みながら動画を見たりして時間を潰しましょう。

SD Card Copierはとても簡単で便利なのですが、cronとかで定期的に実行したいと思ってもGUI操作しかできないようです。コマンドラインから使えそうなバックアップツールを探していたら「rsync」が良さそうでした。(ちなみにNOOBSじゃない人は「rpi-clone」を使うのが簡単そうです)。インストールします。

sudo apt-get install rsync

rsyncは稼働中のカードのrootディレクトリをコピーできます。毎回不要なファイルをコピーしないように、まず除外リストを書いておきます。

sudo nano /rsync-exclude.txt

/proc/*
/sys/*
/dev/*
/boot/*
/tmp/*
/run/*
/mnt/*
/var/tmp/*
/var/log/*
/media/*

書き終わったらrsyncを実行します。

sudo rsync -aEv --delete-during --exclude-from=/rsync-exclude.txt / /media/ppdr/root

最後のディレクトリはバックアップ用カードがマウントされている場所です。これまたバックアップに30分以上かかります。エラーが出ずに終われば成功です。最後にこれを定期的に実行するように設定しておきましょう。いつもどおりcronに登録するだけで完了です。

crontab -e

#毎週月曜日10時00分にバックアップを実行する
00 10 * * 1 sudo rsync -a --delete-during --exclude-from=/rsync-exclude.txt / /media/ppdr/root

-Eと-vは進捗を表示するやつですので外してしまいました。これでSDカード突然死の恐怖からも開放されます。(^O^)

参考にしたサイト

http://denshikousaku.net/backup-raspberry-pi