# VMSAuto **Repository Path**: lsbak/vmsauto ## Basic Information - **Project Name**: VMSAuto - **Description**: AI自动化监控巡检工具,自动化巡检监控系统 - **Primary Language**: Python - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-02 - **Last Updated**: 2026-07-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AI自动化监控巡检工具V2 > VMS 视频管理软件自动化监控巡检守护程序 > 版本:`202606290120` | 打包名称:`AIVMSAuto` (onedir) / `AIVMSAuto_Setup.exe` (安装包) --- ## 一、程序简介 **AI自动化监控巡检工具V2**(AIVMSAuto)是一款 Windows 桌面自动化守护程序,用于自动监控和操作 VMS 视频管理软件。程序以 GUI 界面运行,提供完整的可视化操作和日志输出。 ### 核心功能 - **自动启动 VMS**:按配置文件中的路径启动 VMS,自动检测进程存活 - **初始化序列**:首次运行时依次点击 7 个按钮完成 VMS 初始化(全屏→最大化→循环→视图→视图选择→关闭循环→打开循环) - **3x3 区域鼠标遍历**:屏幕分为 9 个区域,鼠标依次遍历以触发各区域监控画面 - **定时循环刷新**:按设定周期执行「关闭循环→等待→打开循环」刷新视图 - **进程守护**:VMS 崩溃或退出后自动检测并重启 - **定时截图**:自动全屏截图保存到共享盘或本地 - **定时关机/重启**:支持按设定时间自动执行系统关机或重启 - **网络监控**:断网时弹出红色警告窗口,恢复后自动关闭 - **增量自动更新**:SHA256 文件清单对比,仅下载变更文件(~5MB),robocopy 带重试替换 - **首次安装包**:`AIVMSAuto_Setup.exe` 双击自动安装到 `%LOCALAPPDATA%\AIVMSAuto\`,创建桌面快捷方式 - **开机自启**:首次运行自动注册 Windows 计划任务 - **分辨率变化检测**:分辨率变化时弹出警告提示重新配置 - **重新配置**:主界面可随时打开配置向导重新拾取坐标 - **更新期间 UI 锁定**:更新中禁用所有按钮、窗口关闭和日志输入 --- ## 二、运行环境 | 项目 | 要求 | |------|------| | 操作系统 | Windows 10 / 11 | | 权限 | 普通用户权限即可(建议管理员权限) | | 网络 | 启动时需联网,用于授权验证和版本检查 | | 依赖 | VMS 视频管理软件(需提前安装) | | 分辨率 | 配置坐标后请勿更改分辨率,否则坐标会偏移 | --- ## 三、安装方式 ### 方式一:安装包(推荐) 1. 获取 `AIVMSAuto_Setup_{版本}.exe`(约 34MB) 2. **双击运行**,无需任何操作 3. 自动执行:解压到 `%LOCALAPPDATA%\AIVMSAuto\` → 创建桌面快捷方式 → 启动应用 ### 方式二:手动部署 1. 将 `dist/AIVMSAuto/` 整个目录复制到目标电脑 2. 双击 `AIVMSAuto.exe` 3. 首次运行弹出安装向导(选择目录 → 复制文件 → 创建快捷方式) ### 安装目录结构 ``` %LOCALAPPDATA%\AIVMSAuto\ ├── AIVMSAuto.exe ← 主程序入口 ├── _internal\ ← 运行时依赖(Python DLL、.pyd、Tcl/Tk 等) ├── vms_config.json ← 配置文件(首次配置后生成) ├── version.txt ← 本地版本标记 ├── .installed ← 安装完成标记文件 └── _update.bat ← 更新脚本(更新时生成) ``` --- ## 四、服务器目录结构 ``` http://auto.muyuit.com:10069/vmsauto/ ├── version.txt ← 版本信息(3行格式:版本号 + 清单URL + 下载URL) ├── updates/ ← 增量更新目录 │ ├── {版本}.json ← 增量文件清单(SHA256校验) │ └── {版本}.zip ← 增量更新包(仅变更文件,~5MB) ├── version/ ← 授权目录(文件名 = 机器MAC地址) │ ├── A1B2C3D4E5F6 ← 空文件即可,存在=已授权 │ └── 112233AABBCC ├── json/ ← 机器配置目录(按MAC地址区分) │ ├── A1B2C3D4E5F6.json ← 各机器独立配置 │ └── 112233AABBCC.json └── server/ ← PHP 监控仪表盘 ├── index.php ← 监控仪表盘页面 ├── heartbeat.php ← 心跳接收接口 └── config.php ← 配置文件 ``` ### 授权文件说明 - **路径**:`http://auto.muyuit.com:10069/vmsauto/version/{MAC地址}` - **文件名**:机器的 MAC 地址(12位大写十六进制,无分隔符) - **内容**:可为空,只要存在即表示已授权 - **未授权**:启动后显示错误信息并退出 ### 版本文件说明(3行格式) - **路径**:`http://auto.muyuit.com:10069/vmsauto/version.txt` - **格式**: ``` 202606290120 http://auto.muyuit.com:10069/vmsauto/updates/202606290120.json http://auto.muyuit.com:10069/vmsauto/updates/202606290120.zip ``` - 第1行:版本号(`YYYYMMDD + 连续序列号`) - 第2行:增量清单 JSON 下载地址 - 第3行:增量 ZIP 下载地址 ### 增量更新文件说明 - **清单 JSON** (`updates/{版本}.json`):包含所有文件的相对路径和 SHA256 哈希值 - **增量 ZIP** (`updates/{版本}.zip`):仅包含与上一版本相比变更的文件,~5MB - **首次安装包** (`AIVMSAuto_Setup_{版本}.exe`):自解压安装程序,~34MB,包含全部文件 ### 配置文件说明 - **路径**:`http://auto.muyuit.com:10069/vmsauto/json/{MAC地址}.json` - 每台机器独立配置文件,内容与本地 `vms_config.json` 相同 - 启动时自动同步:服务器与本地不一致时下载覆盖 --- ## 五、项目文件结构 ``` AIVMSAuto/ ├── src/ │ ├── vms_main.py ← 核心程序源码(~1800行 Python) │ └── installer.py ← 安装程序源码(独立脚本) ├── dist/ │ ├── AIVMSAuto/ ← onedir 主程序输出目录(~54MB) │ │ ├── AIVMSAuto.exe ← 主程序入口 │ │ └── _internal/ ← 运行时依赖(已精简语言包) │ └── AIVMSAuto_Setup_{版本}.exe ← 首次安装包(~34MB) ├── updates/ │ ├── {版本}.json ← 增量文件清单(SHA256) │ ├── {版本}.zip ← 增量更新包(~5MB) │ └── .last_manifest.json ← 构建内部状态(下次构建对比) ├── server/ ← PHP 监控仪表盘 │ ├── index.php ← 监控页面 │ ├── heartbeat.php ← 心跳接口 │ └── config.php ← 配置文件 ├── build.py ← PyInstaller 打包脚本(含安装程序构建) ├── version.txt ← 版本号文件 ├── version_info.txt ← Windows 文件版本信息 ├── app_icon.ico ← 程序图标 └── README.md ← 本文档 ``` ### 核心文件说明 | 文件 | 说明 | |------|------| | `src/vms_main.py` | 主程序源码,约 1800 行,包含全部功能逻辑 | | `src/installer.py` | 安装程序源码,独立 PyInstaller 打包 | | `build.py` | 打包脚本:主程序构建 + 安装程序构建 + 增量包生成 + 版本号自增 | | `version_info.txt` | Windows 资源版本信息 | | `app_icon.ico` | 程序图标 | --- ## 六、快速开始 ### 首次使用 1. **方式一(推荐)**:双击 `AIVMSAuto_Setup.exe`,自动安装并启动 2. **方式二**:双击 `dist/AIVMSAuto/AIVMSAuto.exe` 直接运行 3. 程序启动后显示主窗口,自动执行以下步骤: - 等待网络连通(无限重试直到联网) - 验证授权(按 MAC 地址检查服务器授权文件) - 检查版本更新(增量对比 + 自动替换) - 同步远程配置(如有) 4. 首次运行或本地无有效配置时,弹出 **GUI 配置向导**: - **设置 VMS 路径**:点击「浏览」选择 VMS 可执行文件,或手动输入路径 - **拾取按钮坐标**:点击每个按钮右侧的「拾取」,在弹出的全屏半透明窗口中点击对应按钮位置,程序自动记录比例坐标 - **设置循环周期**:输入视图刷新间隔(分钟,默认10分钟) - **设置定时关机**:可选,启用后设置每天定时关机或重启时间 5. 点击「保存配置并运行」,配置写入 `vms_config.json` 6. 程序进入守护模式,主窗口显示实时日志 ### 日常使用 直接双击桌面快捷方式或 `AIVMSAuto.exe` 即可,程序检测到已有配置会自动进入监控模式。 ### 重新配置 主界面点击 **「重新配置」** 按钮(橙色),即可重新打开配置向导,重新拾取坐标和修改参数。重新配置完成后自动恢复循环运行。 --- ## 七、主界面说明 程序启动后显示一个 650x450 的深色 GUI 主窗口: - **顶部标题**:程序名称 + 版本号 - **状态栏**:实时显示运行状态(初始化中 / 运行中 / 已停止) - **日志区域**:实时滚动显示所有操作日志 - **按钮区域**: - **「重新配置」**(橙色):打开配置向导,重新设置坐标和参数 - **「停止守护」**(红色):立即停止守护程序并退出 - **「退出程序」**(蓝色):退出程序 --- ## 八、配置向导(GUI) 首次运行或点击「重新配置」时弹出的配置窗口: ### 1. VMS 可执行文件路径 - 点击「浏览」按钮,在文件对话框中选择 VMS 安装目录下的 `vms.exe` - 或手动输入完整路径(如 `D:/Program Files (x86)/VMS/vms.exe`) ### 2. 记录按钮坐标(7个按钮) | 序号 | 按钮名称 | 说明 | |------|---------|------| | 1 | 全屏按钮 | 使 VMS 进入全屏显示模式 | | 2 | 最大化按钮 | 最大化 VMS 窗口 | | 3 | 循环按钮 | 开启画面循环切换 | | 4 | 视图按钮 | 打开视图选择面板 | | 5 | 视图选择按钮 | 选择具体监控视图 | | 6 | 关闭循环按钮 | 关闭当前循环,用于刷新 | | 7 | 打开循环按钮 | 重新开启循环,完成刷新 | **拾取操作方式:** 1. 点击某行左侧的「拾取」按钮(红色醒目) 2. 配置向导窗口自动隐藏,屏幕变为全屏半透明黑色(15%透明度) 3. 屏幕中央显示提示:`请点击 [按钮名称] 的位置` 4. 在目标按钮上**单击鼠标左键**,程序自动记录该位置的**比例坐标**(适配所有分辨率) 5. 自动关闭捕获窗口,恢复配置向导,该行显示「已记录」 6. 按 **ESC** 可取消当前拾取 > 坐标采用**比例坐标系统**(x_ratio, y_ratio),记录的是点击位置占屏幕宽高的比例,因此无论屏幕分辨率如何变化,都能准确点击到同一相对位置。 ### 3. 循环周期(分钟) 设置定时循环刷新的间隔,默认 10 分钟。范围:1 ~ 1440 分钟。 ### 4. 定时关机/重启(可选) - 勾选「启用定时关机/重启」 - 设置时间(如 18:00) - 选择类型:关机 / 重启 --- ## 九、启动流程 ``` 启动程序 │ ├─ 第一步:检测安装状态 │ └─ 未安装 → 弹出安装向导 → 复制到 %LOCALAPPDATA%\AIVMSAuto\ → 创建快捷方式 │ ├─ 第二步:初始化主窗口 GUI │ ├─ 第三步:等待网络连通(无限重试直到联网) │ ├─ 第四步:授权验证 │ └─ 请求 version/{MAC地址} │ ├─ 文件存在 → 授权通过 │ └─ 文件不存在(404)→ 显示错误信息,退出程序 │ ├─ 第五步:版本检查 + 增量自动更新 │ └─ 读取 version.txt(3行格式) │ ├─ 下载增量清单 JSON → SHA256 对比 → 下载增量 ZIP │ │ └─ 解压到 _update_temp\ → 生成 BAT 脚本 → 锁定 UI → 退出 → BAT 替换 → 重启 │ └─ 已是最新 → 继续 │ ├─ 第六步:同步远程配置 │ └─ 下载 json/{MAC地址}.json │ ├─ 第七步:检查本地配置 │ └─ 无有效配置 → 启动 GUI 配置向导 │ └─ 第八步:进入监控守护循环(guard_loop) ``` --- ## 十、守护循环(guard_loop)详细说明 程序的核心逻辑在 `guard_loop()` 中运行,采用**单线程架构**(后台线程直接调用,不另开线程): ``` guard_loop 外层循环: ├─ 加载配置 → 获取 vms_exe 路径 ├─ 检查 vms_exe 文件是否存在 ├─ 检查 VMS 是否已在运行(按配置路径精确匹配) ├─ 首次运行且 VMS 已运行:结束旧进程 → 等待3秒 ├─ 启动 VMS(run_vms_session)→ 等待加载 → 检测窗口 ├─ 验证 VMS 进程确实存活(路径验证 + 退回到进程名匹配) ├─ 执行初始化序列(7个按钮点击,init_done 控制只执行一次) │ └─ 全屏 → 最大化 → 循环 → 视图 → 视图选择 → 关闭循环 → 打开循环 └─ 进入内层循环(持续运行) ├─ 检查 VMS 进程存活(每轮循环) ├─ 3x3 区域鼠标遍历(屏幕分9区,鼠标依次停留) ├─ 定时循环刷新(关闭循环 → 等待5秒 → 打开循环) ├─ 网络检查(每30分钟) ├─ 截图(每15分钟) ├─ 版本检查(每10小时) ├─ 定时关机检测(每分钟) └─ 输出运行统计(每30分钟) VMS 进程退出 → 跳出内层循环 → 回到外层循环重新启动 VMS (初始化序列不再执行,init_done 已为 True) ``` ### 关键执行顺序(确保 VMS 启动后才执行初始化) 1. 检查 VMS 进程是否运行 → 未运行则启动 2. 等待 VMS 加载(10秒) 3. 验证进程确实存在(记录 PID 和 exe 路径) 4. **确认 VMS 启动后** → 执行初始化序列(7个按钮) 5. **确认初始化完成后** → 进入 3x3 遍历和循环刷新 如果 VMS 未成功启动或进程验证失败,程序会回到循环顶部重试,**绝不执行初始化序列**。 --- ## 十一、快捷键 | 按键 | 功能 | 说明 | |------|------|------| | **F9** | 暂停/恢复 3x3 循环 | 在运行中按 F9 暂停鼠标遍历,再按一次恢复 | | **F10** | 停止守护程序 | 完全退出程序(VMS 进程不受影响,继续运行) | > 按 F10 停止后,VMS 软件不会被关闭,可正常手动操作。 --- ## 十二、定时关机/重启 ### 配置方式 在配置向导中勾选「启用定时关机/重启」,设置时间和类型。配置保存在 `vms_config.json` 中: ```json { "force_shutdown": true, "force_shutdown_hour": 18, "force_shutdown_min": 0, "force_shutdown_type": "shutdown" } ``` | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `force_shutdown` | bool | `false` | 是否启用定时关机 | | `force_shutdown_hour` | int | `18` | 关机时间(小时,0-23) | | `force_shutdown_min` | int | `0` | 关机时间(分钟,0-59) | | `force_shutdown_type` | string | `"shutdown"` | `shutdown`=关机,`restart`=重启 | ### 关机行为 1. 到达设定时间后,日志输出警告 2. **5秒倒计时**,期间按 Ctrl+C 可取消(仅限控制台模式) 3. 倒计时结束后执行 `shutdown /s /f /t 0`(强制立即关机)或 `shutdown /r /f /t 0`(重启) 4. 配置可通过服务器远程修改,每次循环动态读取 --- ## 十三、自动更新(增量机制) ### 更新架构 每次启动读取统一 `version.txt`(3行格式),采用**增量更新**机制。 ### 更新流程 ``` 检测到新版本 ├─ 1. 锁定界面(禁用所有按钮 + 拦截窗口关闭 + 日志只读) ├─ 2. 下载增量清单 JSON → 本地 SHA256 对比 ├─ 3. 仅下载变更文件(增量 ZIP,~5MB) ├─ 4. 解压到 _update_temp/ ├─ 5. 生成 _update.bat 脚本 ├─ 6. 自然退出程序(root.destroy() → mainloop 退出) └─ 7. BAT 脚本执行: ├─ 等待旧进程退出(最多 60 秒 → 强制终止) ├─ 等待 5 秒(Windows 释放 .dll/.pyd 文件句柄) ├─ robocopy /E /MOV /R:10 /W:3(带 10 次重试,每次等 3 秒) ├─ 失败则第二轮重试 /R:15 ├─ 清理临时文件 └─ start "" AIVMSAuto.exe(自动重启) ``` ### 兼容降级 如果增量清单不可用(旧服务器),自动降级到**全量模式**:下载完整 ZIP → del + move + 重试循环替换。 ### 版本号规则 格式:`YYYYMMDD + 连续序列号`(如 `202606290120`) - 日期部分:发布日期 - 序列号:从 `0100` 开始连续递增 > 版本号同时写入 `version_info.txt`(Windows 文件属性)和 `vms_main.py` 中,程序运行时从 PE 资源或 `version.txt` 自动读取。 --- ## 十四、网络监控 ### 启动前网络检测 - 连接 `192.168.0.10:445` 检测内网是否可用 - **网络不通时无限等待**,每 60 秒重试 - 联网后才进行授权验证和版本检查 ### 运行中网络监控 每 **30 分钟**检测一次网络连通性。网络断开时: - **通过 UI 线程安全队列**弹出红色警告窗口(避免后台线程直接调用 Tkinter 导致崩溃) - 每 2 秒检测网络恢复 - 网络恢复后自动关闭弹窗,继续运行 --- ## 十五、开机自启 程序首次配置完成后自动注册 Windows 计划任务,实现开机自动启动。 | 项目 | 值 | |------|-----| | 任务名 | `VMS_AutoStart` | | 触发条件 | 用户登录时 | | 权限 | 最高权限 | ### 管理命令 ```cmd # 查看任务状态 schtasks /Query /TN VMS_AutoStart # 手动删除任务 schtasks /Delete /TN VMS_AutoStart /F ``` > 每次启动时会自动检查并补注册计划任务。 --- ## 十六、日志系统 ### 日志位置 | 优先级 | 路径 | 说明 | |--------|------|------| | 1 | `\\192.168.0.10\公司内部共享软件文件\vms-tools\log\{机器名}\` | 网络共享(推荐) | | 2 | exe同目录 `logs\{机器名}\` | 本地降级(共享不可用时) | ### 日志格式 ``` 2026-06-29 09:00:00 [INFO] AI自动化监控巡检工具V2 启动 2026-06-29 09:00:00 [INFO] 版本: 202606290120 2026-06-29 09:00:00 [INFO] MAC地址: A1B2C3D4E5F6 2026-06-29 09:00:00 [INFO] 授权验证通过 (MAC=A1B2C3D4E5F6) 2026-06-29 09:00:00 [INFO] [会话1] 目标 VMS 路径: D:/Program Files (x86)/VMS/vms.exe 2026-06-29 09:00:00 [INFO] VMS 已启动,PID=1234 2026-06-29 09:00:00 [INFO] VMS 进程已确认存活 (PID=1234, 路径=D:/Program Files (x86)/VMS/vms.exe) 2026-06-29 09:00:00 [INFO] VMS 已就绪,开始执行初始化序列(7个按钮)... 2026-06-29 09:00:00 [INFO] 初始化序列完成,进入监控模式 2026-06-29 09:00:00 [INFO] 3x3 区域遍历已启动(按 F9 可暂停/恢复) ``` ### 日志轮转 每天自动切割,按日期保存。文件命名:`vms_guard_{机器名}_{日期}.log` --- ## 十七、截图 | 项目 | 说明 | |------|------| | 间隔 | 每 15 分钟自动截一次全屏 | | 格式 | JPEG(quality=50,压缩节省空间) | | 保存路径 | `\\192.168.0.10\公司内部共享软件文件\vms-tools\screenshots\{机器名}\` | | 文件名 | `{主机名}_{日期}_{时间}.jpg` | > 共享盘不可用时降级到本地 `logs\{机器名}\screenshots\` 目录。 --- ## 十八、配置文件 配置文件 `vms_config.json` 保存在 `AIVMSAuto.exe` 同目录下,完整示例: ```json { "cycle_minutes": 10, "click_points": [ {"name": "全屏按钮", "x_ratio": 0.7828, "y_ratio": 0.1713}, {"name": "最大化按钮", "x_ratio": 0.9833, "y_ratio": 0.9333}, {"name": "循环按钮", "x_ratio": 0.8932, "y_ratio": 0.9343}, {"name": "视图按钮", "x_ratio": 0.9609, "y_ratio": 0.9352}, {"name": "视图选择按钮", "x_ratio": 0.8484, "y_ratio": 0.8667}, {"name": "关闭循环按钮", "x_ratio": 0.9391, "y_ratio": 0.9361}, {"name": "打开循环按钮", "x_ratio": 0.9167, "y_ratio": 0.9343} ], "force_shutdown": false, "force_shutdown_hour": 18, "force_shutdown_min": 0, "force_shutdown_type": "shutdown", "net_check_enabled": true, "vms_exe": "D:/Program Files (x86)/VMS/vms.exe", "vms_work_dir": "D:/Program Files (x86)/VMS", "log_output": "", "log_remote_url": "", "log_upload_interval": 60, "log_level": "INFO", "last_updated": "2026-06-29 09:52:44" } ``` ### 配置字段说明 | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `cycle_minutes` | int | 10 | 循环刷新间隔(分钟) | | `click_points` | array | - | 按钮坐标列表(比例坐标) | | `force_shutdown` | bool | false | 定时关机开关 | | `force_shutdown_hour` | int | 18 | 关机小时(0-23) | | `force_shutdown_min` | int | 0 | 关机分钟(0-59) | | `force_shutdown_type` | string | "shutdown" | `shutdown`=关机,`restart`=重启 | | `net_check_enabled` | bool | true | 网络检测开关 | | `vms_exe` | string | - | VMS 可执行文件完整路径 | | `vms_work_dir` | string | - | VMS 工作目录(exe 所在目录) | | `log_output` | string | "" | 日志输出路径(空=自动使用共享文件夹) | | `log_remote_url` | string | "" | 远程日志上传 URL(空则不上传) | | `log_upload_interval` | int | 60 | 远程上传间隔(秒) | | `log_level` | string | "INFO" | 日志级别(DEBUG/INFO/WARN/ERROR) | | `last_updated` | string | - | 配置最后更新时间(自动写入) | > 运行中每次循环都会重新读取配置文件,支持远程修改后即时生效。 --- ## 十九、常见问题 **Q: 启动后提示「授权验证失败」?** A: 确认网络正常,检查服务器 `version/` 目录下是否有对应 MAC 地址的文件。程序启动时会在日志中显示当前 MAC 地址。 **Q: 如何查看本机 MAC 地址?** A: 启动程序后主窗口日志会打印 `MAC地址: XXXXXXXXXXXX`。或在 CMD 中执行 `getmac /FO CSV /NH`。 **Q: VMS 按钮位置变了怎么办?** A: 点击主界面「重新配置」按钮,重新拾取坐标即可。或删除 `vms_config.json` 后重启程序重新配置。 **Q: 分辨率变了,坐标不准了怎么办?** A: 程序会自动检测分辨率变化并弹出警告。此时需要点击「重新配置」重新拾取坐标。 **Q: 程序没有自动刷新视图?** A: 检查主窗口日志,确认:1) VMS 路径配置正确;2) 坐标配置完整(7个按钮);3) VMS 进程正常运行。 **Q: VMS 启动失败?** A: 检查日志中的 VMS 路径是否正确,文件是否存在。点击「重新配置」重新选择 VMS 路径。 **Q: 更新失败怎么办?** A: 手动下载新版 `AIVMSAuto_Setup.exe` 重新安装,或手动替换 `%LOCALAPPDATA%\AIVMSAuto\` 目录下的文件。 **Q: 如何远程修改某台机器的配置?** A: 修改服务器 `json/{MAC}.json` 文件,程序下次循环时会自动同步。 **Q: 如何取消定时关机?** A: 点击「重新配置」,取消勾选「启用定时关机/重启」,或手动将 `vms_config.json` 中 `force_shutdown` 改为 `false`。 **Q: 按 F10 退出后怎么重新启动?** A: 双击桌面快捷方式或 `AIVMSAuto.exe` 重新运行即可。VMS 不会被关闭,会继续运行。 **Q: 更新期间能操作程序吗?** A: 不能。更新期间界面完全锁定:所有按钮禁用、窗口关闭按钮无效、日志文本框只读。更新完成后自动重启。 --- ## 二十、技术参数 | 参数 | 值 | |------|-----| | 版本号格式 | `YYYYMMDD + 连续序列号`(如 `202606290120`) | | 打包模式 | PyInstaller --onedir(目录分发,无 _MEI 临时目录) | | 安装方式 | AIVMSAuto_Setup.exe 自解压安装包(onedir 壳 + 尾部 ZIP + MAGIC 定位) | | 安装位置 | `%LOCALAPPDATA%\AIVMSAuto\` | | 更新方式 | 增量更新(SHA256 清单对比 + robocopy 重试替换) | | 增量包大小 | ~5MB(仅变更文件) | | 安装包大小 | ~34MB(含完整依赖,已精简 Tcl/Tk 多余语言包) | | 坐标系统 | 比例坐标(x_ratio, y_ratio),适配所有分辨率 | | 进程检测方式 | psutil 进程名 + 路径验证 | | 架构 | 单线程 guard_loop(后台线程直接调用) | | 线程安全 | UI 消息队列(后台线程通过 queue 向主线程发通知) | | 单实例检测 | Windows 全局互斥体(`Global\VMS_AUTO_MONITOR_MUTEX`) | | 进程启动标志 | `CREATE_NEW_PROCESS_GROUP`(确保进程独立运行) | | 进程退出 | `root.destroy()` → mainloop 退出 → main() return(自然退出) | | 后台线程 | daemon=True,主线程退出时自动终止 | | 初始化序列 | 7个按钮,仅首次执行一次 | | 3x3 遍历间隔 | 每区停留1秒,完成后等待2秒 | | 循环刷新间隔 | 可配置(默认10分钟) | | 网络检测间隔 | 30 分钟 | | 更新检测间隔 | 10 小时 | | 截图间隔 | 15 分钟 | | 运行统计输出间隔 | 30 分钟 | | 窗口等待超时 | 40 秒 | | VMS 加载等待 | 10 秒 | | 关闭循环后等待 | 5 秒 | | 点击间隔 | 1 秒 | | 授权验证重试 | 3 次(间隔5秒) | | 授权标识 | MAC 地址(12位大写十六进制) | | 打包工具 | PyInstaller 6.10.0 | | 开发语言 | Python 3.13.12 | | 依赖库 | pyautogui, keyboard, psutil, requests, pywin32, Pillow, tkinter, winshell, win32com | --- ## 二十一、版本更新日志 > 项目:AI自动化监控巡检工具V2(AIVMSAuto) > 源码:`src/vms_main.py` | 打包:`build.py`(PyInstaller 6.10.0, Python 3.13.12) > 当前版本:`202606290120` ### 202606290120(V2.1) **架构升级**: - **onedir 模式**:从 --onefile 切换到 --onedir 目录分发,彻底消除 `_MEI` 临时目录问题 - **安装程序**:新增 `src/installer.py`,打包为 `AIVMSAuto_Setup.exe` 自解压安装包,双击自动安装 - **增量更新**:SHA256 文件清单对比 + 增量 ZIP 下载(~5MB),robocopy 带重试替换,更新完成后自动重启 - **UI 锁定**:更新期间禁用所有按钮、拦截窗口关闭、日志只读 - **BAT 脚本优化**:robocopy /R:10 /W:3 重试 + 5秒释放等待 + 失败后第二轮重试 - **体积优化**:精简 Tcl/Tk 多余语言包和时区数据,节省 ~1.3MB - **自然退出**:`os._exit(0)` → `root.destroy()` → mainloop 退出,pywin32/.pyd mmap 锁正常释放 ### 202606290100(V2.0) - **GUI 主界面**:从命令行模式升级为完整 GUI 窗口,含实时日志、状态栏、操作按钮 - **GUI 配置向导**:首次运行弹出图形化配置向导,支持浏览选择 VMS 路径、全屏点击拾取坐标 - **重新配置按钮**:主界面新增「重新配置」按钮,随时修改坐标和参数 - **比例坐标系统**:坐标采用比例坐标(x_ratio, y_ratio),适配所有屏幕分辨率 - **全屏点击捕获**:拾取坐标时使用全屏半透明窗口,点击目标位置自动记录比例坐标 - **VMS 启动验证**:按配置文件路径启动 VMS,启动后严格验证进程存活(PID + exe 路径) - **首次运行结束旧 VMS**:首次运行时若检测到 VMS 已运行,先结束旧进程再重新启动 - **初始化序列只执行一次**:7个按钮点击序列仅在首次启动时执行,VMS 重启后不再重复 - **单线程架构**:guard_loop 内直接调用 zone_sweep_loop,不另开线程,避免进程冲突 - **线程安全 UI 队列**:后台线程通过 `_ui_queue` 向主线程发通知,避免 Tkinter 跨线程错误 - **Windows 互斥体单实例**:使用 `CreateMutexW` 确保只有一个实例运行 - **悬浮提示窗**:左上角显示红色文字提示「系统正在运行中」,透明背景 - **分辨率变化检测**:检测分辨率变化并弹窗警告,提示重新配置 - **版本号同步**:运行时从 PE 资源或 version.txt 自动读取版本号 - 完整的日志、截图、定时关机、开机自启、网络监控、自动更新功能 --- > 索鑫工作室 | Copyright (c) 2026