melvinchia3636/thermprint

GitHub: melvinchia3636/thermprint

一个通过逆向工程 BLE 协议实现的开源轻量级 Web 应用,用于将图像和二维码无线打印到便携式热敏打印机,摆脱了官方应用的广告与臃余功能。

Stars: 0 | Forks: 0

🧾 ThermPrint

一个轻量级、开源的 Web 应用,用于将图像和二维码打印到 BLE 热敏打印机。无广告,无臃肿,绝不废话。

## 🤔 问题背景 我从 Shopee 上随便买了一台便携式热敏图像打印机,打算为我的手账打印一些图片。收到货后,我安装了官方应用——尽管它的用户界面很漂亮,但充斥着我根本不需要的臃肿功能。作为一个极客,我必须深入研究一下。于是我下载了 APK 并将其反编译,在 ChatGPT、Claude Opus 和 Deepseek 的帮助下,我逆向工程了 BLE 数据传输协议,并开发了自己的替代应用。 ## ✅ 解决方案 最终的成果是一个轻量、整洁且极简的 Web 应用,让你可以直接从浏览器将图像和二维码打印到 BLE 热敏打印机。无广告,无臃肿,绝不废话。完全开源——你可以随心所欲地进行修改。 ## ✨ 功能特性 - **图像打印** - 上传任意图像,调整对比度/伽马值/旋转角度,预览结果后将其发送到打印机 - **二维码打印** - 从 URL 生成二维码,支持自定义尺寸、样式(方形、圆形、圆角、间隙、垂直/水平条纹)以及可选的内嵌 Logo - **实时队列** - 通过 WebSocket 实时更新任务状态,并为正在进行的打印任务提供进度条 - **持久化历史** - 得益于 SQLite 存储,打印任务在服务器重启后依然保留,支持分页浏览和预览缩略图 - **BLE 设备管理** - 扫描附近的打印机,选择并持久化保存你的设备名称 - **主题切换** - 从 35+ 种内置的 daisyUI 主题中进行选择,并持久化保存到 localStorage - **整洁极简的 UI** - 使用 React + Tailwind + DaisyUI 构建,对移动端和桌面端均有完美的响应式支持 ## 🖥 屏幕截图
image image image image image image
## 🔬 技术栈 ![skills](https://img.shields.io/badge/-TYPESCRIPT-FF0000?style=for-the-badge&logo=typescript&logoColor=white&color=blue) ![skills](https://img.shields.io/badge/-REACT-FF0000?style=for-the-badge&logo=react&logoColor=white&color=38BDF8) ![skills](https://img.shields.io/badge/-TAILWIND_CSS-FF0000?style=for-the-badge&logo=tailwindcss&logoColor=white&color=22D3EE) ![skills](https://img.shields.io/badge/-DAISYUI-FF0000?style=for-the-badge&logo=daisyui&logoColor=white&color=5A0EF8) ![skills](https://img.shields.io/badge/-PYTHON-FF0000?style=for-the-badge&logo=python&logoColor=white&color=3776AB) ![skills](https://img.shields.io/badge/-FASTAPI-FF0000?style=for-the-badge&logo=fastapi&logoColor=white&color=009688) ![skills](https://img.shields.io/badge/-SQLITE-FF0000?style=for-the-badge&logo=sqlite&logoColor=white&color=003B57) ![skills](https://img.shields.io/badge/-BLEAK-FF0000?style=for-the-badge&logo=bluetooth&logoColor=white&color=0082FC) **前端:** React, TypeScript, Tailwind CSS, DaisyUI, TanStack Query **后端:** Python, FastAPI, Uvicorn, Bleak (BLE), Pillow (图像处理), aiosqlite **协议:** 从官方 APK 逆向工程的 BLE GATT 通信协议 ## ⌨️ 设置说明 ### 前置条件 - Python 3.10+ - Node.js 18+ - 支持此特定协议的热敏打印机 ### 后端 ``` cd server uv venv source .venv/bin/activate uv pip install -r requirements.txt uvicorn server.app.main:app --reload --port 8000 ``` ### 前端 ``` cd client bun install bun run dev ``` 在浏览器中打开 `http://localhost:5173`。 ## 🧪 运行测试 ``` cd server source .venv/bin/activate pytest ``` ## 🔌 API 接口 | 方法 | 接口 | 描述 | |--------|----------|-------------| | `POST` | `/api/print` | 打印图像 | | `POST` | `/api/preview` | 预览图像 | | `POST` | `/api/qrcode` | 打印二维码 | | `POST` | `/api/qrcode/preview` | 预览二维码 | | `GET` | `/api/jobs` | 列出打印任务(分页) | | `DELETE` | `/api/jobs/{id}` | 取消任务 | | `DELETE` | `/api/jobs/{id}/delete` | 删除任务 | | `GET` | `/api/device` | 获取已配置的设备名称 | | `PUT` | `/api/device` | 更新设备名称 | | `GET` | `/api/devices` | 扫描 BLE 打印机 | | `GET` | `/api/status` | 获取连接状态 | | `GET` | `/api/settings` | 获取打印设置 | | `PUT` | `/api/settings` | 更新打印设置 | | `WS` | `/api/ws/jobs` | 实时任务更新 | | `WS` | `/api/ws/status` | 实时连接状态 | 当后端服务器运行时,可以通过访问 `http://localhost:8000/docs` 来使用交互式的 Swagger UI,它提供了一种便捷的方式来直接从浏览器探索和测试每一个接口。 ## 📈 项目状态 该项目的所有核心功能均已完成。如果你碰巧发现了任何错误,欢迎在此 GitHub 仓库中提交 issue。 ## 🙏 鸣谢 如果没有以下几款 AI 工具和资源的帮助,这个项目就不可能存在: - **[ChatGPT](https://chatgpt.com)** - 协助进行了初步的 APK 反编译分析和 BLE 协议发现 - 通过 Antigravity 使用的 **[Claude Opus](https://antigravity.ai)** - 深入研究代码库,实现了从反编译 APK 中提取的算法和协议移植 - 通过 OpenCode 使用的 **[Deepseek](https://opencode.ai)** - 协助构建了后端服务器和前端界面 - **[这篇文章](https://github.com/erkanybekov/BlutoothLan)** - 一个与我类似的项目,不过它是一个基于 Swift 构建的 iOS 应用。它给了我动力并证明了可行性 ## 🛒 购买打印机 本项目专为这款[Shopee 上在售的便携式热敏打印机](https://shopee.com.my/product/12011726/19010120735)而开发。如果你想亲自尝试,可以买一台并按照上面的设置说明进行操作。 ## 📄 许可证 本项目基于 MIT 许可证授权。
标签:BLE热敏打印机, DaisyUI, React, SQLite, Syscalls, Tailwind CSS, WebSocket, Web打印应用, 个人项目, 二维码生成, 二进制发布, 云资产清单, 依赖分析, 图像打印, 图片处理, 开源工具, 打印队列管理, 无冗余功能, 无广告, 极简主义, 物联网设备, 移动端响应式, 自定义主题, 蓝牙低功耗, 蓝牙打印机, 跨平台Web应用, 轻量级应用, 逆向工具, 逆向工程