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

server/2024/10/20 3:38:42/

原文: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/server/127299.html

相关文章

【C语言刷力扣】2079.给植物浇水

题目&#xff1a; 解题思路&#xff1a; 面对每一株植物有两种情况 水够 or 水不够&#xff1a; 水够&#xff1a; result 加1即向前走一步水不够&#xff1a; 走回河边再走回来并向前走一步&#xff0c;走到下一植物 result 2 * i 1 int wateringPlants(int* plants, int…

MacOS配置python环境

下载 Python 前往网站下载对应芯片和python版本的 installer。 配置环境变量 sudo vim ~/.bash_profile添加一下内容&#xff0c;注意修改文件名。 export PATH"/Library/Frameworks/Python.framework/Versions/3.11/bin:${PATH}" alias python"/Library/Fr…

线性方程组的迭代方法

目录 直接方法与迭代方法 常规迭代算法 选择迭代求解器 预条件子 预条件子示例 均衡和重新排序 使用线性运算函数取代矩阵 数值线性代数最重要也是最常见的应用之一是可求解以 A*x b 形式表示的线性方程组。当 A 为大型稀疏矩阵时&#xff0c;您可以使用迭代方法求解线…

Node.js 中如何进行 JWT(JSON Web Tokens)身份验证和授权

目录 JWT 使用场景 JWT 基本概念 常用方法 1. 生成 JWT 2. 验证 JWT 3. 中间件 实践案例 项目实战 封装jwt文件 后端登录接口生成token 设置为响应头 全局路由中间件验证token 前端拦截处理token 提示、技巧和注意事项 JWT 是一种用于安全传输信息的开放标准&…

POW 与 POS是什么?

POW 与 POS是什么? POW(Proof of Work)和POS(Proof of Stake)是区块链技术中两种常见的共识机制,它们在区块链网络中扮演着至关重要的角色,用于确保网络的安全性、去中心化和交易的验证。下面将分别详细解释这两种共识机制。 POW(工作量证明) 定义: POW,即工作量…

TB6612电机驱动模块(STM32)

目录 一、介绍 二、模块原理 1.原理图 2.电机驱动原理 三、程序设计 main.c文件 Motor.h文件 Motor.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件&#xff0c;它具有大电流 MOSFET-H 桥结构&#xff…

OceanBase企业级分布式关系数据库

简介 OceanBase 数据库是阿里巴巴和蚂蚁集团不基于任何开源产品&#xff0c;完全自研的原生分布式关系数据库软件&#xff0c;在普通硬件上实现金融级高可用&#xff0c;首创“三地五中心”城市级故障自动无损容灾新标准&#xff0c;具备卓越的水平扩展能力&#xff0c;全球首…

网络基础:TCP/IP五层模型、数据在局域网传输和跨网络传输的基本流程、IP地址与MAC地址的简单解析

目录 背景介绍 网络协议 OSI七层模型 TCP/IP五层模型 TCP/IP协议与OS的关系 网络协议的本质 数据在局域网传输的基本流程 MAC地址 报文的封装和解包 补充内容 数据的跨网络传输基本流程 IP地址 IP地址和MAC地址的区别 ​​​ 背景介绍 网络的发展经理了四个阶段…