# 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 |
