# eap-secs **Repository Path**: sdssaa/eap-secs ## Basic Information - **Project Name**: eap-secs - **Description**: SECS/GEM 上位机(Host)模拟器:PySide6 + secsgem,任意 SxFy 收发解析、自动应答、单文件 exe 打包 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-28 - **Last Updated**: 2026-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EAP-SECS 上位机模拟器 基于 **Python + PySide6 + secsgem** 的 SECS/GEM 上位机(Host)模拟工具, 通过 HSMS (SEMI E37) 以 **Active 模式**主动连接设备端(Secs Server), 支持任意 Stream/Function 消息的构造、发送、接收与解析展示。 ## 功能特性 - **HSMS 主动连接**:可配置设备 IP / 端口 / SessionID / T3~T8 超时,自动 Select 握手,状态灯实时显示 - **收发 SECS 消息**:任意 SxFy,W 位可选;W=1 自动等待回复(T3 超时提示),回复自动关联 - **消息体可视化构造**:树形编辑器,支持全部 SECS-II 数据类型 `L / A / B / BOOL / U1 U2 U4 U8 / I1 I2 I4 I8 / F4 F8`,嵌套列表、数组均可; B 类型按十六进制输入,数值支持多值数组(空格分隔) - **解析展示**:收/发消息即时解析为 SML 树形文本 + 原始 HEX,支持方向 / Stream / 关键字过滤 - **快捷指令**:内置常用指令模板(S1F1、S1F13、S1F3、S2F13/F15/F17/F31/F33/F35/F37、S6F15、S7F1/F3/F19、S10F3…), 可载入构造器修改,也可直接发送 - **自动应答**:按规则对设备主动消息自动回复(如收到 S6F11 自动回 S6F12),规则可视化编辑并持久化 - **日志持久化**:全部收发自动写入 `data/logs/secs-YYYYMMDD.jsonl`,一键导出可读文本 - **现代化界面**:深色主题(pyqtdarktheme)+ 自定义 QSS,中文界面 ## 快速开始 ```bash # 安装依赖(uv 会自动创建/同步 .venv) uv sync # 启动 GUI uv run python main.py ``` ### 启动方式 | 方式 | 黑窗 | 用途 | | --- | --- | --- | | 双击 `启动上位机.vbs` | 无 | **日常使用**:经 `pythonw.exe` 启动纯 GUI 进程,全程无控制台窗口;若 `.venv` 缺失会先静默执行 `uv sync` | | 双击 `启动上位机.bat` | 有 | **调试**:控制台内运行,可直接看到日志输出与报错,退出后窗口保留 | ### 打包分发(发给无 Python 环境的用户) 双击 `打包exe.bat`(或执行 `uv run pyinstaller eap-secs.spec --noconfirm`), 产出单文件 **`dist\EAP-SECS上位机.exe`**(约 47 MB),发给对方后无需安装 Python / uv / 依赖,双击即可使用,且同样无控制台黑窗。 - 配置在 `eap-secs.spec`:单文件模式(onefile)、`console=False`(无黑窗)、 自动收集 qdarktheme 主题数据 - 打包版的数据(通信日志、自动应答/快捷指令配置)写在 **exe 同级的 `data\` 目录**, 不随解压临时目录丢失;若启动异常,排查 `data\logs\crash.log` 使用步骤: 1. 在"HSMS 连接"面板填入设备地址与端口(默认 5000),点击**连接**;状态灯变绿 (Selected) 即握手成功 2. 在**快捷指令**里点 `S1F13 W 建立通信` → 直接发送,完成 GEM 通信建立 3. 在**消息构造**里选择 Stream/Function、勾选 W、编辑消息体,点击**发送** 4. 右侧日志区点选任意消息查看 SML 解析与原始十六进制 ## 验证测试 ```bash uv run python tests/codec_test.py # SECS-II 编解码单元测试 uv run python tests/gui_smoke_test.py # GUI 冒烟测试(offscreen,无窗口) uv run python tests/loopback_test.py # 回环测试:内置模拟设备端 + 客户端全链路 ``` ## 项目结构 ``` ├── main.py # 启动入口 ├── eap_secs/ │ ├── app.py # QApplication / 主题装配 │ ├── secs/ # 协议层(不依赖 Qt) │ │ ├── codec.py # SECS-II 通用编解码 + SML 渲染 │ │ ├── host_client.py # HSMS Host 客户端(secsgem 封装) │ │ ├── msglog.py # 消息记录 + JSONL 持久化 │ │ └── auto_reply.py # 自动应答规则引擎 │ └── ui/ # 界面层 │ ├── bridge.py # secsgem 工作线程 → Qt 信号桥 │ ├── connection_panel.py # 连接面板 │ ├── body_tree.py # 消息体树形编辑器 │ ├── message_editor.py # 消息构造器 │ ├── message_log_view.py # 收发日志 + 解析详情 │ ├── quick_commands.py # 快捷指令 │ ├── auto_reply_panel.py # 自动应答规则管理 │ └── main_window.py # 主窗口 ├── tests/ # 测试 └── data/ ├── logs/ # 通信日志(JSONL) └── auto_reply.json # 自动应答规则配置 ``` ## 技术说明 - **协议栈**:secsgem 负责 HSMS 传输层(Active 连接、Select 状态机、超时重连、Linktest); SECS-II 编解码由本项目通用解码器实现(`eap_secs/secs/codec.py`),因此**任意 SxFy** (包括未在 secsgem 注册的自定义指令)都能正常收发与解析。 - **发送实现**:secsgem 的 `SecsStreamFunction` 子类按类属性绑定 SxFy, 本项目用动态子类(`RawFunction.create`)携带预编码原始字节走公开 API 发送。 - **线程模型**:secsgem 回调运行于其工作线程,经 `ClientBridge` 的 Qt Signal 队列转发到 GUI 主线程,界面无锁安全。