0iroN/trvision

GitHub: 0iroN/trvision

一个用于将桌面画面绕过官方 TRCC 软件直接流式传输到 Thermalright Vision USB 显示屏的 Python 工具。

Stars: 0 | Forks: 0

# trvision 将您的桌面画面流式传输到 **Thermalright Vision USB 显示屏** —— 无需运行 TRCC。 ![Python](https://img.shields.io/badge/Python-3.12-3776AB?logo=python&logoColor=white) ![平台](https://img.shields.io/badge/platform-Windows-0078D6?logo=windows&logoColor=white) ![许可证: MIT](https://img.shields.io/badge/License-MIT-green.svg) ## 为什么开发 TL-M10 Vision / Mjolnir Vision 面板通过内部 USB 2.0 插座接入,通常由 Thermalright 自家的 Windows 应用程序 **TRCC** 驱动。我希望面板能显示*我*选择的内容 —— 即我的桌面画面区域,进行实时传输 —— 而无需在后台保持运行 TRCC。因此,trvision 直接通过 USB 与面板通信:抓取屏幕,编码成帧,然后推送出去。 ## 当前状态 **正常运行中。** 它在我的机器上驱动了两块面板(一块 320×240 和一块 1920×462)—— 捕获 → JPEG → USB,目标 30 FPS。协议细节来源于社区逆向工程(已在下文致谢),并在此硬件上经过实证确认;其他版本的面板可能会有不同的表现。 ## 硬件 | | | | --- | --- | | 设备 | `USBDISPLAY` — **VID `0x87AD`, PID `0x70DB`**(ChiZhu Tech 系列) | | 驱动 | **WinUSB**,通过 MS OS descriptors 自动绑定 —— **不需要 Zadig** | | 接口 | 厂商自定义类 `0xFF`,bulk endpoints | | 面板尺寸 | 根据握手响应得出,或者通过 `config.py` 中的序列号对照表获取 | ## 工作原理 - **握手 (Handshake)** — 发送一个 64 字节的数据包;设备会回复 1024 字节。回复中的两个字节(`PM`, `SUB`)描述了面板信息。`PM=32` 的面板需要原始的 RGB565(big-endian);其余面板则接受 JPEG。 - **帧 (Frame)** — 包含一个 64 字节的 header(magic, command, width, height, payload length),后跟编码后的图像。 - **传输 (Transfer)** — 以 16 KiB 的 bulk chunks 写入,当总大小是 512 的整数倍时,会附加一个零长度数据包。 - 固件会在帧流停止传输的瞬间使面板黑屏,因此 trvision 会保持持续发送。 屏幕捕获使用 **dxcam**(GPU Desktop Duplication),如果 dxcam 不可用,则回退到 **mss**。 ## 安装 Windows 环境下使用 Python **3.12**(dxcam wheels 在此版本下兼容性最好): ``` py -3.12 -m venv venv venv\Scripts\activate pip install -r requirements.txt ``` ## 用法 ``` python tools\usb_enum.py # list devices and endpoints python tools\live_test.py --send-frame # handshake + push one solid color python main.py --dry-run # capture/encode speed, no device needed python main.py --serial 2d1d021814a37504 --seconds 10 # 10-second test on one panel python main.py --region 0,0,800,480 # stream a desktop region, forever ``` 其余所有配置都位于 `config.py` 中:USB 标识、特定序列号对应的面板分辨率、捕获区域、目标 FPS、JPEG 画质、针对单个面板的变换(针对倒置安装进行旋转 180° / 镜像翻转),以及是否绘制鼠标光标(dxcam 不会捕获鼠标)。 ## 工具 - **`tools/analyze_pcap.py`** — 一个独立的 USBPcap `.pcapng` 解析器,无需任何依赖,也不需要 Wireshark。它会遍历抓包数据,解码帧 header,并可以提取传输的图像(`--extract`)。在为表现不同的面板添加支持时,首选此工具。 - **`tools/usb_enum.py`** — endpoint 发现。 - **`tools/live_test.py`** — 最小化的端到端检查:握手,打印 `PM`/`SUB`,可选推送一帧纯色图像。 ## 注意事项 - 目前仅限 Windows —— 捕获层使用的是 Desktop Duplication。USB 通信部分是可移植的;缺失的仅仅是一个 Linux 的捕获后端。 - 仅针对 `87AD:70DB` 面板进行了测试。其他 Thermalright 显示器可能使用完全不同的协议。 - USB 2.0 的带宽是真正的瓶颈,这就是为什么在支持的面板上,帧会以 JPEG 格式输出的原因。 ## 许可证 [MIT](LICENSE) © Osman Demir · [osmandemir.net](https://osmandemir.net)
标签:Python, USB硬件通信, WinUSB, 屏幕捕获, 无后门, 桌面投影, 硬件控制, 逆向工具