ChiaraCannolee/thermal-pocket-printer-basic

GitHub: ChiaraCannolee/thermal-pocket-printer-basic

通过逆向工程BLE协议,绕过隐私侵权的官方App,实现对DP-L1S热敏打印机的无账户、无云服务、纯本地蓝牙直连打印。

Stars: 14 | Forks: 0

# thermal-pocket-printer-基础 直接通过蓝牙从电脑打印到 **DP-L1S** 热敏口袋打印机,无需任何 App。 DP-L1S 是由厦门印未来科技制造的一款小型热敏口袋打印机,以多个品牌名称销售(在 NL/EU 地区通过 Craft & Co、Action 商店等渠道销售,品牌名为 Crafts & Co 3128)。其配套 App “Luck Jingle” 要求获取位置权限、持久的互联网连接,以及一大串其他权限——对于一台只是通过蓝牙在 30 厘米外接收图像的打印机来说,这些要求根本毫无道理。 因此,我使用 JADX 反编译了 Android APK,逆向工程了 BLE 协议,并构建了一个 Python CLI 工具和一个 Web 应用程序,可以直接与打印机通信。无需 App,无需账户,无需云服务。 ## 快速开始 **Web 应用(无需安装,只需在 Chrome/Edge/Opera 中打开):** **https://ChiaraCannolee.github.io/thermal-pocket-printer-basic/** 由于需要使用 Web Bluetooth,因此不支持 Firefox 和 Safari。支持 macOS 和 Linux。Windows 版本还需等待 Web Bluetooth 提供更好的支持。 **Python CLI(用于自动化和批处理任务):** ``` pip install bleak Pillow python3 print.py test # test pattern python3 print.py image photo.png --dither # photo with Floyd-Steinberg python3 print.py text "Hello World" python3 print.py text "My Label" --label # sticker/label paper mode python3 print.py info # battery, firmware, model ``` ## 功能特性 - 打印图像、文本和测试图案 - 实时预览打印输出效果 - 三种打印浓度级别 - 针对照片和渐变色的 Floyd-Steinberg 抖动算法 - 反色模式(交换黑白颜色) - 标签模式,支持带间隙检测的贴纸纸 - 通过 BLE 通知显示电池电量指示器 ## 工作原理 该打印机运行在 LuckPrinter SDK 上,有超过 159 种打印机型号在使用该 SDK。其 BLE 协议是 ESC/POS 的一个变体。基本流程如下: 1. **连接**到 BLE 服务 `ff00`,向特征值 `ff02` 写入数据,并在 `ff01` 上监听通知 2. **启用打印机**:发送 `10 FF F1 03`(Lujiang 特定命令) 3. **唤醒**:发送 12 个空字节 4. **设置浓度**(可选):`10 FF 10 00 [0|1|2]` 分别对应 浅/正常/深 5. **发送位图**:GS v 0 光栅图像(宽 384 像素,1 位,MSB 优先) 6. **走纸**:`1B 4A 50`(走纸 80 点) 7. **停止作业**:`10 FF F1 45`(等待响应) 对于带间隙检测的标签/贴纸纸,请将第 6 步替换为 `1D 0C`(定位到下一个标签),并在打印前使用 `1F 11 51`,打印后使用 `1F 11 50` 进行位置调整。 由于 Web Bluetooth 的 MTU 限制,Web 版本采用 100 字节的数据块并带有 50ms 的延迟。Python CLI 则使用 512 字节的数据块和 10ms 的延迟,速度明显快得多。 该打印机广播名称为 `C&Co 3128_BLE`,并且不会广播其服务 UUID,因此仅通过服务过滤器扫描是无法找到它的。 请参阅 [PROTOCOL.md](PROTOCOL.md) 获取完整的命令参考,包括设备信息查询、状态位域以及标签/纹身打印序列。 ## CLI 用法 ``` python3 print.py [options] Commands: scan Scan for nearby BLE printers info Show printer info (model, battery, firmware) test Print a test pattern image Print an image (PNG, JPG, BMP, etc.) text Print text Options: --address, -a Printer BLE address (skip scanning) --density, -d 0|1|2 Print darkness (0=light, 1=normal, 2=dark) --dither Floyd-Steinberg dithering (better for photos) --invert Invert colours (white-on-black) --label Label/sticker mode with gap detection --copies, -c N Number of copies --width, -w N Print width in pixels (default: 384) --feed, -f N Paper feed after print in dots (default: 80) ``` ## 兼容打印机 已确认可与 DP-L1S(作为 Crafts & Co 3128 及其他贴牌名称销售)配合使用。可能也适用于共享相同 SDK 和 `BaseNormalDevice` 类的 LuckPrinter 系列中的其他打印机——如 DP-/LuckP-/MiniPocketPrinter 系列及类似产品。打印宽度可能有所不同;请使用 `python3 print.py info` 进行检查。 对于 Fichero D11s 及其他基于 AiYin 的标签打印机(设备类别不同,但 SDK 相同),请参阅由 0xMH 提供的 [fichero-printer](https://github.com/0xMH/fichero-printer)。 ## 兼容纸张 该打印机使用 56mm 宽的热敏纸和贴纸卷(标签直径 30mm)。它是“免墨”的:热量激活热敏涂层,因此彩色纸张仅会在黑色打印内容下提供彩色背景。 ## 即将推出 我正在开发一个功能扩展的 Web 版本,包含以下特性: - 带有预设尺寸(29×12mm、40×12mm、50×30mm、40×30mm、48mm 圆形及自定义)的可调标签大小 - 在浏览器中本地保存和加载模板 - 直接在预览中拖动文本以实现自由定位 - 撤销/重做 - 包含可调阈值、份数、浓度覆盖和打印后走纸量(以毫米为单位)的打印预览界面 本仓库中的基础功能已趋于稳定,因此优先发布此版本。扩展版本将在后续拥有其独立的仓库。 ## 背景 本项目最初源于一次隐私保护实践。“Luck Jingle” App 要求获取位置权限、互联网访问权限以及其他各种对于蓝牙打印机而言毫无必要的权限。通过使用 JADX 反编译 Android APK 并阅读 LuckPrinter SDK 中的 `PrinterImageProcessor` 和 `BaseNormalDevice` 类,该协议被成功逆向工程,随后并在硬件上得到了验证。 ## 许可证 MIT
标签:Bleak库, BLE协议逆向, DP-L1S, ESC/POS协议, JADX反编译, Pillow库, Python CLI, Web Bluetooth, 免云服务, 协议逆向工程, 后端开发, 图像处理, 图像打印, 安卓APK分析, 开源硬件, 批处理打印, 插件系统, 数据可视化, 无App打印, 本地控制, 标签打印, 桌面自动化, 热敏打印机, 热敏纸, 物联网设备, 直接打印, 网络安全, 自制工具, 菲尔德-斯坦伯格抖动, 蓝牙低功耗, 蓝牙打印机, 蓝牙通信, 逆向工具, 隐私保护