From 66ef04b5183af9b55fbf75ecba9e42a53f0c64b7 Mon Sep 17 00:00:00 2001 From: Hao Wang Date: Sat, 13 Dec 2025 10:57:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=9A=E6=B7=BB=E5=8A=A0.gitignore=EF=BC=8C?= =?UTF-8?q?=E6=B8=85=E7=90=86=E6=97=A5=E5=BF=97=E5=92=8C=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E6=9B=B4=E6=96=B0=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 4 - .gitignore | 52 ++ Dockerfile | 36 -- README.md | 290 +++++----- app/__init__.py | 14 +- app/__pycache__/__init__.cpython-312.pyc | Bin 1901 -> 0 bytes .../camera_manager.cpython-312.pyc | Bin 4887 -> 0 bytes app/__pycache__/config.cpython-312.pyc | Bin 1865 -> 0 bytes app/__pycache__/health.cpython-312.pyc | Bin 2992 -> 0 bytes app/camera_manager.py | 53 +- app/config.py | 31 +- app/health.py | 63 -- app/routes/__init__.py | 1 - .../__pycache__/__init__.cpython-312.pyc | Bin 170 -> 0 bytes app/routes/__pycache__/main.cpython-312.pyc | Bin 3198 -> 0 bytes app/routes/main.py | 7 +- complete_multi_camera.log | 157 ----- complete_multi_camera_app.py | 543 ------------------ docker-build.sh | 30 - docker-run.sh | 55 -- multi_camera.log | 2 - requirements.txt | 3 +- start.sh | 41 -- 23 files changed, 216 insertions(+), 1166 deletions(-) create mode 100644 .gitignore delete mode 100644 Dockerfile delete mode 100644 app/__pycache__/__init__.cpython-312.pyc delete mode 100644 app/__pycache__/camera_manager.cpython-312.pyc delete mode 100644 app/__pycache__/config.cpython-312.pyc delete mode 100644 app/__pycache__/health.cpython-312.pyc delete mode 100644 app/health.py delete mode 100644 app/routes/__init__.py delete mode 100644 app/routes/__pycache__/__init__.cpython-312.pyc delete mode 100644 app/routes/__pycache__/main.cpython-312.pyc delete mode 100644 complete_multi_camera.log delete mode 100644 complete_multi_camera_app.py delete mode 100755 docker-build.sh delete mode 100755 docker-run.sh delete mode 100644 multi_camera.log delete mode 100755 start.sh diff --git a/.env.example b/.env.example index 24470ad..6b21ee5 100644 --- a/.env.example +++ b/.env.example @@ -4,12 +4,8 @@ # 基础URL BASE_URL=http://10.80.0.2:5045 -# 登录凭据 -USERNAME=hao.wang@westwell-lab.com -PASSWORD=wh707297 # Flask配置 FLASK_DEBUG=False -SECRET_KEY=dev-secret-key PORT=5002 HOST=0.0.0.0 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a03c348 --- /dev/null +++ b/.gitignore @@ -0,0 +1,52 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Logs +*.log +logs/ +multi_camera.log +complete_multi_camera.log + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Project specific +.Dockerfile +docker-build.sh +docker-run.sh +start.sh \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index cfa864f..0000000 --- a/Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -# 多摄像头实时监控系统 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 - -# 健康检查(使用/health端点) -HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ - CMD curl -f http://localhost:5002/health || exit 1 - -# 设置启动命令 -CMD ["python3", "run.py"] \ No newline at end of file diff --git a/README.md b/README.md index 8a36aca..46c9298 100644 --- a/README.md +++ b/README.md @@ -1,197 +1,171 @@ -# 多摄像头实时监控系统 +# 多摄像头网格布局监控系统 -## 项目概述 -这是一个基于Flask的多摄像头实时监控系统,支持6个摄像头的网格布局显示,具有完整的登录认证、实时状态监控和摄像头控制功能。 +一个基于Flask的Web应用,用于实时监控多个摄像头流,并以网格布局展示。支持动态添加/删除摄像头、实时画面显示、日志记录等功能。 ## 功能特性 -### 🎥 摄像头功能 -- **6个摄像头网格布局**:3×2无缝连接网格 -- **实时视频流**:直接嵌入原系统摄像头页面 -- **独立摄像头控制**:每个摄像头可单独操作 -- **摄像头编号切换**:支持0-7号摄像头切换 - -### 🎛️ 控制功能 -- **刷新所有摄像头**:一键刷新所有视频流 -- **重新连接系统**:自动重新登录认证 -- **全屏显示**:支持单个摄像头全屏显示 -- **实时状态监控**:显示内存、CPU使用率和当前时间 - -### 🔐 认证功能 -- **自动登录**:使用预设账号密码自动认证 -- **Session保持**:维持登录状态 -- **自动重连**:检测连接状态并自动重连 +- **多摄像头支持**:可同时监控最多6个摄像头(可配置)。 +- **网格布局**:自适应网格展示,支持1x1到3x3布局。 +- **实时画面**:通过RTSP流获取实时视频,低延迟显示。 +- **摄像头管理**:提供RESTful API动态管理摄像头(启动/停止/添加/删除)。 +- **日志系统**:自动记录运行日志到`./logs/multi_camera.log`,支持日志轮转。 +- **环境配置**:通过环境变量灵活配置,无需修改代码。 +- **无健康监控**:已移除CPU/内存监控功能,专注于核心监控。 +- **无认证**:已移除登录和令牌认证,简化访问。 ## 系统要求 -### 依赖包 +- Python 3.8+ +- Flask 2.3+ +- OpenCV (opencv-python) +- 其他依赖见`requirements.txt` + +## 安装步骤 + +1. **克隆仓库** + ```bash + git clone + cd multi_camera_project_v0.1 + ``` + +2. **创建虚拟环境(可选)** + ```bash + python3 -m venv venv + source venv/bin/activate # Linux/Mac + # 或 venv\Scripts\activate # Windows + ``` + +3. **安装依赖** + ```bash + pip install -r requirements.txt + ``` + +4. **环境配置** + - 复制`.env.example`为`.env`: + ```bash + cp .env.example .env + ``` + - 编辑`.env`文件,设置你的摄像头RTSP地址和其他参数: + ``` + BASE_URL=http://10.80.0.2:5045 + FLASK_DEBUG=False + PORT=5002 + HOST=0.0.0.0 + CAMERA_URLS=rtsp://admin:password@192.168.1.101:554/stream1,rtsp://... + ``` + 注意:`CAMERA_URLS`是以逗号分隔的RTSP URL列表,最多支持6个摄像头。 + +## 运行应用 + +### 开发模式 ```bash -Flask==2.3.3 -requests==2.31.0 +python3 run.py ``` +访问 http://localhost:5002 查看网格监控界面。 -### Python版本 -- Python 3.6+ - -## 安装和运行 - -### 方法一:直接运行(推荐开发环境) - -#### 1. 安装依赖 +### 生产部署 +建议使用Gunicorn或uWSGI作为WSGI服务器: ```bash -pip install Flask requests +gunicorn -w 4 -b 0.0.0.0:5002 "app:create_app()" ``` -#### 2. 运行应用 -```bash -python3 complete_multi_camera_app.py +## 项目结构 + +``` +multi_camera_project_v0.1/ +├── app/ # Flask应用 +│ ├── __init__.py # 应用工厂和日志配置 +│ ├── config.py # 配置变量(从环境变量读取) +│ ├── camera_manager.py # 摄像头管理类 +│ ├── routes/ +│ │ └── main.py # 路由定义(API和页面) +│ └── templates/ +│ └── index.html # 前端网格页面 +├── static/ # 静态资源 +│ ├── css/style.css +│ └── js/app.js +├── logs/ # 日志目录(自动创建) +├── .env.example # 环境变量示例 +├── .env # 实际环境变量(本地,不提交) +├── requirements.txt # Python依赖 +├── run.py # 启动脚本 +└── README.md # 本文档 ``` -#### 3. 使用启动脚本 -```bash -chmod +x start.sh -./start.sh +## API接口 + +### 获取摄像头状态 ``` - -#### 4. 访问系统 -打开浏览器访问:`http://127.0.0.1:5002` - -### 方法二:Docker部署(推荐生产环境) - -#### 1. 构建Docker镜像 -```bash -chmod +x docker-build.sh -./docker-build.sh +GET /api/cameras ``` +返回所有摄像头的状态(ID、URL、是否活跃、最后帧时间)。 -#### 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 +POST /api/camera//start +POST /api/camera//stop ``` +启动或停止指定ID的摄像头。 -#### 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" - }, - # ... 其他摄像头配置 -] +POST /api/camera/add +Content-Type: application/json +{ + "url": "rtsp://..." +} ``` +添加一个新的摄像头(最多6个)。 -### 登录配置 -在 `CompleteCameraManager` 类中配置登录信息: -```python -self.username = "hao.wang@westwell-lab.com" -self.password = "wh707297" +### 删除摄像头 ``` +DELETE /api/camera/ +``` +删除指定ID的摄像头。 -## 使用说明 +### 获取实时帧 +``` +GET /api/camera//frame +``` +返回指定摄像头的最新JPEG图像(用于前端显示)。 -### 界面布局 -- **顶部控制栏**:刷新、重连按钮和系统状态显示 -- **摄像头网格**:6个摄像头以3×2网格排列 -- **摄像头控制**:每个摄像头下方有独立的控制按钮 +## 配置说明 -### 操作指南 -1. **刷新摄像头**:点击摄像头下方的"刷新"按钮 -2. **切换摄像头编号**:点击0-7数字按钮切换摄像头视角 -3. **全屏显示**:点击"全屏"按钮进入全屏模式 -4. **系统重连**:点击"重新连接"按钮重新登录系统 +- `BASE_URL`:前端访问的基础URL,用于构建API端点。 +- `FLASK_DEBUG`:Flask调试模式,生产环境设为`False`。 +- `PORT`:服务端口,默认5002。 +- `HOST`:绑定地址,`0.0.0.0`允许外部访问。 +- `CAMERA_URLS`:摄像头RTSP URL列表,用逗号分隔。 -### 状态监控 -- **内存使用**:显示应用程序内存消耗(MB) -- **CPU占用**:显示CPU使用率(%) -- **当前时间**:实时显示系统时间 +## 日志 -## 技术架构 +日志文件位于`./logs/multi_camera.log`,每天自动轮转,保留最近10个日志文件。 -### 前端技术 -- **HTML/CSS**:响应式网格布局 -- **JavaScript**:实时状态更新和摄像头控制 -- **Flask模板**:动态内容渲染 +## 常见问题 -### 后端技术 -- **Flask框架**:Web应用服务器 -- **requests库**:HTTP请求处理 -- **Session管理**:登录状态保持 +1. **摄像头画面不显示** + - 检查RTSP URL是否正确,确保网络可达。 + - 检查OpenCV是否支持RTSP(可能需要编译FFmpeg支持)。 -### 监控功能 -- **内存监控**:使用Python内置方法获取内存使用 -- **CPU监控**:估算CPU使用率 -- **连接状态**:定期检查系统连接状态 +2. **端口占用** + - 修改`.env`中的`PORT`变量,然后重启应用。 -## 故障排除 +3. **依赖安装失败** + - 确保已安装Python开发工具(如`python3-dev`、`libopencv-dev`)。 -### 常见问题 -1. **登录失败**:检查网络连接和账号密码 -2. **摄像头无法显示**:检查摄像头URL配置 -3. **端口占用**:修改应用启动端口 +## 版本历史 -### 日志文件 -应用运行日志保存在 `complete_multi_camera.log` 文件中 - -## 开发说明 - -### 扩展功能 -- 添加更多摄像头 -- 实现录像功能 -- 添加报警通知 -- 支持移动端适配 - -### 安全注意事项 -- 定期更新账号密码 -- 使用HTTPS加密传输 -- 限制访问IP范围 +- v0.1 (2025-12-13) + - 移除健康监控(CPU/内存)功能。 + - 移除Docker和启动脚本。 + - 移除认证相关代码(登录、SECRET_KEY)。 + - 配置日志目录为`./logs`。 + - 清理冗余代码和敏感信息。 ## 许可证 -本项目仅供内部使用 -## 更新日志 -- v1.0: 初始版本,支持6个摄像头网格布局和实时监控 -- v1.1: 添加系统状态监控(内存、CPU、时间) -- v1.2: 优化界面布局和控制功能 \ No newline at end of file +本项目仅供内部使用,未经许可不得分发。 + +## 贡献 + +欢迎提交Issue和Pull Request。 \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py index 801a2d7..bf14991 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -3,8 +3,7 @@ Flask应用工厂 """ import logging from flask import Flask -from .config import DEBUG, SECRET_KEY, HOST, PORT -from .health import register_health_routes +from .config import DEBUG, HOST, PORT from .routes.main import register_main_routes def create_app(): @@ -15,13 +14,11 @@ def create_app(): # 配置 app.config['DEBUG'] = DEBUG - app.config['SECRET_KEY'] = SECRET_KEY # 配置日志 configure_logging(app) # 注册路由 - register_health_routes(app) register_main_routes(app) return app @@ -31,9 +28,16 @@ def configure_logging(app): if not app.debug: # 在生产环境中,将日志输出到文件 import logging + import os from logging.handlers import RotatingFileHandler - file_handler = RotatingFileHandler('multi_camera.log', maxBytes=10240, backupCount=10) + # 日志目录 + log_dir = './logs' + if not os.path.exists(log_dir): + os.makedirs(log_dir) + + log_file = os.path.join(log_dir, 'multi_camera.log') + file_handler = RotatingFileHandler(log_file, maxBytes=10240, backupCount=10) file_handler.setFormatter(logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s' )) diff --git a/app/__pycache__/__init__.cpython-312.pyc b/app/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ee89c78e51d7e10b4b854e68d39a3381fd0076bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1901 zcmb_dT}&KR6uvV%vpYMxupoa`N=q?Sri5JyCKgkDfI=&hVgM6eqm${*u*`O5huoP3 zA&{WfNNX&uApvY6KD4o>wLWN~DN$cde1V7oZ%Wj(3*il2p8DjuvwxJ-_~J?S-t%|Q z*?Z8t6bJA3PT`_ubBd^qk8ha5};*D9!K|Suekn*gM!kTPY@wlFhV?RAl(FR|_qYMw*^n&#d+9N}j zsYOOL+ZojiBXZJ;rA#g9*by^jIJz8z6j+gmv6awbjy&>AxFrIoBeJX~bw`%N!(&8@ zVGV8}gC18xRGP)^hh+-g7elkc`XOn(zG;_d1I<$%yCSNspX&Ia` zO{{PScfE+Oz8qWSo}gUqeCsNA_%3%~zG9WD`y)^~)t!N`C{_Rl2nEoLfOZbS2c|Cj z$o?|hJClXpnPeHnq6wDvkLtbUD?rLK;YrY9?IZAI5^lFXY*2+fRPsB6AVL8&MQ=D? zT9oqKo>M4Mme&^d1ntj#G~xNrQ~zK7s(r~pRQ<*LW2`$xf}q}h|D&z%Z*R_BPyaZF zX~)v>QPF2nv?t?Tx}lv`lB%KM@v^<(3IjxS)ClKYc(Oz=mABi+pe;z?tP(qy8t$-C zNoQO-+NjtuM>jReu5YeC+GuDann8OYC!3mWD{+ughah?S+9#V=&Zpm-NniVB>*|%w zOP_Cjy|lHon7;f~`r-{KKzLOID2ANRLq}LW5T>6Rm*Za%(fEEuao)4C9t5if{2?L(T{6`^+i)MC#< z&#EBh{ANNILdyq^|0=ZYJdT1@n1VtI5uYrpRt!cEy&B;M=_}$+CrpuCoLSgMMLL9u zH~TEO^N0kpk3*O~2<~ul=Z9N@FOZwWt;qx7glVZMLwgZ7K@8gcHsA&Aco>HHi)9%u i<3&tp1J(SFT7E$-8|c^uYW|xmXF{2$N}1=~NdEwPv%pjU diff --git a/app/__pycache__/camera_manager.cpython-312.pyc b/app/__pycache__/camera_manager.cpython-312.pyc deleted file mode 100644 index cae822d940924697591788ae0d731ee0a44a871a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4887 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 O`!&Oq-6KfVb^I4Zbig|R diff --git a/app/__pycache__/config.cpython-312.pyc b/app/__pycache__/config.cpython-312.pyc deleted file mode 100644 index c15b2edb14f3610444e9df19fc4047a22984e670..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1865 zcmc(f+i%)d9LH^gFW4c_w7JlwT`o%-)`B4^p=7;;HnfYHB@rZ@VokDKj!T>vj0}Wf z?SV?0N+wOo(-vu~)Tc>Pq-jsv!_>cEFH}5?9cfRyM%qKNy!C0v23nCcdEG%em+$X; zKIi!7pZUq@WHHo&=_|@V6o&m~E?SLiP7eOXG3*NrU;+kkK&ZHYqtT`kX`5ifF#?lq zJ58&#!dICV;?)T3fZQP(Yk`!>FEKzpAq2{r(P%~^&g*wF!0~b?bF7O6+)I}ObO0yl z1TL9I=eVB`;M7+n=mMvacE-}Wn_3U(MOvSwd79c;@CMTQE$v)WI}hGO+JL1EHnkxz zjI_5bZKR>4D1klph8Mua)(uyCUuC8>YvmA(u8m@t&~Yrs3*K&V1SfKJ9_zdWF1MUJ z=pC9(a2@OR0e{OaxJ!hWFLa^}?CvL@{q^kIKR3lcB(skm2H`til&^vd*hoO34@lyaXgIo8up- zQfAGkN+qq3=aW)e)+OJ%A{QaEl!(RWqVL5F&x)k^i&7>vRg`o2qO7XO|G=Nr(vVq* zCKB(@$EP7vTnPulW0CN#`Jje7nR#fetd>$fCAIDw3k4yWRz8$Lfkx5bADch?{p@RF z_@=ID>FbBB7aG^NZf)?AkWc`$n@&hIBG8^e7lpQhuI`#8ZFIIHtV70{hYY^%khUXs zZATg77GwMb#&|o!ev}ci7@-pwp>_s&lrdp3CQe{Xv@_73$l-j1Ek^hRM!1auxjVDb z#6593c5CS_B=1OSPKNfpUXUT1h~19I7R7t9Wup_w>%N?v)aATyO)f$E!hC#D`Sdh~ zLHoP&iA94p3lROhrywn&Qca2?B(xl)8da;CX@^uwHcMDH^9LQX^LJjAu)9OLpH`oE{u@_VPik6o7R^{^3 zTC$LqGx;2!E~t4$Y*dt()wNYQnHSds{vi5RvV2m@JXBKtZ0QAaEvD`+CkWhrKw&uhD|UV#jU695_b9BRyE3*J*@$cj)xoPZE>dRduHMS(wyWAP zT6WakeHEkXiBz4FW%iK!T8+Do+}xQK;OW^Kce%{$v6#zUcMsLOJaxCH-qpX=Up+Tf zbw&3%ilp}3R&<~(dZX&P`Ts^|@Jk#~ruRO;F-KR0*mP_-wtP=}YmE12hJViRH75Ao z{pZX(WwP$v}iAj_tK(*Mvk# zWe|l>Re%I-piqI-qNYkKf{KcOpu(+EFR@G&Ya66WjT1QGU=CG!=|8(($4NoCbfo=v zcK^rB|N3TrtEebLFmQBpD9j`D7x}OTQ<&sCVKRgy)PW>Qq9arXWxVMQ8s1EVi837w zMR;t4jdC3vg=i$x;d0B+{9Cq-Q07;MUE)rl4ng99mPt0Cj$T@{CtScU%O1O)y?cB5 zo8>oX%aW{%$}drI^Uh?H)Z0-CIaqB6{FVO5ERI(vhrQIoRpB74st2Qq}T!iorm zX;Yw-jubuyP(KQDr5tl^@kw+R4~gn?An=>e0ZJ1rem_KMq_EZ@Br*vPaGspGojv+I~_u>svS4l7aF*CVT1j~t2kb}7L`RE}w?FPeyG zA%8Fsm2toi2EuYs^B>vR(&`Ju^iTCQxE?M&z>?YJemyDNzY48-OZv#o9 zsY=(`*y&ihvNria##ue#tWP=X)6T{TrjiZ}W&MnD3lMd%O_r;xQN9{OU zn+IjIAYUX`M!s5LvQ)k#>Id4YAtSbKP%>lNcJM-v3$Z&lXBEt zQy)2+$Ju5>Ggz!L5Gr~!1|LJDvP!w|j|_>j{E+Aq$f~me>J`#VQJO80re7h=6{VrS zinf_oNEf?OvX@A+y@FVlXo9Uy|1_LE`FUwmKDm8k=EBYF;OOp1K<&=ny#V#xXY;9A zKuf3#vP=4g1TOy(kkafD4ADrWj1eYXyJ%SZ4wG~(8WvAtt`s8!^}r@pfZ+5Ox2Eo& zpZV

EtmJM08r|?sFNnzrn2i4N*W2O~E3g^X9g7n+o+23d*`b;01n0<06a6#xU8Z z&cu`+T?na4r-Gva4HKxEFB?oMv9AfsT_F_;&2P4nADUH@)s}4$B^ZdP+gr@FR)efc z>OF~G@W@%6S>?%8ZQ?$(sMHSOLsYhzcJ>`5IrP!p?``?2;ses=)n}9&UhY<(@0*f5id2>5U`)`%ZZYj{&bU_3atv{nAr36mitlpJAJ3J1`C(+WpW z@c@$mM#wQV-y9OtNgqP>NGl#>4G6z8Kx=kb#28_RHJg7+Y(IS&eO)XT3YDzEX{0`k z(O;C1`1#V3Y@KwFZby=Rfc^wlH{U%}4?4=UqaI2W5)Gg}b8jqrZm<+y0KNfGrtY4B zbE{j%faJQ(?5AFlF&fP%O(Szpe+3i9wV~8P_S>6JZe8E%)rCaN(xeSdos%(EaOeeK z@&VCi9BbIfI4N*lc>icnj%y($rt=Y{3(h@EGO9DG23Ubf@nW)Rosw083SO_*JT-W8 znWekHlxqcDbpS{b<#>m%mzrAHm|nSlaQEbjy7Rulw#h0_##5iEsn68C1}Lz$5>UXk zEN4f{T{(euxd0C;Tz|hPLr(W|M1%fh`HHjqPVXCE;~S-h)p7TxN9CKr$hGdVwg=R` z-KjNg>8f21g5yeIY@TVFt>E@jhTU13ObrAT%XORIFDXI4-@FRg zNTx%vE)(auPI9Ojc&7_+7uaW%fo}KvV{mN(on~;Lq;7~~i{N6;zAdUqiHN)%Zvifp z8dA3c$uSf~&C)c*=6OU_{(&kVqngLa{iom=tey}&DZz8`t+ddPKC=KtrZZGBXfpb(WGG?+@;-yq{PNV#$j?pHFHbEl zDNoJG(RayDF3nBND=F5`EzK#(j89I?O)W}{FDS~-N=+__FEh|H)K4rZ&@aj_ElDlb skB`sH%PfhH*DI*}#bJ}1pHiBWYFESxG?@{Ii$RQ!%#4hTMa)1J06Ru2ga7~l diff --git a/app/routes/__pycache__/main.cpython-312.pyc b/app/routes/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 0b6bc44bc68a821d5e7ea02da7638a803fdb4172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3198 zcmbVOU2Gf25#Iad9VLnhrP_-8LngMI(w0a&De6RZ)yS3t2T0NYP6LYtLa@A(MD~tU z_l}lKNP!9)HQS_hj5wAOBnT7a!H$eZK~h-xE9$=XMFbJZI4EdWym*P<8(g3>q0`%#e_(|37Sur5)y-0q%zr%>$EYd{&~j!muLYUY2KMiv?}6h zln9(;qrO55eDr^}`1$oKAFiGM$bW#wzbUAO2?l{9DP6^>XHvP;sEX6h%5+H{dUDo{|3Wv5rckzdmZ~5)rMp{& zJ&oMGPBVAV<~(h_Nt?ZcwxEck%w^v^YcHlqO*Y&eY~)*P{7p9e9c)@|v1x6x5l#l8 zZG|1MgVm2O)_(Vj2YRiv@T8V9eqHTcIs^H{ZH23JiYeixz+L)wZ&7lk7kPg4A5vYHfHKt@&4}N z-fq3OTZwcZ?dyJ~ulrb(wR~yHA;W4-7ch{{Oi~7lR+~MM)NOWI!BN#rrZg?-7+^v% zOtxonx%`AB873YfwwD-84rLI+MQ#qo$MU)wp8&>AsG1fZ%%=-FEMvs=f@WqMZ^?0- z&#GxNd18O;Ks+@*9>@8Dse)1}lZ%a?v;=yN;x4R?W(*S&gG?lCrPv`YpH68;e~c>K zPZs|PbTjCC5w$sOR+Sv+fD1cB!o20>1z^S&egN)jr7No!7FJ(5Q~UFq9&&`$Mj@S64a1VXT{n6REUXL@x^;iou7XpYq`WVX6?yAj?s%{OU_X3(9R z;@zB3d<}a=8e!AyFjC}c{w4mHGfprQXp$R76HL_aFyYMVAK&vhu=d4;+Sw~Ks#d_^ zK(3(wO2w9-XC_tUd5Ad)x5X8(_N4nqP%+Nq%&UO(vr!2X04#~547q(R4kVh3R$C*D zl3-6sWXVI5X?5Jp5KSnCQNiNjMo-z)+6k_3g!p4rgMc3)&CcI|9ean7#eH|@+a~31 z@MN5Vj?(SEt;@l1B^a&-A1v|LIyz^Mo;y1C%W6loBwy>?{*Ls9R1PmZTD1?ns> z4>2pD$a2Ug=;BYSp{GhmR@%GD=E9N6w#TaNk1w@8{_mAw=f4m`bYZ6OiLrR#;}ex_ z{nhrL{jGheeekQ+!T;1bGJliSl23OH>_As{$cJU_>YmQSJa@I90r~H|0DaL*uNu){dZR*+8#m)UXJ~yOoLl|<%e6mTTzlj5+Ly1>aJyANpnI^B zpRx14QBd(dFum7ZLmeCdMdKmpylmf73GJzden@kDPA(r@+PbeA>{*g}Xs(lIoKuydW|gb0}p*NIg3JCjSn-bHa?a%Q+HJVA7ZsEYxHXbmx* zT4}m`qC7^l;_IyJXzj04vA)G!XsSF?K2DTk#8od@4%9)Sa75cIUoxrW)5)ae13-Zm zqxO?R7$MIy`;9@e#ZJW#AQp47*?E^>QY0-I^6_b~hxC?`$s9asz@tb!LPFEqlK^!I z(N$^E-INaLd8MGK{rDhEk>Jxu18|vP)>)R}H$=n)zeYR$i5{(>N54ir-^g91t;=#( cMedq=tSaxG5!Xc&3cnVfY1`l*X6z&V57tWsf&c&j diff --git a/app/routes/main.py b/app/routes/main.py index 2b80184..5385934 100644 --- a/app/routes/main.py +++ b/app/routes/main.py @@ -45,9 +45,4 @@ def register_main_routes(app): return jsonify({'success': True, 'url': url}) except Exception as e: return jsonify({'success': False, 'error': str(e)}), 400 - - @app.route('/api/login', methods=['POST']) - def login(): - """手动登录""" - success = camera_manager.login() - return jsonify({'success': success}) \ No newline at end of file + \ No newline at end of file diff --git a/complete_multi_camera.log b/complete_multi_camera.log deleted file mode 100644 index bd140a0..0000000 --- a/complete_multi_camera.log +++ /dev/null @@ -1,157 +0,0 @@ -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 deleted file mode 100644 index dc000c1..0000000 --- a/complete_multi_camera_app.py +++ /dev/null @@ -1,543 +0,0 @@ -#!/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 deleted file mode 100755 index 6c79e4f..0000000 --- a/docker-build.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/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 deleted file mode 100755 index 16f37f0..0000000 --- a/docker-run.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/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/multi_camera.log b/multi_camera.log deleted file mode 100644 index 03affee..0000000 --- a/multi_camera.log +++ /dev/null @@ -1,2 +0,0 @@ -2025-12-07 01:58:44,962 - INFO - 多摄像头监控系统启动 -2025-12-07 02:06:10,241 - INFO - 多摄像头监控系统启动 diff --git a/requirements.txt b/requirements.txt index f0c6928..d4e86f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ Flask==2.3.3 requests==2.31.0 -python-dotenv==1.0.0 -psutil==5.9.6 \ No newline at end of file +python-dotenv==1.0.0 \ No newline at end of file diff --git a/start.sh b/start.sh deleted file mode 100755 index 0968e62..0000000 --- a/start.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/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 - -python3 -c "import dotenv" 2>/dev/null -if [ $? -ne 0 ]; then - echo "📥 安装python-dotenv..." - pip3 install python-dotenv==1.0.0 -fi - -python3 -c "import psutil" 2>/dev/null -if [ $? -ne 0 ]; then - echo "📥 安装psutil..." - pip3 install psutil==5.9.6 -fi - -# 启动应用 -echo "🎬 启动应用..." -python3 run.py \ No newline at end of file