用树莓派加上一个便宜的网络摄像头,制作一个简单的监控器,还是挺有意思的事呢。貌似监控系统是大部分关于树莓派的书都会介绍的东西,网络上关于这个的资料也很多,不过作为新手在自己搭建的时候还是会遇到很多奇奇怪怪的问题的,本文也是我自己搭建监控器的一个记录,具体操作还是以《树莓派学习指南(基于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设置成自启动并后台运行,这样就更方便了。