6.0 KiB
6.0 KiB
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 |