commit e991e0e7e6e912b2127abeb8a34437ce1c993dd3 Author: Hao Wang Date: Sun Dec 7 01:51:13 2025 +0800 初始提交:当前多摄像头监控系统代码 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1b13684 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +# 多摄像头实时监控系统 Docker镜像 +FROM python:3.9-slim + +# 设置工作目录 +WORKDIR /app + +# 设置环境变量 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# 复制依赖文件 +COPY requirements.txt . + +# 安装Python依赖 +RUN pip install --no-cache-dir -r requirements.txt + +# 复制应用文件 +COPY . . + +# 创建日志目录 +RUN mkdir -p /var/log/multi_camera + +# 暴露端口 +EXPOSE 5002 + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ + CMD curl -f http://localhost:5002/status || exit 1 + +# 设置启动命令 +CMD ["python3", "complete_multi_camera_app.py"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8a36aca --- /dev/null +++ b/README.md @@ -0,0 +1,197 @@ +# 多摄像头实时监控系统 + +## 项目概述 +这是一个基于Flask的多摄像头实时监控系统,支持6个摄像头的网格布局显示,具有完整的登录认证、实时状态监控和摄像头控制功能。 + +## 功能特性 + +### 🎥 摄像头功能 +- **6个摄像头网格布局**:3×2无缝连接网格 +- **实时视频流**:直接嵌入原系统摄像头页面 +- **独立摄像头控制**:每个摄像头可单独操作 +- **摄像头编号切换**:支持0-7号摄像头切换 + +### 🎛️ 控制功能 +- **刷新所有摄像头**:一键刷新所有视频流 +- **重新连接系统**:自动重新登录认证 +- **全屏显示**:支持单个摄像头全屏显示 +- **实时状态监控**:显示内存、CPU使用率和当前时间 + +### 🔐 认证功能 +- **自动登录**:使用预设账号密码自动认证 +- **Session保持**:维持登录状态 +- **自动重连**:检测连接状态并自动重连 + +## 系统要求 + +### 依赖包 +```bash +Flask==2.3.3 +requests==2.31.0 +``` + +### Python版本 +- Python 3.6+ + +## 安装和运行 + +### 方法一:直接运行(推荐开发环境) + +#### 1. 安装依赖 +```bash +pip install Flask requests +``` + +#### 2. 运行应用 +```bash +python3 complete_multi_camera_app.py +``` + +#### 3. 使用启动脚本 +```bash +chmod +x start.sh +./start.sh +``` + +#### 4. 访问系统 +打开浏览器访问:`http://127.0.0.1:5002` + +### 方法二:Docker部署(推荐生产环境) + +#### 1. 构建Docker镜像 +```bash +chmod +x docker-build.sh +./docker-build.sh +``` + +#### 2. 运行Docker容器 +```bash +chmod +x docker-run.sh +./docker-run.sh +``` + +#### 3. 手动Docker命令 +```bash +# 构建镜像 +docker build -t multi-camera-monitor:latest . + +# 运行容器 +docker run -d -p 5002:5002 --name multi-camera-app --restart unless-stopped multi-camera-monitor:latest +``` + +#### 4. 访问系统 +打开浏览器访问:`http://localhost:5002` + +### Docker管理命令 +```bash +# 查看容器状态 +docker ps + +# 查看容器日志 +docker logs -f multi-camera-app + +# 停止容器 +docker stop multi-camera-app + +# 重启容器 +docker restart multi-camera-app + +# 进入容器 +docker exec -it multi-camera-app bash + +# 删除容器 +docker rm multi-camera-app + +# 删除镜像 +docker rmi multi-camera-monitor:latest +``` + +## 配置文件 + +### 摄像头配置 +在 `complete_multi_camera_app.py` 中的 `cameras` 列表配置摄像头信息: +```python +self.cameras = [ + { + 'id': 1, + 'room': 'cnfzhjyg-igv-251', + 'camera': 'camera-0', + 'name': '1号车', + 'url': f"{self.camera_url}?room=cnfzhjyg-igv-251&camera=camera-0" + }, + # ... 其他摄像头配置 +] +``` + +### 登录配置 +在 `CompleteCameraManager` 类中配置登录信息: +```python +self.username = "hao.wang@westwell-lab.com" +self.password = "wh707297" +``` + +## 使用说明 + +### 界面布局 +- **顶部控制栏**:刷新、重连按钮和系统状态显示 +- **摄像头网格**:6个摄像头以3×2网格排列 +- **摄像头控制**:每个摄像头下方有独立的控制按钮 + +### 操作指南 +1. **刷新摄像头**:点击摄像头下方的"刷新"按钮 +2. **切换摄像头编号**:点击0-7数字按钮切换摄像头视角 +3. **全屏显示**:点击"全屏"按钮进入全屏模式 +4. **系统重连**:点击"重新连接"按钮重新登录系统 + +### 状态监控 +- **内存使用**:显示应用程序内存消耗(MB) +- **CPU占用**:显示CPU使用率(%) +- **当前时间**:实时显示系统时间 + +## 技术架构 + +### 前端技术 +- **HTML/CSS**:响应式网格布局 +- **JavaScript**:实时状态更新和摄像头控制 +- **Flask模板**:动态内容渲染 + +### 后端技术 +- **Flask框架**:Web应用服务器 +- **requests库**:HTTP请求处理 +- **Session管理**:登录状态保持 + +### 监控功能 +- **内存监控**:使用Python内置方法获取内存使用 +- **CPU监控**:估算CPU使用率 +- **连接状态**:定期检查系统连接状态 + +## 故障排除 + +### 常见问题 +1. **登录失败**:检查网络连接和账号密码 +2. **摄像头无法显示**:检查摄像头URL配置 +3. **端口占用**:修改应用启动端口 + +### 日志文件 +应用运行日志保存在 `complete_multi_camera.log` 文件中 + +## 开发说明 + +### 扩展功能 +- 添加更多摄像头 +- 实现录像功能 +- 添加报警通知 +- 支持移动端适配 + +### 安全注意事项 +- 定期更新账号密码 +- 使用HTTPS加密传输 +- 限制访问IP范围 + +## 许可证 +本项目仅供内部使用 + +## 更新日志 +- v1.0: 初始版本,支持6个摄像头网格布局和实时监控 +- v1.1: 添加系统状态监控(内存、CPU、时间) +- v1.2: 优化界面布局和控制功能 \ No newline at end of file diff --git a/complete_multi_camera.log b/complete_multi_camera.log new file mode 100644 index 0000000..bd140a0 --- /dev/null +++ b/complete_multi_camera.log @@ -0,0 +1,157 @@ +2025-11-22 18:13:50,950 - INFO - 正在登录系统... +2025-11-22 18:13:51,072 - INFO - 登录成功! +2025-11-22 18:13:51,074 - INFO - 启动多摄像头网格布局Flask应用... +2025-11-22 18:13:51,076 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5002 + * Running on http://192.168.0.101:5002 +2025-11-22 18:13:51,076 - INFO - Press CTRL+C to quit +2025-11-22 18:14:06,980 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:06] "GET / HTTP/1.1" 200 - +2025-11-22 18:14:08,666 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:08] "GET /favicon.ico HTTP/1.1" 404 - +2025-11-22 18:14:09,182 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:09] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:14:09,664 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:09] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:09,669 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:09] "GET /status HTTP/1.1" 200 - +2025-11-22 18:14:12,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:12] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:12,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:12] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:14:17,420 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:17] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:17,430 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:17] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:14:22,417 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:22] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:22,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:22] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:14:27,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:27] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:27,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:27] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:14:32,424 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:32] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:32,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:32] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:14:37,409 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:37] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:37,418 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:37] "GET /status HTTP/1.1" 200 - +2025-11-22 18:14:37,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:37] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:14:42,417 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:42] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:42,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:42] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:14:47,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:47] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:47,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:47] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:14:52,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:52] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:52,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:52] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:14:57,423 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:57] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:14:57,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:57] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:02,417 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:02] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:02,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:02] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:07,418 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:07] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:07,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:07] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:07,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:07] "GET /status HTTP/1.1" 200 - +2025-11-22 18:15:12,416 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:12] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:12,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:12] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:17,417 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:17] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:17,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:17] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:22,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:22] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:22,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:22] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:27,419 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:27] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:27,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:27] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:32,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:32] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:32,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:32] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:37,409 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:37] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:37,419 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:37] "GET /status HTTP/1.1" 200 - +2025-11-22 18:15:37,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:37] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:42,423 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:42] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:42,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:42] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:47,423 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:47] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:47,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:47] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:52,424 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:52] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:15:52,424 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:52] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:57,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:57] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:15:57,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:57] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:16:02,419 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:02] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:16:02,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:02] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:16:07,419 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:07] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:16:07,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:07] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:16:07,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:07] "GET /status HTTP/1.1" 200 - +2025-11-22 18:16:12,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:12] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:16:12,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:12] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:16:17,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:17] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:16:17,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:17] "GET /memory HTTP/1.1" 200 - +2025-11-22 18:16:22,433 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:22] "GET /cpu HTTP/1.1" 200 - +2025-11-22 18:16:22,439 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:22] "GET /memory HTTP/1.1" 200 - +2025-11-24 09:45:30,202 - INFO - 启动多摄像头网格布局Flask应用... +2025-11-24 09:45:30,204 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5002 + * Running on http://192.168.0.101:5002 +2025-11-24 09:45:30,204 - INFO - Press CTRL+C to quit +2025-11-24 09:45:33,643 - INFO - 127.0.0.1 - - [24/Nov/2025 09:45:33] "GET / HTTP/1.1" 200 - +2025-11-24 09:45:35,353 - INFO - 127.0.0.1 - - [24/Nov/2025 09:45:35] "GET /favicon.ico HTTP/1.1" 404 - +2025-11-24 09:46:09,787 - INFO - 127.0.0.1 - - [24/Nov/2025 09:46:09] "GET / HTTP/1.1" 200 - +2025-11-24 09:51:01,616 - INFO - 启动多摄像头网格布局Flask应用... +2025-11-24 09:51:01,618 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5002 + * Running on http://192.168.0.101:5002 +2025-11-24 09:51:01,618 - INFO - Press CTRL+C to quit +2025-11-24 09:51:05,716 - INFO - 127.0.0.1 - - [24/Nov/2025 09:51:05] "GET / HTTP/1.1" 200 - +2025-11-24 09:58:41,074 - INFO - 启动多摄像头网格布局Flask应用... +2025-11-24 09:58:41,076 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5002 + * Running on http://192.168.0.101:5002 +2025-11-24 09:58:41,076 - INFO - Press CTRL+C to quit +2025-11-24 09:58:43,374 - INFO - 127.0.0.1 - - [24/Nov/2025 09:58:43] "GET / HTTP/1.1" 200 - +2025-11-24 09:58:45,004 - INFO - 127.0.0.1 - - [24/Nov/2025 09:58:45] "GET /favicon.ico HTTP/1.1" 404 - +2025-11-24 10:13:21,233 - INFO - 127.0.0.1 - - [24/Nov/2025 10:13:21] "GET / HTTP/1.1" 200 - +2025-11-24 10:16:09,233 - INFO - 127.0.0.1 - - [24/Nov/2025 10:16:09] "GET / HTTP/1.1" 200 - +2025-11-24 12:12:19,444 - INFO - 127.0.0.1 - - [24/Nov/2025 12:12:19] "GET / HTTP/1.1" 200 - +2025-11-24 12:13:19,861 - INFO - 127.0.0.1 - - [24/Nov/2025 12:13:19] "GET / HTTP/1.1" 200 - +2025-11-24 13:16:09,458 - INFO - 启动多摄像头网格布局Flask应用... +2025-11-24 13:16:09,459 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5002 + * Running on http://192.168.66.52:5002 +2025-11-24 13:16:09,460 - INFO - Press CTRL+C to quit +2025-11-24 13:16:12,009 - INFO - 127.0.0.1 - - [24/Nov/2025 13:16:12] "GET / HTTP/1.1" 200 - +2025-11-24 13:16:13,683 - INFO - 127.0.0.1 - - [24/Nov/2025 13:16:13] "GET /favicon.ico HTTP/1.1" 404 - +2025-11-24 20:18:56,297 - INFO - 127.0.0.1 - - [24/Nov/2025 20:18:56] "GET / HTTP/1.1" 200 - +2025-11-24 22:51:50,902 - INFO - 127.0.0.1 - - [24/Nov/2025 22:51:50] "GET / HTTP/1.1" 200 - +2025-11-24 22:53:33,451 - INFO - 启动多摄像头网格布局Flask应用... +2025-11-24 22:54:36,448 - INFO - 127.0.0.1 - - [24/Nov/2025 22:54:36] "GET / HTTP/1.1" 200 - +2025-11-25 10:25:56,694 - INFO - 启动多摄像头网格布局Flask应用... +2025-11-25 10:25:56,696 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5002 + * Running on http://192.168.0.101:5002 +2025-11-25 10:25:56,696 - INFO - Press CTRL+C to quit +2025-11-25 10:26:00,447 - INFO - 127.0.0.1 - - [25/Nov/2025 10:26:00] "GET / HTTP/1.1" 200 - +2025-11-25 10:26:13,163 - INFO - 127.0.0.1 - - [25/Nov/2025 10:26:13] "GET /favicon.ico HTTP/1.1" 404 - +2025-11-25 10:26:13,640 - INFO - 127.0.0.1 - - [25/Nov/2025 10:26:13] "GET / HTTP/1.1" 200 - +2025-11-25 10:26:15,182 - INFO - 127.0.0.1 - - [25/Nov/2025 10:26:15] "GET / HTTP/1.1" 200 - +2025-11-25 10:26:31,917 - INFO - 127.0.0.1 - - [25/Nov/2025 10:26:31] "GET / HTTP/1.1" 200 - +2025-11-25 10:26:57,688 - INFO - 192.168.0.101 - - [25/Nov/2025 10:26:57] "GET / HTTP/1.1" 200 - +2025-11-25 12:07:50,872 - INFO - 启动多摄像头网格布局Flask应用... +2025-11-25 12:07:50,874 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5002 + * Running on http://192.168.0.101:5002 +2025-11-25 12:07:50,874 - INFO - Press CTRL+C to quit +2025-11-25 12:08:05,702 - INFO - 127.0.0.1 - - [25/Nov/2025 12:08:05] "GET / HTTP/1.1" 200 - +2025-11-25 12:08:07,335 - INFO - 127.0.0.1 - - [25/Nov/2025 12:08:07] "GET /favicon.ico HTTP/1.1" 404 - +2025-11-25 12:10:08,292 - INFO - 127.0.0.1 - - [25/Nov/2025 12:10:08] "GET / HTTP/1.1" 200 - +2025-11-25 14:31:18,756 - INFO - 启动多摄像头网格布局Flask应用... +2025-11-25 14:31:18,758 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5002 + * Running on http://192.168.0.101:5002 +2025-11-25 14:31:18,758 - INFO - Press CTRL+C to quit +2025-11-25 14:31:39,357 - INFO - 127.0.0.1 - - [25/Nov/2025 14:31:39] "GET / HTTP/1.1" 200 - +2025-11-25 14:31:40,949 - INFO - 127.0.0.1 - - [25/Nov/2025 14:31:40] "GET /favicon.ico HTTP/1.1" 404 - +2025-11-26 11:32:47,722 - INFO - 127.0.0.1 - - [26/Nov/2025 11:32:47] "GET / HTTP/1.1" 200 - +2025-11-26 14:41:17,085 - INFO - 127.0.0.1 - - [26/Nov/2025 14:41:17] "GET / HTTP/1.1" 200 - +2025-11-27 13:25:41,362 - INFO - 127.0.0.1 - - [27/Nov/2025 13:25:41] "GET / HTTP/1.1" 200 - +2025-11-28 11:24:37,732 - INFO - 127.0.0.1 - - [28/Nov/2025 11:24:37] "GET / HTTP/1.1" 200 - +2025-11-28 13:33:09,307 - INFO - 127.0.0.1 - - [28/Nov/2025 13:33:09] "GET / HTTP/1.1" 200 - +2025-11-29 10:01:59,435 - INFO - 127.0.0.1 - - [29/Nov/2025 10:01:59] "GET / HTTP/1.1" 200 - +2025-11-29 16:30:49,229 - INFO - 127.0.0.1 - - [29/Nov/2025 16:30:49] "GET / HTTP/1.1" 200 - +2025-11-29 16:31:43,617 - INFO - 127.0.0.1 - - [29/Nov/2025 16:31:43] "GET / HTTP/1.1" 200 - +2025-11-29 17:51:00,240 - INFO - 127.0.0.1 - - [29/Nov/2025 17:51:00] "GET / HTTP/1.1" 200 - +2025-11-29 17:51:23,669 - INFO - 127.0.0.1 - - [29/Nov/2025 17:51:23] "GET / HTTP/1.1" 200 - +2025-11-29 17:51:49,490 - INFO - 127.0.0.1 - - [29/Nov/2025 17:51:49] "GET / HTTP/1.1" 200 - +2025-11-29 17:53:05,961 - INFO - 127.0.0.1 - - [29/Nov/2025 17:53:05] "GET / HTTP/1.1" 200 - +2025-11-29 20:53:15,638 - INFO - 127.0.0.1 - - [29/Nov/2025 20:53:15] "GET / HTTP/1.1" 200 - +2025-11-30 05:56:04,625 - INFO - 127.0.0.1 - - [30/Nov/2025 05:56:04] "GET / HTTP/1.1" 200 - +2025-12-01 05:27:00,795 - INFO - 127.0.0.1 - - [01/Dec/2025 05:27:00] "GET / HTTP/1.1" 200 - +2025-12-01 11:54:07,262 - INFO - 127.0.0.1 - - [01/Dec/2025 11:54:07] "GET / HTTP/1.1" 200 - +2025-12-01 20:32:22,708 - INFO - 127.0.0.1 - - [01/Dec/2025 20:32:22] "GET / HTTP/1.1" 200 - diff --git a/complete_multi_camera_app.py b/complete_multi_camera_app.py new file mode 100644 index 0000000..dc000c1 --- /dev/null +++ b/complete_multi_camera_app.py @@ -0,0 +1,543 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +完整多摄像头网格布局Flask应用 +支持6个摄像头的实时监控网格布局 +""" + +from flask import Flask, render_template_string, request, jsonify +import requests +import json +import logging +import time +import os +import resource +from datetime import datetime + +# 配置日志 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler('complete_multi_camera.log', encoding='utf-8'), + logging.StreamHandler() + ] +) +logger = logging.getLogger(__name__) + +app = Flask(__name__) + +class CompleteCameraManager: + def __init__(self): + self.base_url = "http://10.80.0.2:5045" + self.login_api = f"{self.base_url}/api/user/login" + self.camera_url = f"{self.base_url}/adaops/blank-layout/camera-view" + self.session = requests.Session() + self.token = None + self.last_login_time = None + self.is_logged_in = False + + # 配置请求头 + self.session.headers.update({ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Content-Type': 'application/json', + 'Connection': 'keep-alive', + }) + + # 账号信息 + self.username = "hao.wang@westwell-lab.com" + self.password = "wh707297" + + # 摄像头配置 + self.cameras = [ + { + 'id': 1, + 'room': 'cnfzhjyg-igv-251', + 'camera': 'mixed', + 'name': '1号车', + 'url': f"{self.camera_url}?room=cnfzhjyg-igv-251&camera=mixed" + }, + { + 'id': 2, + 'room': 'cnfzhjyg-igv-2', + 'camera': 'mixed', + 'name': '2号车', + 'url': f"{self.camera_url}?room=cnfzhjyg-igv-2&camera=mixed" + }, + { + 'id': 3, + 'room': 'cnfzhjyg-igv-3', + 'camera': 'mixed', + 'name': '3号车', + 'url': f"{self.camera_url}?room=cnfzhjyg-igv-3&camera=mixed" + }, + { + 'id': 4, + 'room': 'cnfzhjyg-igv-5', + 'camera': 'mixed', + 'name': '5号车', + 'url': f"{self.camera_url}?room=cnfzhjyg-igv-5&camera=mixed" + }, + { + 'id': 5, + 'room': 'cnfzhjyg-igv-6', + 'camera': 'mixed', + 'name': '6号车', + 'url': f"{self.camera_url}?room=cnfzhjyg-igv-6&camera=mixed" + }, + { + 'id': 6, + 'room': 'cnfzhjyg-igv-7', + 'camera': 'mixed', + 'name': '7号车', + 'url': f"{self.camera_url}?room=cnfzhjyg-igv-7&camera=mixed" + } + ] + + # 不进行自动登录 + # self.auto_login() + + def login(self): + """登录系统""" + logger.info("正在登录系统...") + + login_data = { + 'username': self.username, + 'password': self.password, + 'email': self.username, + 'user': self.username, + 'account': self.username + } + + try: + response = self.session.post( + self.login_api, + json=login_data, + timeout=10 + ) + + if response.status_code == 200: + response_data = response.json() + self.token = response_data.get('token') + self.last_login_time = datetime.now() + self.is_logged_in = True + + # 更新认证头 + if self.token: + self.session.headers.update({ + 'Authorization': f'Bearer {self.token}' + }) + + logger.info("登录成功!") + return True + else: + logger.error(f"登录失败,状态码: {response.status_code}") + return False + + except Exception as e: + logger.error(f"登录请求失败: {e}") + return False + + +# 创建全局摄像头管理器 +camera_manager = CompleteCameraManager() + +# 完整的HTML模板 +HTML_TEMPLATE = ''' + + + + + + 多摄像头实时监控 - AdaOps + + + +
+ +
+ 时间: {{ current_time }} +
+
+ +
+ {% for camera in cameras %} +
+
+
{{ camera.name }}
+
✅ 在线
+
+
+ +
+
+ + + + + + + + + + + +
+
+ {% endfor %} +
+ + + + +''' + +@app.route('/') +def index(): + """主页面 - 显示6个摄像头的网格布局""" + return render_template_string(HTML_TEMPLATE, + base_url=camera_manager.base_url, + cameras=camera_manager.cameras, + current_time=datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + + +if __name__ == '__main__': + logger.info("启动多摄像头网格布局Flask应用...") + print("=" * 50) + print("🚀 多摄像头网格布局系统启动") + print(f"📡 访问地址: http://127.0.0.1:5002") + print(f"🎥 摄像头数量: 6个") + print("=" * 50) + + # 使用不同的端口避免冲突 + app.run(host='0.0.0.0', port=5002, debug=False) + \ No newline at end of file diff --git a/docker-build.sh b/docker-build.sh new file mode 100755 index 0000000..6c79e4f --- /dev/null +++ b/docker-build.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Docker镜像构建脚本 + +IMAGE_NAME="multi-camera-monitor" +IMAGE_TAG="latest" + +echo "🐳 构建多摄像头监控系统Docker镜像..." + +# 检查Docker是否安装 +if ! command -v docker &> /dev/null; then + echo "❌ 错误: 未找到Docker,请先安装Docker" + exit 1 +fi + +# 构建镜像 +echo "📦 构建镜像: ${IMAGE_NAME}:${IMAGE_TAG}" +docker build -t ${IMAGE_NAME}:${IMAGE_TAG} . + +if [ $? -eq 0 ]; then + echo "✅ 镜像构建成功!" + echo "" + echo "运行镜像:" + echo " docker run -d -p 5002:5002 --name multi-camera ${IMAGE_NAME}:${IMAGE_TAG}" + echo "" + echo "访问地址: http://localhost:5002" +else + echo "❌ 镜像构建失败!" + exit 1 +fi \ No newline at end of file diff --git a/docker-run.sh b/docker-run.sh new file mode 100755 index 0000000..16f37f0 --- /dev/null +++ b/docker-run.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +# Docker容器运行脚本 + +IMAGE_NAME="multi-camera-monitor" +IMAGE_TAG="latest" +CONTAINER_NAME="multi-camera-app" +PORT="5002" + +echo "🚀 启动多摄像头监控系统Docker容器..." + +# 检查Docker是否安装 +if ! command -v docker &> /dev/null; then + echo "❌ 错误: 未找到Docker,请先安装Docker" + exit 1 +fi + +# 检查镜像是否存在 +if ! docker images | grep -q "${IMAGE_NAME}"; then + echo "⚠️ 镜像不存在,请先运行 ./docker-build.sh 构建镜像" + exit 1 +fi + +# 停止并删除已存在的容器 +if docker ps -a | grep -q "${CONTAINER_NAME}"; then + echo "🛑 停止并删除现有容器..." + docker stop ${CONTAINER_NAME} >/dev/null 2>&1 + docker rm ${CONTAINER_NAME} >/dev/null 2>&1 +fi + +# 运行容器 +echo "🎬 启动容器: ${CONTAINER_NAME}" +docker run -d \ + --name ${CONTAINER_NAME} \ + -p ${PORT}:5002 \ + --restart unless-stopped \ + ${IMAGE_NAME}:${IMAGE_TAG} + +if [ $? -eq 0 ]; then + echo "✅ 容器启动成功!" + echo "" + echo "📊 容器状态:" + docker ps | grep ${CONTAINER_NAME} + echo "" + echo "🌐 访问地址: http://localhost:${PORT}" + echo "" + echo "📋 常用命令:" + echo " 查看日志: docker logs -f ${CONTAINER_NAME}" + echo " 停止容器: docker stop ${CONTAINER_NAME}" + echo " 重启容器: docker restart ${CONTAINER_NAME}" + echo " 进入容器: docker exec -it ${CONTAINER_NAME} bash" +else + echo "❌ 容器启动失败!" + exit 1 +fi \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ebc1cd5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Flask==2.3.3 +requests==2.31.0 \ No newline at end of file diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..0556c77 --- /dev/null +++ b/start.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# 多摄像头实时监控系统启动脚本 + +echo "🚀 启动多摄像头实时监控系统..." + +# 检查Python是否安装 +if ! command -v python3 &> /dev/null; then + echo "❌ 错误: 未找到Python3,请先安装Python3" + exit 1 +fi + +# 检查依赖是否安装 +echo "📦 检查依赖包..." +python3 -c "import flask" 2>/dev/null +if [ $? -ne 0 ]; then + echo "📥 安装Flask..." + pip3 install Flask==2.3.3 +fi + +python3 -c "import requests" 2>/dev/null +if [ $? -ne 0 ]; then + echo "📥 安装requests..." + pip3 install requests==2.31.0 +fi + +# 启动应用 +echo "🎬 启动应用..." +python3 complete_multi_camera_app.py \ No newline at end of file