# WebServer 原工程 vs 现工程对比分析 > 日期: 2026-07-14 > 原工程: /home/ypc/RTU/RTU/src/system/libweb_server/ > 现工程: /home/ypc/RTU/RTU_ALL_AI/src/system/libweb_server/ ## 一、原工程 webserver 完整功能清单 ### web_server.cpp(277行) | 序号 | 功能 | 原工程实现 | 说明 | |:----:|------|-----------|------| | W01 | packed_fs 内嵌前端 | `USE_PACKED_FS` 宏,`mg_fs_packed` | 编译时将前端文件打包进二进制 | | W02 | 独立 polling 线程 | `pthread_create` → `web_server_run` 内 `mg_mgr_poll(500ms)` | 与 X-Macro 框架独立的线程 | | W03 | 端口/路径配置 | `s_listen_on="http://0.0.0.0:8000"`, `s_update_ws="/ws"`, `s_web_root="web_root"` | 硬编码常量 | | W04 | 连接管理 | `g_ws_conns` vector + mutex | ws_send_all/ws_send_one/ws_send_binary | | W05 | MG_EV_WS_CTL 关闭 | `WEBSOCKET_OP_CLOSE` → session destroy + 移除连接 | 完整的 WebSocket 生命周期 | | W06 | MG_EV_CLOSE 处理 | socket 意外关闭时清理 session + 连接 | 双重保障 | | W07 | app_web_server 线程 | EV_TIMER1/TIMER2 空闲, EV_TIMER3 → ws_task() | 1秒周期增量推送 | ### ws_method.cpp(1421行) | 序号 | 功能 | 原工程实现 | 说明 | |:----:|------|-----------|------| | S01 | 信号结构体 | `stru_ws_signal` 含 `p_ctrl*` + `p_param*` | 控制上下文伴随信号生命周期 | | S02 | 函数表分发 | `g_ws_signal_methods_map` → `stru_ws_signal_method` | 5种信号 × 4个操作 = 统一分发 | | S03 | yk/ao/param SBO 流程 | `DIRECT_NORMAL` 直控, `SBO_NORMAL` → SELECT → DIRECT 两步 | 完整的遥控/遥调流程 | | S04 | async_cmd 通道 | `ws_set_async_cmd_conn/get_async_cmd_conn` + `async_cmd_printf/async_cmd_complete` | 其他模块异步推送命令结果到前端 | | S05 | ws_send_large_text | 35KB 分片发送 `cmd_rsp_chunk` + 5ms 间隔 | 大文本不会撑爆 WebSocket 帧 | | S06 | ws_build_dc_data_json | 调用 `dc_get_signal_info_by_id` 遍历所有信号类型 | datacenter 命令返回完整元数据 | | S07 | dc_save_out_signals_xml | `datacenter out` 命令执行后自动保存 XML | 信号导出到文件 | | S08 | cmd_exec pipe+dup2 | 独立线程读取 pipe → stdout 捕获 | 命令执行结果回传前端 | | S09 | get_cmds / get_file / set_file | 命令列表 / 文件读取 / 文件保存 | 完整的管理 API | | S10 | AO/Param 元数据到前端 | `item.min/max/step/unit` 从 `p_param` 提取 | 前端可做范围校验和单位显示 | | S11 | 增量推送 ws_task | 遍历 sessions → 变化检测 → 仅推送有变化的连接 | 1秒周期 | | S12 | 立即推送 | add/del 信号后立即 `make_signal_json` → `ws_send_one` | 不等定时器 | ## 二、现工程功能对照 ### 已实现(✅) | 功能 | 对应原工程 | 备注 | |------|:---------:|------| | WebSocket 连接管理 + 广播/单播/二进制 | W04 | ✅ 一致 | | MG_EV_WS_CTL/MG_EV_CLOSE 处理 | W05,W06 | ✅ 一致 | | HTTP 静态文件服务 | W03 | ✅ 路径改为 config/web | | 5种信号增删改查 | S01~S03 | ⚠️ 缺少 SBO 流程 | | cmd 命令执行 + stdout 捕获 | S08 | ✅ 一致 | | get_cmds / get_file / set_file | S09 | ✅ 一致 | | async_cmd 通道 | S04 | ✅ 一致 | | 增量推送 (ws_push_task) | S11 | ✅ 100ms 周期 | | 添加/删除后立即推送 | S12 | ✅ 一致 | | X-Macro 框架集成 + EV_STOP | W07 | ✅ 比原工程更好 | ### 缺失/需要完善(❌) | 序号 | 缺失功能 | 影响 | 严重度 | |:----:|---------|------|:------:| | M1 | **SBO 遥控流程** | 原工程 yk/ao/param 的 set 支持 `DIRECT_NORMAL` 直控和 `SBO_NORMAL` 选择-执行两步。现工程 yk_sig_set/ao_sig_set/param_sig_set 只调用了 `DC_STEP_DIRECT`,未处理 SELECT→DIRECT 两阶段,且未区分 ctrl_type。 | **高** | | M2 | **dc_save_out_signals_xml** | 原工程在 `datacenter out` 命令执行后自动调用 `dc_save_out_signals_xml()` 保存到 `config/SYSTEM/datacenter_out.xml`。现工程缺失,前端 PLC 配置页面依赖此文件。 | **高** | | M3 | **ws_build_dc_data_json** | 原工程 `datacenter` 命令执行后构建 JSON 返回信号元数据(saddr/desc/type/id/ctrl_type/link_saddrs)。现工程缺失,前端无法展示信号详情。 | **高** | | M4 | **ws_send_large_text** | 原工程大文本(>35KB)分片发送 `cmd_rsp_chunk`。现工程无此处理,大输出可能被截断或 WS 帧溢出。 | **中** | | M5 | **AO/Param 元数据 (min/max/step/unit)** | 原工程在 JSON 中包含 `min/max/step/unit` 字段给前端做范围校验。现工程 JSON 中没有这些字段。 | **中** | | M6 | **p_ctrl 伴随信号生命周期** | 原工程 `stru_ws_signal` 有 `p_ctrl*` 指针,在 add 时 new 分配、del 时 delete 释放。现工程每次 set 时临时创建/销毁 ctrl,效率低且可能引入 bug。 | **低** | ## 三、前后端交互协议 ### 前端 → 后端(JSON 消息类型) | type | 字段 | 说明 | 状态 | |------|------|------|:----:| | `cmd` | `{type:"cmd", data:"命令 参数"}` | 执行调试命令 | ✅ 已实现 | | `get_cmds` | `{type:"get_cmds"}` | 获取命令列表 | ✅ 已实现 | | `get_file` | `{type:"get_file", path:"相对路径"}` | 读取配置文件 | ✅ 已实现 | | `set_file` | `{type:"set_file", path:"...", content:"..."}` | 保存配置文件 | ✅ 已实现 | | 信号CRUD | `{saddr, signal_type, curd, signal_data, setting_zone}` | 信号增删改 | ✅ 已实现 | ### 后端 → 前端(JSON 消息类型) | type | 说明 | 状态 | |------|------|:----:| | `cmd_list` | `{type:"cmd_list", cmds:[{name,desc}]}` | ✅ 已实现 | | `file_content` | `{type:"file_content", path, content}` | ✅ 已实现 | | `file_saved` | `{type:"file_saved", path, success}` | ✅ 已实现 | | `cmd_rsp_chunk` | `{type:"cmd_rsp_chunk", seq, total, data}` | ❌ M4 缺失 | | `dc_data` | `{type:"dc_data", out:[...], in:[...], ...}` | ❌ M3 缺失 | | Binary | 命令执行结果(原始字节流) | ✅ 已实现 | | 信号JSON | out/in/yk/ao/param 数组 | ⚠️ M5 缺 min/max/step/unit |