用树莓派加上一个便宜的网络摄像头,制作一个简单的监控器,还是挺有意思的事呢。貌似监控系统是大部分关于树莓派的书都会介绍的东西,网络上关于这个的资料也很多,不过作为新手在自己搭建的时候还是会遇到很多奇奇怪怪的问题的,本文也是我自己搭建监控器的一个记录,具体操作还是以《树莓派学习指南(基于Linux)》为参考的。

1 一些必备的东西

硬件的话就是多了一个网络摄像头,我用的是罗技270i,100块钱左右;除此以外就是需要懂一点基本的BASH脚本编程。

2 摄像头相关

首先看看树莓派能不能识别摄像头吧。把摄像头接上树莓派,在控制台输入lsusb 命令查看目前的USB设备,如图所示,找到了我的“Webcam C270”。这一步我没遇到什么问题,即插即用。

当然我们也需要有一个操作摄像头的程序,motion就是现成的程序,执行apt-get install motion 安装好,然后执行motion -s 启动摄像头的捕获模式,如果正常运行的话,在摄像头前挥挥手,可以看到命令行上有这样的句子:“event_newfile: File of type 1 saved to: ./xxx.jpg”,按下ctrl+c终止程序,用ls命令可以看到已经多了几个jpg文件和一个avi文件,这就是摄像头的输出结果。

测试摄像头正常使用后,我们需要对motion进行相关配置。motion的配置文件有两个,一个是/etc/default/motion,打开后里面就一句话:

start_motion_daemon=no


这句话用来配置motion是否自动启动,将“no”改成“yes”,再执行sudo /etc/init.d/motion start,motion将自动启动。我感觉没这个必要,就没改它。

另一个文件是/etc/motion/motion.conf,这里面的配置项很多,主要的几个:
daemon mode:是否让motion后台运行,我觉得后台太麻烦,直接no;
threshold:捕获阈值,motion发现图像的像素值大于该值时就会捕捉并生成图像文件,别设的太大,否则motion太“迟钝”,会误以为程序卡死了;
target_dir:设置捕捉图片的存储目录;

网上关于树莓派摄像头的资料中可能会提到webcam_localhost之类的配置项,我想可能是摄像头版本不一致的原因吧,我没找到这些配置项,如果手动添加的话motion也会提示“Unknown config option”。

好,修改相关配置尤其是target_dir后再运行motion -s 试试,结果发现图片没有存到指定的目录,还是在用户主目录下,这说明设定的配置没生效,怎么回事?在命令前加上sudo再试一下,这次成功了,可见是权限的问题啊。

关于target_dir,最好是设置在/tmp里面,这里面的用户数据会在重启后清除,这样省的自己清理图片文件。

3 报警相关

我们用发送邮件的方式建立简单的报警机制,这需要用到两个程序,msmtp和mutt。

msmtp是一个邮件传输代理程序,其实我看的书上用的是ssmtp,不过貌似ssmtp只能用Gmail,反正我用ssmtp没成功过,不知道是不是这个原因。首先执行sudo apt-get install msmtp 按照好msmtp,然后新建一个配置文件“~/.msmtprc”,编辑内容如下:

account default
host smtp.163.com
from 123@163.com
auth login
user 123@163.com
password < password >
logfile ~/.msmtp.log


这里“.msmtp.log”也是新建的日志文件。我们可以测试一下,输入msmtp -t 123@163.com ,这里的邮箱需要和配置文件里一样,然后随便输入一些东西,按下ctrl+d结束并发送,看看邮箱有没有收到。我在测试的时候遇到“account default not found”的报错,输入sudo msmtp -P 查看配置文件情况,发现是“/etc/msmtprc”和“/root/.msmtprc”不存在,所以新建这两个文件并编辑上面的内容,同时这两个文件属于root,修改其权限让pi用户可以操作,问题解决了。

然后是mutt的安装,mutt是一个命令行e-mail客户端,使用它最主要的原因是它可以发送带有文件附件的邮件。输入sudo apt-get install mutt 安装好,然后进行配置,新建文件“~/.muttrc”,编辑内容:

set sendmail="/usr/bin/msmtp"
set use_from=yes
set realname="123"
set from=123@163.com
set envelope_from=yes


可以测试一下,输入echo "test" | mutt -s "mutt_test" 123@163.com ,这里“test”是邮件内容,“mutt_test”是邮件主题,看看邮箱有没有收到。如果要用添加附件,就需要用mutt的-a参数。

4 编写脚本

我们需要编写一个bash脚本来自动检测是否有图像被捕捉并发出警报。新建一个文件monitor_test,编辑内容如下:

#!/bin/bash
MOTIONDIR=/tmp/motion_save  #这是图片和视频文件的保存路径
if [ -d $MOTIONDIR ]; then  #判断是否存在该路径
   LISTFILES=`sudo find $MOTIONDIR -maxdepth | /
                     -type f | grep avi$ `  #检索avi文件列表
   MUMFILES=`sudo find $MOTIONDIR -maxdepth |/
                     -type f | grep avi$ | wc -l`  #获取avi文件数量
   if [ $NUMFILES -gt 0 ]; then
        for AVIFILE in $LISTFILES
        do 
             echo "warning" | mutt -s "Intruder Detected" \
             -a $AVIFILE --123@163.com      #将avi文件作为附件发送到邮箱
             sudo rm $AVIFILE   #删除文件
         done
fi


如果熟悉bash的话,上面的代码一目了然,就是看看motion有没有在指定目录下生成图像文件,有的话就发送出去并删除。我一开始没搞清楚反单引号与单引号的区别,没给LISTFILES等变量加反单引号,结果值总是为空。
可以测试一下程序,先执行motion -s 打开摄像头采集一些图像,然后在命令行输入~/monitor_test 来执行脚本,看看我们的邮箱是否能收到。

5 运行系统

最后,用cron服务自动运行上面的脚本从而启动系统。cron可以根据一个固定格式的控制文件定时自动执行命令,该控制文件被称为crontab,每隔一分钟cron就会读取crontab文件,检查是否有命令需要执行。可以输入crontab -l 查看当前用户下的crontab内容,当然一般情况是空的。输入crontab -e 来编辑命令,写下这样的内容:

* * * * * /home/pi/monitor_test


上面用”“号填充的五位分别代表分钟、小时、日期、月份和星期,全部用“”填充的话就表示每分钟执行一次。编辑好后执行sudo /etc/init.d/cron restart 重启cron服务,这样我们的脚本程序就在不停运行了,运行motion -s 打开捕获摄像头,整个系统便处于工作状态了,当然可以将motion设置成自启动并后台运行,这样就更方便了。