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

devtools/2024/10/19 11:17:28/

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

前言

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

file

file

支持设置访问账号
file

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

有配套 APP 使用
file

环境

部署

参考官方文档: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_53">配置 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_FMTType: Video Capture[0]: 'MJPG' (Motion-JPEG, compressed)Size: Discrete 1920x1080Interval: 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 1280x1024Interval: 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 1280x720Interval: 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 800x600Interval: 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 640x480Interval: 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 320x240Interval: 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 1920x1080Interval: Discrete 0.200s (5.000 fps)Size: Discrete 1280x1024Interval: Discrete 0.200s (5.000 fps)Size: Discrete 1280x720Interval: Discrete 0.100s (10.000 fps)Size: Discrete 800x600Interval: 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 640x480Interval: 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 320x240Interval: 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 OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^ 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


http://www.ppmy.cn/devtools/119930.html

相关文章

如何查看Linux系统类型

方法1&#xff1a; cat /etc/os-release 方法2&#xff1a; hostnamectl 方法3&#xff1a; lsb_release -a 方法4&#xff1a; cat /etc/issue

Ubuntu上安装Git:简单步骤指南

Git是目前世界上最流行的版本控制系统&#xff0c;广泛用于软件开发中。无论你是开发者还是版本控制的新手&#xff0c;Git都是你不可或缺的工具。本文将为你介绍如何在Ubuntu操作系统上安装Git。 什么是Git&#xff1f; Git是一个开源的分布式版本控制系统&#xff0c;由Lin…

MySQL优化相关(持续积累...)

1 【索引专题】索引优化相关 原文链接 2 【MySQL性能优化】几个常见的性能优化问题 原文链接 3 聊聊sql优化的15个小技巧 原文链接 4 MySQL如何优化&#xff1f; 原文链接 5 explain | 索引优化的这把绝世好剑&#xff0c;你真的会用吗&#xff1f; 原文链接 6 字节二…

cfg80211是怎么配置无线设备的AP的?

cfg80211 概念 cfg80211 是 Linux 内核中一个用于无线网络的配置和管理的子系统&#xff0c;它为多个无线网络驱动提供了一个统一的接口&#xff0c;以便于无线设备的配置和操作。cfg80211 的设计目标是提供一个简化的管理和配置无线设备的框架&#xff0c;同时支持多种无线设…

golang学习笔记16-数组

注&#xff1a;本人已有C&#xff0c;C,Python基础&#xff0c;只写本人认为的重点。 C/C和go最大的区别之一是前者数据类型写在变量名前&#xff0c;可读性强&#xff0c;后者却写在后面&#xff0c;可读性不太好&#xff0c;本人到现在还是不习惯。那么数组也是一样&#xff…

复现 BEVfusion bug集合(4090d)

目录 写在前面的话Bug 汇总1. python版本2. cuda版本3. mmdet3d版本4. mmcv版本5. mmdet版本 后期工作&#xff08;看到numpy说明成功一半&#xff09;6. numpy版本7. timm安装8. yapf 版本 写在前面的话 主要的问题还是mmcv库的问题&#xff0c;这个版本维护太差了&#xff0…

安全服务面试

128.三层交换机? 三层交换机就是具有部分路由器功能的交换机&#xff0c;三层交换机的最重要目的是加快 大型局域网内部的数据交换&#xff0c;所具有的路由功能也是为这目的服务的&#xff0c;能够做到一次路由&#xff0c; 多次转发。对于数据包转发等规律性的过程由硬件…

「iOS」——KVC

iOS学习 前言KVC模式KVC设值KVC取值KVC使用keyPathKVC处理异常处理不存在的key处理nil异常 KVC处理字典KVC高阶消息传递 总结 前言 对KVC模式的简单学习和总结。 KVC模式 KVC&#xff08;Key-Value Coding&#xff0c;键值编码&#xff09;是一种通过字符串来访问对象属性的机…