stev0760/Vibe-D30

GitHub: stev0760/Vibe-D30

从零逆向工程 Phomemo D30 蓝牙热敏标签打印机的通信协议,为其提供完整的 Linux 驱动和基于 Web 的所见即所得标签编辑器。

Stars: 0 | Forks: 0

# Vibe-D30 一款从零开始编写的 Linux 驱动 **和 WYSIWYG 标签编辑器**,专为 Phomemo D30 打造。这是一款廉价的、仅支持 BLE 的热敏标签打印机,其官方 App 仅支持 Android/iOS。通过直接扫描设备进行了逆向工程 (参见 [docs/hardware.md](docs/hardware.md) 和 [docs/ble.md](docs/ble.md)), 并交叉参考了针对同一款打印机的早期开源项目 — 随后将其 vibe-coded(凭直觉编程)为适用于该设备的全功能标签制作应用。 该打印机通过 BLE GATT 传输标准的 Epson ESC/POS "GS v 0" 光栅数据 — 完全不需要操作系统级别的蓝牙配对,这就是为什么它在任何 系统蓝牙 UI 中都无法“配对”的原因(也是为什么在 `lsusb` 中查看 USB 什么也看不到的原因:该接口 仅支持充电)。BlueZ 的情况比这句话所描述的还要糟糕; [docs/ble.md](docs/ble.md) 中记录了关于 bearer 选择的完整曲折历程。 ## Web 编辑器 ``` .venv/bin/uvicorn server.app:app --port 8330 # 然后打开 http://127.0.0.1:8330 ``` - 自由绘制的标签画布:拖拽/缩放/微调元素,适配视图缩放, 真实的打印预览(画布下方的长条是真正的 1-bpp 渲染图 — 像素级还原实际打印效果) - 支持任何已安装**系统字体**的**文本**(通过 fontconfig 枚举, 并使用 FontFace API 加载到浏览器中),支持自适应尺寸调整, 支持粗体/斜体(在画布内合成,从而保证 WYSIWYG) - 支持使用 Floyd–Steinberg 抖动或阈值化处理的**图像** - **图标**:内置 1995 个可搜索的 Lucide 图标 - **打印起始偏移控制与校准**:走纸的起始位置取决于上一张标签被撕下的位置,因此打印工具栏 提供了一个偏移字段和一个“校准”按钮,用于打印一把毫米刻度尺 — 0 刻度处的剩余误差正是你需要输入的校正值 - 支持多份打印、固定/自动标签长度、模拟运行开关,文档将持久化存储在 localStorage 中 在服务器上设置 `D30_DRY_RUN=1` 可以在 开发期间强制所有打印执行模拟运行;设置 `D30_ADDRESS=` 可指向其他设备。 ## CLI ``` .venv/bin/python -m d30 "Hello World!" --length-mm 40 # dry run .venv/bin/python -m d30 "Hello World!" --length-mm 40 --live # print ``` ## 设置 ``` python3 -m venv .venv .venv/bin/pip install -r requirements.txt ``` 要运行 UI 回归测试(`scripts/ui_check.py`),你还需要 安装 Playwright:`.venv/bin/pip install playwright && .venv/bin/playwright install chromium`,然后针对开启了 `D30_DRY_RUN=1` 的服务器运行测试。 ## 状态 - [x] 已识别硬件:Phomemo D30(HVIN D30B),FCC ID 2ASRB-D30C - [x] 已从设备的支持 QR 码中提取出 BLE MAC 地址和序列号 - [x] 已完成 GATT 结构映射;打印协议已与现有技术成果比对 并在物理打印机上验证 - [x] 已诊断出 BlueZ bearer 选择失败的模式,并在 传输层中进行了规避 (docs/ble.md) - [x] `d30/` Python package:协议、BLE 传输、PIL 渲染、CLI - [x] 本地 Web App:FastAPI 服务器 + WYSIWYG 编辑器(文本/图像/图标) - [x] 带有界面内刻度尺校准的打印起始偏移控制 - [ ] QR / 条形码元素 - [ ] 模板管理器(超出 localStorage 范围) - [ ] 其他碳带尺寸(宽度已参数化,目前仅测试了 12mm) - [ ] 解码剩余的协议未知项(`ff01` 内容,通知字节 `02b600` / `1a0f0c`)— 计划抓取 Android HCI snoop 记录 ## 布局 - `d30/` — Python package:`protocol.py`(ESC/POS 封装 + 光栅 打包 + 偏移补偿),`transport.py`(通过 bleak 进行 BLE GATT 通信, BlueZ 坑点处理),`render.py`(PIL 自适应文本),`cli.py` - `server/app.py` — FastAPI:提供编辑器服务,枚举/提供系统 字体,打包客户端 PNG 并打印 - `web/` — 编辑器(无需构建的 vanilla ES modules + canvas) - `docs/` — 硬件/BLE 逆向工程分析文档 - `scripts/` — 侦察 + 校准工具,UI 回归测试 ## 设备标识 基于 Phomemo D30(HVIN D30B,FCC ID `2ASRB-D30C`, IC `29002-D30A`),BLE 名称 `D30` 开发。驱动程序通过 该名称发现打印机;使用 `--address` / `D30_ADDRESS` 固定特定设备(你的 设备的 MAC 地址位于其支持 QR 码中 — 参见 [docs/device-label.md](docs/device-label.md))。 ## 许可证与现有技术成果 Apache-2.0(参见 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)) — 继承 自 [odensc/phomemo-d30-web-bluetooth](https://github.com/odensc/phomemo-d30-web-bluetooth), 本项目的协议理解正是与该实现进行验证 比对的。同时还参考了: [polskafan/phomemo_d30](https://github.com/polskafan/phomemo_d30) (MIT) 和 [crabdancing/phomemo-d30](https://github.com/crabdancing/phomemo-d30) (AGPL-3.0,仅文档)。内置的 [Lucide](https://lucide.dev) 图标遵循 ISC 许可证(参见 `web/LUCIDE-LICENSE.txt`)。
标签:ESC/POS协议, Linux驱动, 标签编辑器, 热敏打印机, 特征检测, 硬件逆向工程, 蓝牙低功耗, 逆向工具