RaspberryPi と暗視カメラを使ってハリネズミの常時監視をするためのメモ

![namauni.gif](https://qiita-image-store.s3.amazonaws.com/0/41678/0a9b6b65-ade7-604e-9d0b-e8896a7e7724.gif)


概要
----

* Raspberry Pi で常時監視+暗視可能な仕組みを作ったときのメモ
* ストリーミング配信は mjpeg 方式で 15～30 fps 出るようにする
* パブリックに公開するので、同時接続数が増えた時に Raspberry Pi が死なないようにプロキシサーバーを立てる


用意するもの
-----------

* Raspberry Pi Model B+ 以上

    ```bash
    $ uname -a
    Linux raspberrypi 4.1.18+ #846 Thu Feb 25 14:11:56 GMT 2016 armv6l GNU/Linux
    ```
* Raspberry Pi 用暗視カメラモジュール
    * たとえばこれ → [サインスマート Raspberry Pi用 赤外線カメラレンズ](http://www.amazon.co.jp/%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88-Raspberry-Pi%E7%94%A8-%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%AC%E3%83%B3%E3%82%BA-%EF%BC%92%E3%81%A4%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%83%A9%E3%82%A4%E3%83%88%E4%BB%98%E3%81%8D-%E6%9A%97%E8%A6%96%E7%94%A8-5MP/dp/B00MHKFPKG)
* プロキシ用サーバー
    * 自分しか見ないなら不要
    * さくらのVPS等、インターネットへの outbound traffic が従量課金ではないものが望ましい

### あると嬉しい

* Raspberry Pi に対する固定IP  
ポートフォワードで解決できなくもない


Raspberry Pi セットアップ
------------------------

### カメラモジュール

以下のサイトを参考にした
https://www.rs-online.com/designspark/raspberry-pi-camera

`sudo raspi-config` するとこまででOK。

### mjpg-streamer

1. mjpg-streamer の Raspberry Pi 用の Fork をコンパイル(make)  
https://github.com/jacksonliam/mjpg-streamer
1. `/opt/mjpg-streamer` 下にインストール(`make install` せずに単純にコピー)
    * ファイル群のオーナーを、実行ユーザー(仮に `pi` とする)に変更しておく
1. Systemd 用のファイルを作成  

    ```bash:/opt/mjpg-streamer/systemd/run.sh
    #!/bin/bash

    ROOT=/opt/mjpg-streamer
    AUTH_USER={Basic認証用のユーザー名}
    AUTH_PASS={Basic認証用のパスワード}


    cd $ROOT

    $ROOT/mjpg_streamer -i "$ROOT/input_raspicam.so -fps 15 -x 640 -y 480" -o "$ROOT/output_http.so -c $AUTH_USER:$AUTH_PASS"
    ```

    ```/etc/systemd/system/mjpg-streamer.service
    [Unit]
    Description=mjpg-streamer

    [Install]
    WantedBy=multi-user.target

    [Service]
    User=pi
    Group=pi
    ExecStart=/opt/mjpg-streamer/systemd/run.sh
    ```
1. サービスの起動

    ```
    # systemctl start mjpg-streamer.service
    ```

### 動作確認

ブラウザから `http://raspberrypi:8080/?action=stream` にアクセス

プロキシサーバーセットアップ
-------------------------

```bash
$ uname -a
Linux myproxy 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
```

1. [mjpeg-relay](https://github.com/OliverF/mjpeg-relay) を `/opt` 下に clone
    * submodule も初期化する
    * ファイル群のオーナーを、実行ユーザーに変更しておく
1. 実行
    * python 2.7 でしか動かないので注意

    ```bash
    $ python relay.py "http://{Basic認証用のユーザー名}:{Basic認証用のパスワード}@raspberrypi:8080/?action=stream"
    ```

<!--
1. Systemd 用のファイルを作成  

    ```bash:/opt/mjpeg-relay/systemd/run.sh
    #!/bin/bash

    ROOT=/opt/mjpeg-relay

    cd $ROOT

    python $ROOT/relay.py "http://{Basic認証用のユーザー名}:{Basic認証用のパスワード}@raspberrypi:8080/?action=stream"
    ```

    ```/etc/systemd/system/mjpeg-relay.service
    [Unit]
    Description=mjpeg-relay

    [Install]
    WantedBy=multi-user.target

    [Service]
    User={mjpeg-relay実行ユーザー}
    Group={mjpeg-relay実行ユーザーグループ}
    ExecStart=/opt/mjpeg-relay/systemd/run.sh
    ```
1. サービスの起動

    ```bash
    # systemctl start mjpeg-relay
    ```
-->

### 動作確認

ブラウザから `http://myproxy:54321/stream` にアクセス


成果物
------
http://namauni.com/timemachine
※過去の gif 動画になります


備考
----

mjpeg-relay は docker 化が可能なようだが、手元の環境では動かなかった。
`docker run` で python プロセスが立ち上がった時に、 [relay.py#L80](https://github.com/OliverF/mjpeg-relay/blob/master/relay.py#L80) の `except EOFError:` に入ってるっぽい。

因みにシェルスクリプトから実行しても同じ症状なので、せめて systemd でサービス化したかったけど諦めた。`python-daemon` 使ってほしい。