clarkse/dh360d

GitHub: clarkse/dh360d

Darkflash DH360D 一体式水冷散热器 LCD 屏幕的 Linux 驱动程序,通过逆向串口协议让屏幕在 Linux 上显示实时系统状态。

Stars: 0 | Forks: 0

# dh360d — Darkflash DH360D AIO LCD 的 Linux 驱动程序 **Darkflash DH360D**(“DH 空间站”)是一款 360 mm 一体式水冷散热器,其水泵配备了一块小型 **LCD 屏幕**,用于显示实时的 PC 状态(CPU 温度、CPU 使用率、内存、水泵 RPM)。厂商**仅提供了一个 Windows 应用程序**来驱动该屏幕——没有任何针对 Linux 的支持。 `dh360d` 是一个轻量级、低依赖的 **Linux 驱动程序**,它直接使用散热器的串口协议进行通信,从而让该屏幕在 Linux 上显示实时状态,且在运行时**无需 Windows、无需 Wine,也无需专有驱动**。一个 systemd 服务会持续更新数据,并在每次重启后自动恢复运行。 ## 为什么会有这个项目 DH360D 的屏幕并不是一个通用的 USB 显示器——它是由厂商闭源的 Windows 应用程序通过串口连接来驱动的。在 Linux 上,该散热器仍然可以完美地进行水泵循环和散热(它是一个普通的 AIO),但由于没有 Linux 软件,屏幕会一直处于黑屏/无更新状态。本项目填补了这一空白:它实现了与 Windows 应用程序相同的底层通信协议,从内核读取您的 CPU 温度/使用率/内存,并将这些数据推送到水泵屏幕上。 ## 硬件 / 规格 | | | |---|---| | **散热器** | Darkflash DH360D(“DH 空间站”),配备水泵 LCD 的 360 mm 一体式水冷 | | **桥接芯片** | WCH **CH340** USB 转 UART(USB `1a86:7523`;也包括 `:7522/:5523/:e523`) | | **Linux 内核驱动** | 内置 `ch341`(`ch341-uart`)——已经包含在内,无需安装 | | **显示为** | `/dev/ttyUSB0`(本包还添加了一个固定的 `/dev/dh360d` 符号链接) | | **串口参数** | **115200 baud, 8N1**,无流控制 | | **协议** | `[CMD][LEN][DATA]`,无校验和(参见 [docs/PROTOCOL.md](docs/PROTOCOL.md)) | 该散热器**不**以 USB-HID 或 WinUSB 形式出现;它是一个普通的 USB 转串口设备。 ## 安装 ### 选项 A — Debian/Ubuntu 软件包(推荐) ``` # 构建 .deb (只需要 dpkg-deb,Debian/Ubuntu 上已经自带) ./packaging/build-deb.sh sudo apt install ./dist/dh360d_1.0.0-1_all.deb ``` 该软件包依赖于 `python3-serial` 和 `python3-psutil`(由 apt 自动拉取),并安装 `dh360d` CLI、udev 规则以及一个**会自动启用并启动**的 systemd 服务——因此屏幕会立即亮起,并且在每次开机时都会自动运行。 ### 选项 B — 源码安装(适用于任何 systemd 发行版) ``` sudo ./install.sh # installs deps, CLI, udev rule, systemd service (enabled) ``` ### 选项 C — 仅使用 Python(无服务) ``` pip install . # or: pip install pyserial psutil && python -m dh360d ... ``` 安装后,将您自己添加到 `dialout` 组中以进行非 root 的 CLI 使用(`sudo usermod -aG dialout "$USER"`,然后重新登录)。该服务以 root 身份运行,不需要此操作。 ## 用法 ``` dh360d detect # find the cooler's serial port dh360d handshake --reset # send 02 01 00, expect reply 31 # 向 screen 推送一个单次 frame: dh360d push --cpu-temp 55 --pump-rpm 2600 --cpu-usage 30 --ram-usage 45 # 持续 stream 实时 host sensors (即 service 运行的内容): dh360d daemon -v ``` ### systemd 服务 由 `.deb`/`install.sh` 安装,并在开机时启用: ``` systemctl status dh360d journalctl -u dh360d -f ``` 配置文件位于 **`/etc/default/dh360d`**: ``` # DH360D_PORT=/dev/dh360d # 指定一个 port;未设置 = 自动检测 CH340 DH360D_INTERVAL=1.0 # seconds between screen updates ``` 守护进程会自动检测端口,如果散热器被拔出则会重试,并在其重新连接时恢复——因此它无需人工干预即可在挂起/重新插拔后保持运行。 ## 协议摘要 完整的详细信息及证明这些信息的抓包数据位于 **[docs/PROTOCOL.md](docs/PROTOCOL.md)**。 ``` Transport : CH340 USB-UART -> /dev/ttyUSB0 , 115200 8N1 Framing : [CMD:1] [LEN:1] [DATA: LEN bytes] (no checksum, no escaping) Handshake : host 02 01 00 -> device 31 (31 21 on a fresh boot) Status : host 01 0A <10 bytes> -> device 21 (ACK) , ~1 Hz the 10 data bytes are five 16-bit BIG-ENDIAN fields: bytes 0-1 CPU temperature (°C) bytes 2-3 pump RPM (shown as "RPM") bytes 4-5 fan RPM (not shown on this screen model) bytes 6-7 CPU usage (%) bytes 8-9 RAM usage (%) ``` ## 构建过程 厂商应用程序是一个 **Electron** 程序;面向设备的逻辑被编译成了 V8 字节码,因此无法简单地从二进制文件中读取协议常量。该协议是通过动态分析恢复出来的,随后进行了验证: 1. **静态解包。** 解开了安装程序(NSIS → `app-64.7z` → `app.asar`)。发现唯一的硬件依赖是 `serialport`,并且内置的 Windows 驱动程序是 WCH 的 `CH341SER` → 该散热器是一个 **CH340 串口设备**,而不是 HID。Linux 的 `ch341` 驱动已经涵盖了此设备。 2. **在 Wine 下运行真实的应用程序并进行串口中间人分析。** 该应用程序自带了 Electron 运行时,因此可以在 Wine 下运行。在应用程序和真实的 `/dev/ttyUSB0` 之间插入了一个 `socat` PTY,以记录每一个字节。由于 `serialport.list()` 在 Wine 下不会返回任何内容,因此添加了一个小的 **PnP “Ports” 注册表项**(`USB\VID_1A86&PID_7523`),以使应用程序能够枚举并打开端口。随后应用程序成功连接,水泵屏幕被点亮,完整的交互过程也被捕获。 3. **解码数据帧。** 捕获的数据展示了简单的 `[CMD][LEN][DATA]` 帧——握手信号 `02 01 00`→`31`,接着是 12 字节的状态帧 `01 0A …`,并通过 `21` 进行 ACK 确认。(应用程序中还存在的 HDLC/标志/转义/校验和机制是一个*独立*的通道,仅用于向屏幕传输图像,而不用于传感器数据。) 4. **将字段与屏幕进行映射。** 通过发送具有不同逐字段值的流式数据帧,并读取屏幕上的仪表读数,确定了 10 字节的 payload 对应五个 16 位的大端序字段(温度 / 水泵 RPM / 风扇 RPM / CPU% / RAM%)。 5. **从 Linux 进行验证。** 随后,本工具直接通过 `/dev/ttyUSB0` 驱动了屏幕——实现了端到端的协议确认。 更详细的分析记录位于 [docs/REVERSE-ENGINEERING.md](docs/REVERSE-ENGINEERING.md)。 ## 故障排除 - **找不到端口:** `dmesg | grep ch341` 应该会显示 `ch341-uart converter now attached to ttyUSB0`。如果 `brltty` 抢占了 CH340,请移除或屏蔽它。 - **`handshake` 没有返回:** 尝试 `dh360d handshake --reset`(通过改变 DTR/RTS 电平来重置水泵 MCU)。如果散热器刚刚由 Windows 应用程序驱动过,请对其执行一次电源循环。 - **屏幕显示的字段有误:** 字节布局记录在 `docs/PROTOCOL.md` 中;请提交一个 issue,并附上您发送的数据与屏幕显示的内容。 ## 免责声明 这是一个独立的、非官方的项目。不隶属于 Darkflash/DarkFlash,也未获得其认可。协议事实是通过观察作者所拥有设备的通信流量来获取的,目的是为了实现互操作性。本代码仓库不包含任何厂商代码。使用风险由您自行承担。 ## 许可证 MIT — 详见 [LICENSE](LICENSE)。
标签:逆向工具