# netterminal **Repository Path**: alvari/netterminal ## Basic Information - **Project Name**: netterminal - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-02 - **Last Updated**: 2026-05-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一、安装 1. PyQt5(含QT Designer) 2. QFluentWidgets 使用与安装见https://qfluentwidgets.com/zh/pages/about # 二、文件结构 ```bash D:. |-- .vscode | |-- launch.json | +-- settings.json |-- core 核心逻辑 | |-- app 继承自core/ui中的Ui_xxx.py中的类,以实现功能与界面的隔离 | | |-- __init__.py | | |-- Frequency_pattern.py 跳频图样与网络拓扑界面 | | |-- jammer.py 干扰界面 | | |-- ParameterSetting.py 参数设置界面 | | |-- Return_indicators.py 统计回传界面 | | +-- ScriptSetting.py 脚本设置与数据链启动界面 | |-- components 实现下发端机指令的具体逻辑,每一个子文件夹以界面名命名,其存放对应界面执行的具体逻辑 | | |-- Frequency_pattern | | | |-- __init__.py | | | |-- patterndef.py | | | +-- returndata.py | | |-- ParameterSetting | | | |-- ComExtractParameters.py | | | +-- Param.py | | |-- Return_indicators | | | +-- returndata.py | | |-- ScriptSetting | | | |-- __init__.py | | | +-- commandgen.py | | +-- __init__.py | |-- devices 上位机的最底层,也是直接与端机交互的一层 | | |-- __init__.py | | |-- delay_calculation.py 计算转发式干扰的时延 | | |-- model.py 用于定义网络拓扑类、节点ip映射表、节点序号映射表、节点间距距离类 | | |-- model_server.py 维护model.py中定义的对象与表,每次启动时新建,进程结束后清除 | | |-- packtest.py 下发具体的指令给端机 | | +-- returnserver.py 回传监听 | |-- scripts 脚本文件,定义演绎剧本 | | |-- script.json | | +-- script.md 脚本格式说明 | +-- ui Designer创建UI界面,QFluentWidgets美化界面 | |-- images 上位机logo | | +-- logo.png | |-- __init__.py | |-- Frequency_pattern.ui | |-- jammer.ui | |-- ParameterSetting.ui | |-- Return_indicators.ui | |-- ScriptSetting.ui | |-- Ui_Frequency_pattern.py | |-- Ui_jammer.py | |-- Ui_ParameterSetting.py | |-- Ui_Return_indicators.py | +-- Ui_ScriptSetting.py |-- logs | |-- commandgen.log | |-- jammer.log | +-- returndata.log |-- Main.py 程序入口,QFluentWidgets主界面以及子界面Tab解锁上锁逻辑 +-- README.md ``` # 三、指令集(数据包格式) ## 上位机->端机 * 大端序(Big Endian):数据的高位字节存储在内存 / 传输的低地址 / 先发送位置,低位字节存储在高地址 / 后发送位置。符合人类的阅读习惯(比如我们写数字1234,总是高位1在前,低位4在后)。用简写BE来表示。 * 小端序(Little Endian):数据的低位字节存储在内存 / 传输的低地址 / 先发送位置,高位字节存储在高地址 / 后发送位置。是大多数计算机(x86/x86_64 架构)的默认存储方式。用简写LE来表示。 下表默认情况下采用16频点,每频点2Byte,身份标识1Byte | 功能 | Header(2 Bytes) | Priority(1 Byte) | Length(2 Bytes) | Payload(可变长) | | :--------------------------- | :-------------: | :--------------: | :--------------: | :------------------------------------- | | 待发数据 | 0xAAAA | 优先级 | len(payload) | payload | | 初始参数 | 0xAAAB | 无此字段 | 12 | 1 Byte跳频图样、4 Byte发送间隔、1 Byte功率、2 Byte载波频率、4 Byte跳速 | | 所有通信成员跳频频率表集合 | 0xAAAC | 无此字段 | len(payload) | 大端序、16×2 Bytes | | 所有通信成员跳频序列集合 | 0xAAAE | 无此字段 | 5×(1+16×2) Bytes | 跳频成员数×(1 Byte成员标识+16×2 Bytes) | | 发送端-目的端机的跳频序列表 | 0xAAAD | 无此字段 | len(payload) | 大端序、16×2 Bytes | | 发送功率 | 0xAAAF | 无此字段 | 1 Byte | 1 Byte 功率值 | | 跳频起始时间+同步时间 | 0xABAB | 无此字段 | 16 Bytes | 8 Byte跳频起始时间+8 Byte同步时间 | | 无线电静默(不发送但进程存在) | 0xABAD | 无此字段 | 0 | 无 | | 接收方备份数据 | 0xABAA | 无此字段 | 0 | 无 | | 组网信号 | 0xABAC | 无此字段 | 0 | 无 | | 开始广播 | 0xABAE | 无此字段 | 0 | 无 | | 停止广播 | 0xABAF | 无此字段 | 0 | 无 | | 压制干扰攻击 | 0xAFAA | 无此字段 | len(payload) | 1Byte功率+1Byte节点+可变长载荷 | | 脉冲阻断攻击 | 0xAFAB | 无此字段 | len(payload) | 4Byte转发时延(float)+1Byte功率+1Byte节点+可变长载荷 | | 报文碰撞攻击 | 0xAFAC | 优先级 | len(payload) | 1Byte节点号+干扰数据 | | 路由泛洪入侵 | 0xAFAD | 优先级 | 2 | 1Byete报文间隔+1Byte功率 | | 路由黑洞入侵 | 0xAFAE | 无此字段 | 0 | 无 | ## 端机->上位机 | 功能 | Header(2 Bytes) | Length(2 Bytes) | Payload(可变长) | | :----------- | :-------------: | :-------------: | :-------------- | | 发送序列号 | 0xAABA | len(payload) | 4 Bytes(发送方发送数据包序列号) | | 发送成功率 | 0xAABB | len(payload) | payload | | 接收序列号 | 0xAABC | len(payload) | 4 Bytes(接收方接收数据包序列号) | | 发送频点反馈 | 0xBABA | len(payload) | payload | | 接收频点反馈 | 0xBABB | len(payload) | payload | | 结束侦听 | 0xBBAC | 0 | None | | 开始侦听 | 0xBBAD | 0 | None | # 四、查看更长时间的统计数据 ```bash # 启动前添加环境变量 $env:NETTERMINAL_METRIC_HISTORY_MAX="10000" # 添加后启动程序 python .\Main.py ``` # 五、离线部署 ```bash # 离线包制作(用户不要使用此命令!) pip freeze > requirements.txt mkdir packages pip download -r requirements.txt -d packages # 打开项目根目录,安装anaconda后执行 pip install --no-index --find-links=packages -r requirements.txt ``` # 六、Windows 打包交付 本项目交付给甲方时只需要提供: ```powershell dist\setup.exe ``` 甲方电脑不需要安装 Python、Anaconda、pip 或项目依赖。`setup.exe` 会把完整运行目录安装到: ```powershell %LOCALAPPDATA%\NetTerminal ``` 并创建桌面快捷方式和开始菜单卸载入口。 ## 1. 打包前准备 下面D:\WORKSPACE\Vscode_Project指代当前项目的绝对路径 D:\WORKSPACE\Anaconda_Project\pyqt指代本项目使用的虚拟环境路径 以下命令均在项目根目录执行: ```powershell cd D:\WORKSPACE\Vscode_Project\netterminal ``` 先确认打包用的 `pyqt` 环境里有项目依赖和 PyInstaller: ```powershell D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -c "import PyQt5, qfluentwidgets, numpy, pandas; print('deps ok')" D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -m pip install PyInstaller==6.11.1 backports.tarfile D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -m PyInstaller --version ``` 如需重新下载离线依赖: ```powershell D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -m pip download -r requirements.txt -d packages D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -m pip download PyInstaller==6.11.1 backports.tarfile -d packages ``` ## 2. 清理旧后台进程 重新打包或重新安装前,建议先关闭旧后台服务,避免端口 50007 被旧进程占用: ```powershell taskkill /IM NetTerminal.exe /F taskkill /IM model_server.exe /F taskkill /IM packtest.exe /F ``` 这些命令如果提示找不到进程,可以忽略。 ## 3. 语法检查 ```powershell D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -m compileall -q Main.py core build_tools ``` ## 4. 打包主程序 ```powershell D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -m PyInstaller --noconfirm --clean --onedir --windowed --name NetTerminal --icon core\ui\images\logo.ico --add-data "core;core" --collect-all qfluentwidgets --collect-all qframelesswindow Main.py ``` 输出目录: ```powershell dist\NetTerminal # 还会产生打包缓存文件 build\NetTerminal ``` ## 5. 打包后台服务 `model_server` 使用 onefile,主程序启动时会自动拉起它: ```powershell D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -m PyInstaller --noconfirm --clean --onefile --console --name model_server --add-data "core;core" core\devices\model_server.py ``` returnserver 和 returnliveserver 不是独立程序,它们是被主程序直接 import 进来的类主程序启动后是在当前 NetTerminal.exe 进程里创建对象,再用线程跑 UDP 服务。也就是说它们属于主程序内部模块,PyInstaller 打包 Main.py 时会自动把这些被 import 的模块一起收进去,所以不需要单独生成 returnserver.exe 或 returnliveserver.exe。 复制到主程序目录: ```powershell Copy-Item -LiteralPath dist\model_server.exe -Destination dist\NetTerminal\model_server.exe -Force ``` ## 6. 打包 packtest 工具 `packtest` 使用 onedir,避免按钮每次调用 onefile 时重复解压导致黑框和卡顿: ```powershell D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -m PyInstaller --noconfirm --clean --onedir --console --name packtest --add-data "core;core" core\devices\packtest.py ``` 复制到主程序目录: ```powershell if (Test-Path dist\NetTerminal\tools\packtest) { Remove-Item -LiteralPath dist\NetTerminal\tools\packtest -Recurse -Force } New-Item -ItemType Directory -Path dist\NetTerminal\tools -Force | Out-Null Copy-Item -LiteralPath dist\packtest -Destination dist\NetTerminal\tools\packtest -Recurse -Force ``` 程序运行时会优先调用: ```powershell %LOCALAPPDATA%\NetTerminal\tools\packtest\packtest.exe ``` ## 7. 打包卸载程序 ```powershell D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -m PyInstaller --noconfirm --clean --onefile --console --name uninstall build_tools\uninstaller.py ``` 复制到主程序目录: ```powershell Copy-Item -LiteralPath dist\uninstall.exe -Destination dist\NetTerminal\uninstall.exe -Force ``` ## 8. 生成最终安装包 ```powershell D:\WORKSPACE\Anaconda_Project\pyqt\python.exe -m PyInstaller --noconfirm --clean --onefile --console --name setup --add-data "dist\NetTerminal;payload" build_tools\setup_installer.py ``` 最终交付文件: ```powershell dist\setup.exe ``` ## 9. 安装验证 可用临时目录验证安装包,不污染真实用户目录: ```powershell $root=(Resolve-Path .).Path $test="$root\install_test" if (Test-Path $test) { Remove-Item -LiteralPath $test -Recurse -Force } $env:LOCALAPPDATA="$test\LocalAppData" $env:APPDATA="$test\AppData\Roaming" $env:USERPROFILE="$test\UserProfile" .\dist\setup.exe ``` 验证安装后文件是否存在: ```powershell Test-Path "$test\LocalAppData\NetTerminal\NetTerminal.exe" Test-Path "$test\LocalAppData\NetTerminal\model_server.exe" Test-Path "$test\LocalAppData\NetTerminal\tools\packtest\packtest.exe" Test-Path "$test\LocalAppData\NetTerminal\uninstall.exe" ``` 验证主程序和后台端口: ```powershell $app="$test\LocalAppData\NetTerminal\NetTerminal.exe" $p=Start-Process -FilePath $app -WorkingDirectory (Split-Path $app) -WindowStyle Hidden -PassThru Start-Sleep -Seconds 20 Test-NetConnection -ComputerName 127.0.0.1 -Port 50007 -InformationLevel Quiet Stop-Process -Id $p.Id -Force taskkill /IM model_server.exe /F ``` ## 10. 常见问题 如果安装后提示 `No module named core` 或 `No module named model`,通常是旧版 `model_server.exe` 残留占用了 50007 端口。处理方式: ```powershell taskkill /IM model_server.exe /F ``` 然后重新启动程序。 如果点击按钮弹出黑框或响应慢,确认安装目录中存在: ```powershell %LOCALAPPDATA%\NetTerminal\tools\packtest\packtest.exe ``` 并确认当前代码中的 `packtest` 调用使用 `CREATE_NO_WINDOW`。