今回は夏の自由研究的な取り組みとして自宅にIP監視カメラを取り付けて、画像・動画データをファイルサーバ(Raspberry PiのNAS)に保存し、内部ネットワークのWindows端末から閲覧できるようにしたいと思います。

Raspberry Piの入門的な操作はしてみたものの、何をつくればよいのか?と活用法をお探しの方にもおススメです。

目標

  • カメラを設置して画像・動画を撮影する
  • 撮影した画像・動画を家庭内ファイルサーバに保存する
  • ファイルサーバをNAS化して家庭内の各端末から閲覧出来るようにする

基本的に家庭内LANは構築済みで、Raspberry Piもサーバとして起動している状態を前提として進めます。以降は、便宜上「ラズパイ・カメラシステム」と呼称します。

ラズパイ・カメラシステムの必要機材

今回はRaspberry Pi系で良く使われているカメラモジュールでは物足りなかったので、Wifiで接続できるIPカメラを購入しました。それ以外は、極力自宅の余りものを活用してシステムを構築しますので、モデルが若干古かったりしますが、ご了承ください。新しいものを使えるならその方が良いかと思います。

カメラ Ctronics CTIPC-245C1080PWS

カメラはAmazonで新調しました。200万画素で6000円台の割にレビューも良かったので、こちらを購入しました。実際の映像は夜中の赤外線カメラも明瞭で良かったです。

個人的グッドポイント

  • 200万画素で赤外線映像も良好
  • Wifi感度は割と良好
  • サポートのメール返事が早い(外国の方が頑張ってくれてる感はある)

個人的バッドポイント

  • 動画の形式が独自形式なので一般のプレイヤーで見れない
  • 設定がやや分かりにくい
  • 転送プロトコルがFTPのみ

Raspberry Pi B+

ちょっと古いですが、単純なNAS用途だけなら全く問題ありません。新しいRaspberrPiなら、なお良しです。NAS構築の際にRaspberry Piのバージョンによって一番問題化する点としては、供給電源量の問題です。この辺りは他に記載されているサイトもありますので、詳しくはそちらをご覧ください。

要点としては、古いRaspberr Pi は世代によってUSBの供給できる電力量が随分違います。古いタイプでHDDを起動しようとすると、電力不足で不安定になる可能性もあります。RaspberryPi上での設定変更(config)で、供給電源量を変更することも可能ですが、こちらも動作が不安定になる可能性もあるようです。

Raspberry Piモデル 電源供給量
Raspberry Pi 1 Model A 0.7 A(3.5 W)
Raspberry Pi 1 Model A+ 0.7 A(3.5 W)
Raspberry Pi 1 Model B 1.2 A(6.0 W)
Raspberry Pi 1 Model B+ 1.8 A(9.0 W)
Raspberry Pi 2 Model B 1.8 A(9.0 W)
Raspberry Pi 3 Model B 2.5 A(12.5 W)

出典:Wikipedia

ストレージに何を使うかによるのですが、大量データを登録する為にHDDを使用する場合は、SSDSDカードに比べて電力使用量が大きいのです。HDDやSSDによっても消費電力が異なりますので、準備段階で確認しておいた方が良いです。あくまで一般論としてですが、HDDに比べ、SSDは消費電力が1/3程度となります。(SDカードならもう少し少なく済む)

このRaspberry Piは昔セットアップしたものの、特に使い道も無くなって放置していたものなので、一応SSHでログインする程度までは設定済みのものです。

SDカード SanDisk 8GB

今回はそれほど大容量を必要としないので(IP監視カメラの画像・動画は1週間で消すので)、余ってたSanDiskのSDカード(8GB)を使うことにしました。(1週間程度の記録であれば結果的にこれで十分でした。)

SDカードなので消費電力少なく動作も安定しています。

SDカードアダプタ

こちらもSanDisk SDカードの付属品です。

microSDカード 16GB(SDHC)

今回SDカードを2枚使用しますが、このmicroSDカードはカメラ内に搭載用のカードです。こちらはSDカードではなくmicroSDカードです。

カメラ(Ctronics CTIPC-245C1080PWS)では、内部にmicroSDカードを搭載し動画などはいったんSDカードに溜める仕様のようです。

NASにデータ転送予定なのでSDカードの中はすぐ消えても構わないという判断で、今回は2GBの余っていたカードを使います。

カメラの仕様書をよく読むとSDHC・SDXCのみ対応との事でした。

一度2GBのSDカードで動いていたのですが、容量が一杯になると、古いデータから上書きされるはずが、データ破損され、以降はSDカードへの書き込み自体出来なくなりました。動画がSDカードに保存できなくなり、FTP転送もコケていました。

お手持ちのmicroSDカードが SDHC または SDXC であることを確認のうえ、ご利用ください。

カメラの画像ファイルは100KB程度なので、あまり大きなアロケーションユニットサイズにすると結構無駄が出ます。あまり小さくすると、大きなファイルを扱う際に遅くなる恐れもありますが、ここでは最小の4096byteとします。

ラズパイ・カメラシステムのシステム構成

上図の通りの単純な構成で、全てローカルネットワークに属します。監視カメラの設置場所までは、なんとか自宅のWifiが届いていました。監視カメラ・NASには内部からしかアクセスできません。

外部からも見たい用途が出てきたら、Raspberry PiからLINEにPushするなり考えようと思います。

カメラ設定手順

  1. カメラの組み立て
  2. 初期設定
  3. ネットワーク設定
  4. アラーム設定
  5. FTP設定

カメラの組み立て・設定

まずはカメラを箱から取り出してみます。

中身は上記で全てです。電源以外は、有線LANでも接続できるようケーブルもついていますが、今回はWifiを使いますので、電源のみのシンプル配線です。SDカードはカメラ内部の基盤に直接差し込むので、取り外しは結構面倒です。カメラにSDカードを入れて電源ケーブルを接続したら、以降は外部からリモートで設定をしていきます。

カメラの初期設定

カメラの説明書に従ってiPhone端末から指定のアプリを使って初期設定を行います。こちらは指示通りの操作なので大して問題はありません。(説明書通りなので割愛します)

カメラのネットワーク設定

カメラの良くわからない仕様なのですが、Windows端末からはIE11でしかアクセスできないようで、ここからはIE11を使って詳細な設定をしてきます。まずはカメラのネットワーク設定を行います。今回はIPアドレスを、192.168.0.100に固定します。

カメラのアラーム設定

SDカードに保持するか、FTPで転送するか、メールでお知らせするか等の設定を行います。今回はFTP転送がメインです。画像だけはFTPだけを選ぶことも出来ますが、動画はFTP転送だけは出来ず、いったんSDカード保持が必須のようです。

カメラ→ラズパイNASへのFTP設定

今回はRaspberryPiで制作したNASに飛ばす予定なので、画像の通りの設定です。今のところ転送先のNASが存在しないのでTestボタンを押してもFailedとなります。(先にNAS作れば良かった)

一応これで基本的な設定は完了です。あとは好みの問題もあるので、各自お好みの仕様にしてみてください。

仮置きでテストしてみた時の画像です。夜中も赤外線で割とはっきり撮れています。(実際の運用開始後画像・動画は諸事情で載せれませんのでご了承ください)

Raspberry Pi + SDカードの NAS構築手順

  1. SDカードフォーマット
  2. SDカードマウント
  3. Samba設定

Raspberry Piは192.168.0.81で起動し、Windows端末からSSHでログイン出来る前提の手順となりますので、ご了承ください。

SDカードフォーマット

WindowsでもRaspberryPiでもフォーマットは出来るのですが、今回はWindowsでSDカードをフォーマットしました。

基本的にはWindows環境からのアクセスしか考えていませんので、ファイルシステムは NTFS とします。カメラ搭載のSDカードでも触れましたが、カメラの画像ファイルは100KB程度なので、あまり大きなアロケーションユニットサイズにすると結構無駄が出ます。あまり小さくすると、大きなファイルを扱う際に遅くなる恐れもありますが、ここでは最小の512byteとします。それでは、SDカードをRaspberry Piに接続します。

USBで接続したSDカードが認識できているかを確認します。ディスクのリストを一覧表示してみると最後のsda1で認識されました。

pi@raspberrypi:~ $ sudo fdisk -l | grep /dev/
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram1: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram2: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram3: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram4: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram5: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram6: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram7: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram8: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram9: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram10: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram11: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram12: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram13: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram14: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram15: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/mmcblk0: 14.7 GiB, 15720251392 bytes, 30703616 sectors
/dev/mmcblk0p1         8192  2474609  2466418  1.2G  e W95 FAT16 (LBA)
/dev/mmcblk0p2      2474610 30703615 28229006 13.5G  5 Extended
/dev/mmcblk0p5      2482176  2547709    65534   32M 83 Linux
/dev/mmcblk0p6      2547712  2682879   135168   66M  c W95 FAT32 (LBA)
/dev/mmcblk0p7      2686976 30703615 28016640 13.4G 83 Linux
Disk /dev/sda: 7.6 GiB, 8168931328 bytes, 15954944 sectors
/dev/sda1  *     8192 15954943 15946752  7.6G  7 HPFS/NTFS/exFAT

Raspberry PiにSDカードマウント

次にマウントポイントを作成して設定し、SDカードをマウントします。今回はSanDiskのSDカードでしたので、sandiskとしました。(内容は各環境で読み替えてください)

sudo mkdir /mnt/sandisk
sudo mount /dev/sda1 /mnt/sandisk

以下のコマンドで正しくマウントされているかどうか確認できます。

pi@raspberrypi:~ $ df -k
/dev/sda1          7973376   25515 7947861    1% /mnt/sandisk

上記のように表示されれば設定されています。次に再起動後もマウント情報が消えない設定をしておきます。
以下のコマンドで設定ファイルを開きます。

sudo nano /etc/fstab

設定の最終行に、以下を追加しておきます。(tab区切りなので注意、0の前は半角スペース)

/dev/sda1       /mnt/sandisk    ntfs-3g defaults          0       0

Ctrl+X, yEnterで設定終了です。

設定が終了したら、一度再起動してみます。

sudo shutdown -r now

再起動後も、設定したディスクが表示されていればディスクの設定は全て完了です。

Raspberry PiにSambaを設定

ここからはWindows端末からアクセス出来るようにSambaの導入に入ります。まず以下のコマンドでSambaをインストールします。

sudo apt-get install samba

sambaの設定を行います。以下で設定ファイル最後尾に以下の設定を追加します。

sudo nano /etc/samba/smb.conf
[RaspNAS]
comment=SANDISK
path=/mnt/sandisk
public = Yes
read only = No
writable = Yes
guest ok = Yes
force user = pi

Ctrl+X, yEnterで設定終了です。以下でsambaを再起動します。

pi@raspberrypi:/mnt/sandisk $ sudo /etc/init.d/samba restart
[ ok ] Restarting nmbd (via systemctl): nmbd.service.
[ ok ] Restarting smbd (via systemctl): smbd.service.
[ ok ] Restarting samba-ad-dc (via systemctl): samba-ad-dc.service.

これでエラーが出ていなければ、Sambaの設定は完了です。試しに、同ネットワーク上にいるWindows端末で、アドレスバーに以下のアドレスを打ち込んでみます。

\\192.168.0.81

すると RaspNAS ディレクトリを確認できました。ファイルの追加・削除も出来ております。

カメラ→ラズパイNASへのFTP設定(再)

今回採用したカメラの仕様上、SDカードへの書き込み以外の転送手段としてはFTPプロトコルの送信のみなので、FTPでRaspberryPiのNASに対してファイルをアップさせます。FTPでのやりとりは平文なので本来は暗号化すべきですが、内部ネットワークだけで完結する仕組みなので今回は良しとしました。(NASの話よりこちらを先にすればよかったと若干後悔)

まずはvsftpdをインストールします。

sudo apt-get install vsftpd

そのままだと、カメラ側からどうしても接続できなくてサポートにも確認しながら、あれこれ試しましたが、最終的にはvsftpd.confの設定を変えたら正常作動しました。(多分これだったと思うけどちょっと自信無いのでダメだったらログ見てください)

pi@raspberrypi:/etc $ sudo vi /etc/vsftpd.conf
- ascii_upload_enable=YES
- ascii_download_enable=YES
+ ascii_upload_enable=YES
+ ascii_download_enable=YES

設定が完了したらFTPを起動します。

pi@raspberrypi:/etc $ sudo /etc/init.d/vsftpd status
● vsftpd.service - vsftpd FTP server
   Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled)
   Active: active (running) since 日 2018-08-05 13:32:02 UTC; 18min ago
 Main PID: 3163 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           └─3163 /usr/sbin/vsftpd /etc/vsftpd.conf

 8月 05 13:32:02 raspberrypi systemd[1]: Started vsftpd FTP server.

これでWindows端末からFTPでもつながります。

写真はWindowsからのWinSCPクライアントでのFTP接続確認。

改めて、Windows端末からIE11でカメラ(192.168.0.100)にアクセスして、FTP設定でTestしてみると、successとなりました。

実際にカメラからデータも送られてきています。画像は定期で送られてきますが、動画は動作検知した時のみ送られてくる仕様だそうです。(サポートにも確認しました)

NASの実物です。Raspberry Pi と SDカードだけなので非常にコンパクトです。今回はRaspberryPiと余っていたSDカードで制作しましたが、データはクラウドに保存とかサーバ機を使えるなら本来はそちらの方が良いと思います。

ラズパイ・カメラシステムのファイル管理

今回のNASは8GBと容量は少なめなのもありますが、容量に関わらずいつかは一杯になってしまうので、古いデータを削除する必要が出てきます。今回はRaspberryPiにシェルスクリプトを仕込んで削除することにしました。cronで毎日夜中に起動して5日間より前のものは削除する設定です。(何かあったときに見る程度なので、5日以上前のデータを残しておいてもどうせ見ないので)

pi@raspberrypi:~ $ vi /home/pi/sandisk_remove.sh
#! /bin/sh
date1=`date "+%Y%m%d" -d "5 day ago"`
logdir="/mnt/sandisk/camera/"
sudo rm -rf "$logdir$date1"

スクリプトは上記のような感じです。5日経過したディレクトリをrmコマンドで削除しています。rmコマンドを使用していますので、流用する場合は自己責任でお願い致します。

pi@raspberrypi:~ $ crontab -e
00  4  *  *  * sh /home/pi/sandisk_remove.sh

後はcrontabに仕込んで毎日AM4:00に起動させます。

さすがに容量的に少し厳しめなので、将来的にSDカードからノートPC用のHDDに変更するかもしれません。(マウントの方法はSDカードと変わりません。)