Ai-ballとラズパイで監視カメラを作った件(或いはphpによるストリームの中継)


Raspberry Pi 3 と Ai-Ballで監視カメラを作ります。

Ai-Ballとは、Trek2000が作った小型ワイヤレスカメラ。
2016年7月に、Amazonで7,000円台で買えました。

Wi-Fiを内蔵しており、撮影している映像をスマートフォンやPCで見ることが出来ます。
NATするなどしてインターネット側から通信出来るようにすれば、カメラに直接アクセスすることで遠隔地からも映像を見ることが出来ます。
しかし、自作のWebサービスなどに組み込もうとした場合は、これだとちょっと扱いにくいですね。

Ai-Ballには、これ自体に MJPG-streamerと思われるものが動いています。
家庭内の無線LANに接続して、1つの動画配信サーバとして扱うのがよろしいかと思います。

$ wget -S --spider Ai-Ball.ipAddr
HTTP による接続要求を送信しました、応答を待っています...
  HTTP/1.0 400 Bad Request
  Content-type: text/plain
  Connection: close
  Server: MJPG-Streamer/0.2
  Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0
  Pragma: no-cache
  Expires: Mon, 3 Jan 2000 12:34:56 GMT

環境

Raspberry Pi 3 raspbian

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 8.0 (jessie)
Release:        8.0
Codename:       jessie

ネットワーク
私の環境では、自宅に入ってきたネットワークは、まずルータに入り、そこからすべて無線で繋がったローカルエリアとなっています。
LAN内にはRaspberry Pi 3がおり、すでにWebサーバとして稼働しています。
ルーターから80番をNATすることRaspberry Piへは外からもアクセスが可能な状態です。(IPは固定)
この環境内に、Ai-Ballを追加します。
毎日ひとりで留守番している、飼い犬の様子を見るためにです。

Raspberry PiでApacheが動いている、また、屋外からRaspberry PiのHTTPにアクセス出来る環境は整っている前提とします。

Ai-Ballの設定

最初に電源を入れた時には、μAP(マイクロアクセスポイント)モードになっています。
Ai-Ball自体がWi-Fiアクセスポイントになり、そこに接続すると撮影した画像などを見ることが出来ると言うものです。
専用のアプリも、このモードで接続する前提で設計されています。
しかし、いちいちwi-fi設定を切り替える必要があり、また接続中は別のネットワークが使えないワケで、とても不便です。
Ai-Ballが既存のネットワークに繋がるようにします。

インフラストラクチャーモードに設定変更

インフラストラクチャーモードに設定することで、既存のWi-FiネットワークにAi-Ballを接続できます。
電源スイッチを一度OFFにしてからスパナマークの位置へ

この状態でSSID「Trek Ai-Ball」に接続し、192.168.2.1を開きます。
基本認証が掛かっています。同梱のマニュアルにあるIDとパスワードを入力します。
設定画面が現れるので、モードをインフラストラクチャーモードにして、既存のSSIDや接続に必要な情報を設定します。また、IPやPortをお好みのものにセットします。

LAN内でIPは固定されていた方が良いです。
私が使っているルーターはAirMac Extreamです。Ai-BallのMACアドレスを登録することで、DHCPアドレスの予約をすることが出来るので、それで固定しています。

この機能はたいていのルーターにあります。LAN内のIPアドレスを一箇所で管理できるので、この方法がおすすめです。もちろん、端末側で固定するように設定しても構いません。

以下、この記事では、Ai-Ballの設定を
ip 10.0.1.80
port 80
とした前提で書きます。

余談:ファームウェアアップデート

私が購入したものは、μAPモードでのWi-Fiの接続が不安定に感じましたので、ファームウェアをアップデートしました。
これにより、安定して動作しています。
最新のファームウェアは以下にあります。
http://www.thumbdrive.com/aiball/support.html
開封した際は4.5tと言うバージョンのファームウェアが入っていましたが、その時点で公開されていた最新版は4.8aでした。
アップグレードは、インフラモードへの設定変更で使った設定画面で、表示される指示に従って下さい。

動画の閲覧

無線LAN内では、

にアクセスすることで現在カメラが撮影している映像を見ることが出来ます。
動画はMotion JPEGで送られてきます。
画面のサイズは640 × 480です。
(action=appletvastreamで音声も配信出来るモードがあるのですが、ここでは割愛します。)

しかし、これでは家の外から見ることが出来ません。
直接NATすれば見ることは出来ますが、監視カメラのWebアプリとして構築したいです。
そこで、Webサーバが動いているRaspberryPiに中継して貰うことにします。

今回はAi-Ballの送ってくるMotionJPEGを、そのまま転送する方法をとります。
そのため、MotionJPEGが表示出来ない環境(IEとか)では、この映像を見ることは出来ません。
ChromeとかSafariでは、ちゃんと見ることが出来ます。

たとえばphpでは、こんな感じでストリームを中継するproxyとして動かす事が出来ます。

stream.php
<?php
//MotionJPEGをそのまま転送する(imgタグのsrcとして使うことを前提とする)
set_time_limit(0);     //タイムアウトさせない

// Ai-BallのIP
$aiballip = "10.0.1.80";
// Ai-Ballで設定したPort
$port = 80;
// 動画を見るためのURL
$path = "/?action=stream"; 

//Ai-Ballにソケットを開く
$streamingData = fsockopen($aiballip, $port, $errno, $errstr, 30);
if ($streamingData) {
     //動画URLを取得する
    $urlstring = "GET " . $path . " HTTP/1.0\r\n\r\n";
    fputs ($streamingData , $urlstring);
     //headerをそのまま転送する
    while ($str = trim(fgets($streamingData , 4096)))
    header($str);
     //データをただひたすらに転送する
    fpassthru($streamingData);
    fclose($streamingData);
} else {
     //エラー表示
    $errimg = imagecreatetruecolor(640,480);
    imagestring($errimg, 5, 5, 5,  'ERROR:' . $errno .' / ' . $errstr,
        imagecolorallocate($errimg,255,255,255));
    header('Content-Type: image/jpeg');
    imagejpeg($errimg);
}
?>

ちなみにContent-Typeは
multipart/x-mixed-replace; boundary=boundarydonotcross
です。

これを別のhtmlから読み込む際は、以下のように画像として表示するだけで大丈夫です。
(ChromeやSafariでは)

index.php
<IMG SRC="./stream.php">

lightbox.jsやcolorbox.jsなんかにも組み込みやすいですね。

Ai-Ballを使う利点

普通のUSB接続のカメラであれば1,000円以下で手に入るものもあります。
また、Ai-Ballは、RPiの標準カメラモジュールよりもさらに画質は悪いです。
それでもAi-Ballをあえて使う理由は、なんと言っても設置場所の自由度の高さです。
Wi-Fiが届く圏内であれば、RPiの置き場所に関係無くいくつもカメラを設置することが出来ます。

我が家のRPiには、(犬のための)温度センサーが繋がっていて室温や湿度を計測していますが、設置場所を動かすことなく、撮影場所を決められます。
我が家では、使用していなかった天井の引っ掛けローゼットに通常のコンセントがあったため、そこに設置しています。

USB給電アダプタにAi-Ballを両面テープでくっつけただけの簡単なものです。
5cmくらいの短いUSBケーブルがあったら付け替えたいと思っています。
この方法の利点は、壁の点灯スイッチでカメラを止められる事です。
家人が先に家に帰った際、簡単に撮影を停止出来、また、何の知識も無くても簡単に撮影を開始出来ます。
監視カメラを付けると言った際に発生するプライバシーに起因した家族の反対を、制止しやすい機能です
引っ掛けローゼットを普通のコンセントに変換するアダプタも、安価で販売されています。

また、複数台稼働も容易です。RPiに直接USB接続した場合のように、供給できる電圧やケーブル長の心配をする必要はありません。
ケーブリングを考えずに、部屋の両サイドから、あるいは複数の部屋を同時に監視するシステムも、容易に構築可能になります。

さらに(1時間強程度ですが)電池駆動も可能ですので、電波さえ届けば庭先やベランダなど、電源の確保しにくいところでも撮影が可能になります。

用途に応じて、ご検討下さい。

以下は後日、別記事にて。

一日のダイジェスト用にTimelapseも作る。

遠隔監視と言っても四六時中見つめているワケにも行きませんので、あとから見られるダイジェスト映像として一日分まとめたTimelapseも作りました。
cronで、あとからムービーを作る仕組みです。

動体検知をする

動いた!と思ったらお知らせするようにします。
しかし、一日見ててもおるすばん中の我が家の犬は「寝返り」くらいしか動きはありませんでした。