在树莓派上部署开源监控系统 ZoneMinder

原文:https://blog.iyatt.com/?p=17425

前言

自己搭建,可以用手里已有的设备,不需要额外买。这套系统的源码是公开的,录像数据也掌握在自己手里,不经过不可控的三方。

file

file

支持设置访问账号
file

可以保存录像,启用运动侦测
file
file

有配套 APP 使用
file

环境

  • 树莓派CM4
  • raspios 20240704 Debian 12 arm64
  • ZoneMinder 1.36.33

部署

参考官方文档:https://zoneminder.readthedocs.io/en/stable/installationguide/debian.html#debian-12-bookworm

配置数据库

安装 Mariadb 数据库(MySQL 开源替代品)

sudo apt update
sudo apt install -y mariadb-server

创建数据库

sudo mariadb # 连接数据库进入交互终端
CREATE DATABASE zm; # 创建数据库 zm,这个不建议自定义名字
CREATE USER zm_user@localhost IDENTIFIED BY 'zm123456'; # 创建用户 zm_user,并设置登录密码为 zm123456
GRANT ALL PRIVILEGES ON zm.* TO zm_user@localhost; # 将 zm 所有权限授予 zm_user 用户
FLUSH PRIVILEGES; # 刷新
exit; # 退出数据库交互

导入数据库结构

# zm_user 和 zm 对应前一步创建的用户名和数据库,执行后要输入上面设置的命令确认
mariadb -u zm_user -p zm < /usr/share/zoneminder/db/zm_create.sql

配置 ZoneMinder

安装软件

sudo apt install -y zoneminder apache2

更新 ZoneMinder 到最新版

sudo echo 'deb http://deb.debian.org/debian bookworm-backports main contrib' >> /etc/apt/sources.list
sudo apt update
sudo apt -t bookworm-backports install zoneminder

修改文件权限

sudo chgrp -c www-data /etc/zm/zm.conf
sudo chown -R www-data:www-data /usr/share/zoneminder/www
sudo find /usr/share/zoneminder/www -type d -exec chmod 755 {} \;
sudo find /usr/share/zoneminder/www -type f -exec chmod 644 {} \;

以 root 身份编辑 /etc/zm/zm.conf,找到ZM_DB_NAME、ZM_DB_USER、ZM_DB_PASS,分别对应前面创建的数据库、用户、密码,修改到等号后面
file

启用服务

sudo a2enconf zoneminder
sudo a2enmod cgi
sudo systemctl restart apache2.service
sudo systemctl restart zoneminder.service
sudo systemctl status zoneminder.service # 查看运行状态

使用

首次使用

访问测试
首次使用会出现隐私协议,翻到底部同意协议
file

修改地区和时区

上面从左到右第二个 option 选项,
file

语言选 zh_cn 就是中文(只是汉化不彻底,很多中英混合),还有 LOCALE_DEFAULT 选 zh_Hans_CN
file

再往下选时区,中国大陆地区的时区选亚洲上海(国际标准时区在新中国成立之前就定下来了,毕竟当时洋人多在上海,还是国际都市),修改后右下角点保存
file

添加 USB 摄像头

安装媒体工具库

sudo apt install -y v4l-utils

查看摄像头设备

v4l2-ctl --list-devices

file

这里的 imx291 就是我的 USB 摄像头,一般一个摄像头有两个 /dev/video 设备文件,其中第一个可以输出视频流,查看支持的媒体格式

v4l2-ctl -d /dev/video0 --list-formats-ext

我这里输出了下面的内容

yx@raspberrypi:~ $ v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1280x1024
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 800x600
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
        [1]: 'YUYV' (YUYV 4:2:2)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1280x1024
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.100s (10.000 fps)
                Size: Discrete 800x600
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)

即支持MJPG和YUYV,以及在各种分辨率输出下支持的帧率大小

在控制台选项卡下点击新建监视器
file

取一个名字,信号源选本地
file
左侧切换到信号源,填上摄像头的设备文件路径,设置一下分辨率,就可以保存了
file
页面右上角切换状态到运行
file

由于 zoneminder 是以 www-data 用户运行的,而 /dev/video* 设备属于 video 用户组,可能没有权限访问
将 www-data 添加到 video 用户组,这样就能正常使用了

# 添加
sudo usermod -aG video www-data

# 刷新
sudo newgrp video

内网穿透实现公网访问

大体还是基于这个思路:https://blog.iyatt.com/?p=17340
ZoneMinder 提供的配置方案是基于 Apache2 的,我看了好久都没搞懂怎么给 ZoneMinder 配置 https 访问,最后在本地用 Nginx 反向代理 Apache2 的 80 端口,转为 https,再用 frp 把 Nginx 代理的端口映射到公网,这样直接公网就能访问了,服务器还是新加坡的,视频先送到新加披再传回来,感觉延时都还可以,应该在 1 秒内,不会感觉明显的迟钝。

file

启用登录验证

打开选项,左侧用户栏可以创建或编辑用户
file

设置用户密码、语言、带宽限制、是否启用、可访问的设备、享有的设备权限…
设置后点击保存
file

选项左侧打开系统,勾选OPT_USE_AUTH,然后保存,这样就支持登录验证了
file

客户端程序(桌面程序、手机APP)

file
可以从 GitHub 下载:https://github.com/ZoneMinder/zmNinja/releases
我是用的 Android 手机,最开始是在 Google Play 上查找 APP,发现是收费的,后面才去 GitHub 上查找 ZoneMinder 项目,倒是可以直接下载(上面的链接)

配置 API 访问

在选项-系统中勾选OPT_USE_API然后保存,即启用 API
file

然后在选项-用户中,为指定用户启用 API,这样该用户就能在 APP 上使用了

“Login Auth Sucess but api failed”/“登录身份验证成功,但 API 失败”问题解决

APP 装上了,但是使用的时候就遇到标题的错误,网页端也能正常使用。
客户端应该是通过 API 连接的,就是这个 API 有问题。
昨天晚上就卡在这里,今天(2024.9.30)下班回家后,晚上又继续尝试解决这个问题,一直不停地在谷歌上搜索尝试,ZoneMinder 的项目 issues 找了都没解决,搜了两个小时,最后在 ZoneMinder 论坛上找到的回答解决了:https://forums.zoneminder.com/viewtopic.php?p=111193#p111193
推测就是树莓派版本的 ZoneMinder 包有问题,我用中文再转述一下解决方法:

新建一个文件名为 .htacess,写入

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    RewriteBase /zm/api
</IfModule>

修改文件所属用户和权限

sudo chown www-data:www-data .htacess
sudo chmod 644 .htacess

然后将这个文件复制到下面三个路径下面

  • /usr/share/zoneminder/www/api
  • /usr/share/zoneminder/www/api/app
  • /usr/share/zoneminder/www/api/app/webroot

可以测试访问,当可以显示版本或下图格式的错误信息的时候,就代表 API 正常工作了

地址//zm/api/host/getVersion.json

file
如果选项没有勾选OPT_USE_LEGACY_API_AUTH(旧版 API 认证,在启用 API 下一项),就会显示下面的状态,不启用也不影响 APP 使用
file

录像存储路径设置

打开选项-Storage,自己新建存储路径,填好路径并取一个名字
file

在具体的摄像头配置的 Storage 里有个存储区域,就可以选设置的路径名称
file

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IYATT yx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值