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)。
标签:逆向工具