DeviceForge v2.5:一个工业设备运维工具的现代化历程

110 阅读6分钟

一个用 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 连接,不再每次重新登录
  • 部署取消:进度条旁取消按钮可中止进行中的传输
  • 远程列表排序:点击列头排序,目录优先,./.. 置顶

技术实现

堆栈

层技术
UIQt 6.11.1 Widgets,QSS 深色主题
构建CMake 3.22+,Visual Studio 2022
FTPlibcurl 8.20.0,FTPS 加密
SFTP/SSHlibssh2
OPC UAopen62541 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 批量部署)下做对了关键差异化的工具:

  1. 多设备并行部署——传统 FTP 工具做不到
  2. 双栏文件管理器——不再需要在系统和应用之间反复切窗
  3. SylixOS 深度适配——针对实际目标设备的行为差异逐个解决

如果你也经常给 PLC 设备批量传固件、敲命令、读寄存器——可以试试。如果只是偶尔传一个文件到一台服务器,FileZilla 足够了。

GitHub:turnarond/DeviceForge


作者:turnarond | 2026-08-06