Pages

Monday, 30 December 2019

Raspberry Pi 自製智慧型監視器,自動遠端通報系統

这里介绍如何使用树莓派与网路摄影机,自己打造一个物联网监视器,发现异常状况时自动以Email 通报。
使用树莓派打造具有物联网功能的监视器的方法与之前介绍过的自制缩时摄影设备类似,主要的技术就是应用motion这个工具来处理网路摄影机的画面,侦测画面中变动的物体,再配合自己撰写的通报指令稿,组合成完整的物联网监视系统。
我这次用的设备是一张树莓派Raspberry Pi 2 Model B开发板加上罗技Logitech C920R HD PRO网路摄影机,作业系统是使用树莓派官方的Raspbian。
罗技Logitech C920R HD PRO 网路摄影机与树莓派
我把网路摄影机接上曼富图的桌上型脚架,这样放在桌上测试比较方便。

基本监视系统

motion是最主要的核心工具,使用apt 即可安装。安专之前新更新系统套件资讯:
sudo apt-get update
安装motion套件:
sudo apt-get install motion
motion在安装完成之后,预设是不会自动启动的,要让它能够开机自动启动,就要修改/etc/default/motion设定档,启用motion的daemon:
start_motion_daemon=yes
接着修改/etc/motion/motion.conf设定档,调整各种motion的参数,这里的参数非常多,这里只是列出一些我个人感觉比较需要调整的部份。
# 开启串流与网页管理功能
stream_localhost off
webcontrol_localhost off

# 照片解析度
width 1280
height 720

# jpeg 品质
quality 90

# 每秒最高的frame 数
framerate 4

# 杂讯门槛值
noise_level 64

# 侦测变动像素门槛值
threshold 3000

# 关闭影片输出
ffmpeg_output_movies off

# 标示画面中有变动的部份
locate_motion_mode on

#用红色方框标示 
locate_motion_style redbox
有些参数必须依照现场的状况来调整,例如杂讯门槛值(noise_level)与侦测变动像素门槛值(threshold),杂讯门槛值是指单一像素值变动多少以上才视为像素变动,而侦测变动像素门槛值是指多少个像素以上的变动才视为有侦测到物体移动,这个会跟镜头的好坏、安装的角度、光线、现场的各种物体有关,要自己去调整。
简单来说,如果镜头品质不好、画质很差、杂讯很高,那可能就要把杂讯门槛值调高一些,如果是很高级的镜头,没有什么杂讯的话,就可以把杂讯门槛值降低;如果镜头刚好是面对树叶、窗帘等会飘动的物体,那可能就要把侦测变动像素门槛值调高一些,避免小小的风吹草动就出现警讯,反之若是画面中的物体都是固定的建筑物、道路等,就可以降低侦测变动像素门槛值,让微小的变动也可以精准侦测出来。
motion 预设也会将变化的画面以影片档输出,但是我怕树莓派的处理器速度太慢了,所以先把它关掉,只看照片就好。
通常这些数值都要等到实际装好之后,经过很多次的测试才能得到比较恰当的设定值,所以安装初期先大约设定一下就可以了。设定好之后,重新启动motion系统服务:
sudo service motion restart
检查motion系统服务的状态:
service motion status
由于motion预设会将图片与影片的输出储存于/var/lib/motion中,但是motion帐号这个没有该目录的写入权限,我们要自行将这个目录的拥有者改为motion
sudo chown motion:motion /var/lib/motion
如果权限没有设定好,会造成motion中止执行。
motion正常执行之后,只要画面出现变动,就会将变动的画面储存下来,下面这张是我拿一颗篮球从镜头前滚过去的测试照片,motion会自动将画面中有变动的部份用红色方框标示出来。
这是把所有侦测到变动的照片串起来,制作成的gif 动画档。
这样就完成基本的motion监视系统了,接下来我们要加入事件处理的指令稿,让系统可以在侦测到画面变动时,主动发出通知给系统管理者,即时应变处理。

自动通报系统

motion可以在各种事件发生时,执行对应的指令稿,最常见的使用状况就是当发现变动的画面时,主动发送Email或手机即时讯息,通知系统管理员。我们可以在/etc/motion/motion.conf设定档中指定各种事件所对应的指令稿。

图片储存事件

on_picture_save功能可以指定当图片存档后,要呼叫的指令,而这个指令通常会配合%f参数一起使用,这个参数代表图片的绝对路径,透过这样的方式即可将图片传递给程式做进一步的处理:
on_picture_save /opt/motion/picture_save.sh %f
这里我让motion在图片储存之后,呼叫我自己写的/opt/motion/picture_save.sh指令稿,并将图片路径一起传过去,而这个指令稿的内容如下:
#!/bin/bash 
#名称:picture_save.sh 
#说明:将储存的照片以Email发送
filename = $1 
mpack -s  " 发现变动画面"  $filename guozhao.wang@gmail.com
这个指令稿的内容是将储存的图片以Email寄送到我的信箱,关于使用树莓派发送Email的方法,请参考Linux使用SSMTP与GMail以指令或程式自动寄信教学

摄影机故障事件

监视系统的摄影机必须要维持正常运作,这样整个系统才有作用,on_camera_lost可以指定当摄影机出问题时所要呼叫的指令。如果一台树莓派接了好几台摄影机,可以配合%t参数,将出问题的摄影机编号传递出来:
on_camera_lost /opt/motion/camera_lost.sh %t
以下是/opt/motion/camera_lost.sh指令稿的内容:
#!/bin/bash 
#名称:camera_lost.sh 
#说明:摄影机故障通报
camera_number = $1 ;
 echo  " 摄影机$camera_number 故障" | \ 
  mail -s  " 摄影机$camera_number 故障" guozhao.wang@gmail.com
这个指令稿是将摄影机故障的讯息以Email 发送至我的信箱。
motion还有支援其他几种事件,设定的方式也都类似,请查看/etc/motion/motion.conf的注解说明,另外也还有非常多种参数可以使用,其注解中也有详细的说明。