RTU_ALL_AI/docs/system/libweb_server/WEBSERVER_COMPARISON.md

6.0 KiB
Raw Blame History

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.cpp277行

序号 功能 原工程实现 说明
W01 packed_fs 内嵌前端 USE_PACKED_FS 宏,mg_fs_packed 编译时将前端文件打包进二进制
W02 独立 polling 线程 pthread_createweb_server_runmg_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.cpp1421行

序号 功能 原工程实现 说明
S01 信号结构体 stru_ws_signalp_ctrl* + p_param* 控制上下文伴随信号生命周期
S02 函数表分发 g_ws_signal_methods_mapstru_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/unitp_param 提取 前端可做范围校验和单位显示
S11 增量推送 ws_task 遍历 sessions → 变化检测 → 仅推送有变化的连接 1秒周期
S12 立即推送 add/del 信号后立即 make_signal_jsonws_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_signalp_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