一个用 Qt 写的工业设备批量运维工具。v2.4 把 FTP 部署从表单变成了双栏文件管理器,v2.5 补完了远程文件管理能力并针对 SylixOS 嵌入式设备做了深度适配。
它是什么
DeviceForge 是一个基于 Qt 6 + C++17 的 Windows 桌面应用,用来对 PLC 设备做批量运维:FTP/FTPS 部署固件、Telnet/SSH 批量执行命令、Modbus 寄存器读写、OPC UA 客户端、WebSocket 通信、TCP/UDP 网络调试中继。
前身叫 DeployMaster,2026 年 7 月改名。面向 PLC、嵌入式终端、网络设备等工业硬件的「部署 → 测试 → 运维」场景。
更多功能请去 github 网站查看。
开源,GitHub:turnarond/DeviceForge
为什么又造一个轮子
市面上不缺 FTP 工具。FileZilla、WinSCP、Total Commander 的 FTP 插件都是成熟产品。但它们有一个共同缺陷:只能一对一手动操作。
实际场景是这样的:一套固件需要同时部署到 5 台、10 台甚至更多的 PLC 设备上。用传统工具的做法是——连上第一台,传文件,断开;连第二台,传文件,断开……反复操作。每台设备传完后还要手动检查文件列表确认上传成功。
DeviceForge 的设计出发点就是:一次操作,并行部署到多台设备,传完自动刷新远程目录,一眼就能确认结果。
这是传统 FTP 工具做不到的事。
v2.4 做了什么
1. FTP 部署从表单变成双栏文件管理器
之前: 一个纵向表单——选设备 → 填路径 → 弹对话框添加文件 → 点按钮部署。每次加文件都要弹 Windows 文件对话框,看不到远程目录,传完不知道到底有没有成功。
现在: QSplitter 双栏——左侧本地目录树(QFileSystemModel),右侧远程 FTP 目录表格(自定义 QAbstractTableModel)。直接在两侧浏览、拖拽上传、右键管理远程文件。
几个实际有用的细节:
- 拖拽上传:从 Windows 资源管理器拖文件到右侧远程面板,直接上传
- 部署后自动刷新:传完自动刷远程面板,不需要手动点刷新
- 并行部署:多台设备同时上传
- 面包屑导航:任意层级跳转
2. 布局从传统 Qt 变成左侧导航栏
之前: 顶部 QTabWidget 水平标签页 + 右侧远端预览面板 + 底部日志。这是 Qt 应用最经典的布局,但也最显旧。
现在:
┌──────┬───────────────────────────────────────────────┐
│ 📁 │ [📡 192.168.1.100 ×] [📡 192.168.1.101 ×] │
│ 文件 │ [👤 admin] [🔑 ****] │
│ 部署 ├───────────────────────────────────────────────┤
│ │ │
│ 📝 │ 工具工作区(全宽) │
│ 批量 │ │
│ 命令 │ │
│ │ │
│ 🔌 ├───────────────────────────────────────────────┤
│ Web │ 📋 全局日志 [▲ 折叠] │
│Socket│ │
└──────┴───────────────────────────────────────────────┘
- 左侧 72px 竖排导航栏:图标 + 中文标签,活跃态琴色高亮
- 设备栏从厚重横条变成胶囊标签:石墨底 + 琴色选中态边框
- 底部日志可折叠:新日志到达时折叠条闪烁琴色提示
- 6 个 Tool 日志统一:所有消息路由到底部全局日志
v2.5 做了什么
1. 远程文件管理补完
v2.4 的双栏只支持浏览和上传,右键菜单里的「重命名」「新建目录」是灰的。v2.5 把它们全部实现了:
- 重命名(FTP RNFR/RNTO / SFTP rename)
- 新建目录(FTP MKD / SFTP mkdir)
- 目录递归删除:列出内容 → 逐项删除文件 → 删除空目录(FTP DELE→RMD / SFTP 递归)
- 下载到本地:保存对话框默认定位到用户目录
- 远程文件精确对比:本地选中文件后,远程列表中同名文件按大小精确匹配着色(绿=一致,黄=有差异)
2. SFTP 文件管理
FTP 双栏新增协议切换下拉框(FTP / SFTP)。SFTP 模式通过 libssh2 的 SFTP 子系统提供完整的文件管理能力:列目录、上传、下载、删除、重命名、新建目录。
一个诚实的说明:SFTP 的批量部署尚未接通——当前 SFTP 只支持远程文件浏览和管理,点部署会提示切换 FTP。选择这个边界是因为 SylixOS 设备走 FTP 是主流路径,SFTP 部署的优先级排在后面。
3. SylixOS 深度适配
这是 v2.5 最花功夫的部分。SylixOS 自带的 FTP 服务器(lwip_ftpd)与标准服务器行为有差异,逐个适配:
| 差异 | 适配 |
|---|---|
| 不支持 EPSV 命令 | 强制使用 PASV 被动模式 |
cd() 只支持单级路径 | curl 改用 MULTICWD 逐级进入目录(CWD apps → CWD xxx) |
LIST 不返回 . 和 .. | 客户端补充 .. 导航条目,过滤 . |
| QUOTE 命令后 curl 会误触发 RETR 预检 | 命令改用根 URL + 绝对路径 |
| DELE 失败多为文件不存在 | 错误处理优化(区分真实原因) |
实测中遇到过的一个坑:schneider_system_test 这类挂载点路径,服务器端 CWD 行为异常,无法通过 FTP 进入或删除——这不是客户端能解决的,需要在设备上先 umount。
4. 使用体验
- 选择性部署:勾选设备胶囊即可只部署到部分设备(10 台中选 5 台)
- 连接缓存:同设备导航复用已建立的 FTP 连接,不再每次重新登录
- 部署取消:进度条旁取消按钮可中止进行中的传输
- 远程列表排序:点击列头排序,目录优先,
./..置顶
技术实现
堆栈
| 层 | 技术 |
|---|---|
| UI | Qt 6.11.1 Widgets,QSS 深色主题 |
| 构建 | CMake 3.22+,Visual Studio 2022 |
| FTP | libcurl 8.20.0,FTPS 加密 |
| SFTP/SSH | libssh2 |
| OPC UA | open62541 v1.5.5(UA_MULTITHREADING=100) |
| 配置持久化 | SQLite + Windows DPAPI 加密(ConfigStore) |
架构
Tool = ToolBackend (ServiceTask) + ToolWidget (QWidget)
↕ lwmsgq 消息队列解耦
统一 IProtocolAdapter 接口 + ProtocolRegistry 工厂
6 个 Tool(FTP 双栏 + SFTP 文件管理 / Telnet+SSH / WebSocket / Modbus / 网络中继 / OPC UA)都遵循 Backend + Widget 配对模式。
诚实的限制
还没有的东西
- SFTP 批量部署:SFTP 仅支持文件浏览/管理,部署会提示切换 FTP
- OPC UA 安全策略:目前只支持 None 安全策略 + 匿名认证。Basic256 和证书认证暂不作为优先方向
- 单元测试覆盖率低:目前 6 个测试目标,FtpAdapter/TelnetAdapter 还没写测试
- 仅 Windows:CMake 已就绪,但未在 Linux 上完整验证
可能会劝退的点
- 这是 Qt Widgets 应用,不是 Electron 套壳。界面不会像网页那样花哨
- 没有安装包,目前是 CMake 构建出 exe
总结
DeviceForge 不是一个"全面碾压现有工具"的产品,而是在特定场景(工业 PLC 批量部署)下做对了关键差异化的工具:
- 多设备并行部署——传统 FTP 工具做不到
- 双栏文件管理器——不再需要在系统和应用之间反复切窗
- SylixOS 深度适配——针对实际目标设备的行为差异逐个解决
如果你也经常给 PLC 设备批量传固件、敲命令、读寄存器——可以试试。如果只是偶尔传一个文件到一台服务器,FileZilla 足够了。
GitHub:turnarond/DeviceForge
作者:turnarond | 2026-08-06