frappy21/launch-printer-bridge
GitHub: frappy21/launch-printer-bridge
通过逆向工程 LAUNCH X-431 诊断仪配套打印机的通信协议,实现了用廉价 ESP32-C3 或电脑桥接普通蓝牙热敏打印机的完整替代方案。
Stars: 0 | Forks: 0
# launch-printer-bridge
LAUNCH X-431 WiFi 迷你打印机 (型号 SO118) 的直接替代品。
可让运行 LAUNCH X-431 诊断软件的平板电脑打印到任何兼容 ESC/POS 的热敏打印机,而不是原价 90 美元的设备。
包含两种实现方式。任选其一:
* **`mac-bridge/`** — 在 macOS 或 Linux 上运行的 Python 脚本。通过 BLE 将打印任务转发到热敏打印机。适用于测试,或在主机始终开启的情况下作为永久设置。
* **`esp32-c3-firmware/`** — 适用于任何 ESP32-C3 开发板的嵌入式固件。独立运行,无需主机。通过 USB 供电,并在其自己的 WiFi 接入点上伪装成打印机。
就 X-431 应用程序而言,这两种实现在行为上是完全相同的。提供两种实现的原因是基于硬件偏好,而非功能差异。
[README на русском](README.ru.md)
## 背景
LAUNCH 销售一款仅支持 WiFi 的热敏打印机(零售价 90 美元以上)作为 X-431 OBD-II 诊断平板电脑的配件。在内部,它是一个 2014 年代的 Hi-Link HLK-RM04 模块——一个运行 OpenWrt 的 Ralink RT5350F MIPS SoC——连接到 58 毫米的热敏打印头。X-431 应用程序通过三个网络通道与其进行通信:
* 在 `224.0.0.1:988` 上的 UDP 多播用于发现(探测 payload 为 `"HLK"`,回复必须包含子字符串 `"HLK-"` 和一个 `"("` 字符)。
* TCP 端口 80,带有一个 HTTP POST 端点 `/goform/ser2netconfigAT`,在安装向导期间用于推送家庭 WiFi 凭据。该端点由 HTTP Basic auth 保护,其凭据硬编码在应用程序中(`launch_yidsun:lauyid20130818`)。
* TCP 端口 7001 用于实际的打印任务——标准的 ESC/POS 字节加上一个 Hi-Link 特定的操作码(`GS z 0x31`),如果不进行过滤,该操作码会在标准打印机上打印出一个多余的 `1` 字符。
应用程序的读取路径和状态字节映射是通过使用 jadx 反编译生产 APK(`com.cnlaunch.x431`)进行逆向工程的。完整的字节级协议文档在 [`docs/protocol.md`](docs/protocol.md) 中。
## 为什么费这个事
如果您已经拥有一台基于 B58G 平台的热敏打印机(HPRT MPT-II、Hanyin N41、Autel BT608、Zjiang ZJ-5805、GOOJPRT MTP-II 以及其他几款克隆产品——均在 40 美元以下),您就可以避免购买 LAUNCH 设备。您需要以下任一条件:
* 一台通过 BLE 运行 Mac 桥接程序的小型计算机(如果您已经有笔记本电脑,则是免费的),或者
* 一块 ESP32-C3 开发板(约 5 美元),用于独立设置。
## 架构
```
WiFi
[X-431 tablet] ────────────► [bridge] ────────► [thermal printer]
│ BLE
├─ HLK responder (UDP :988)
├─ HTTP /goform (TCP :80)
└─ TCP print server (TCP :7001)
```
启动时,桥接程序会打开一个到已配置目标打印机的 BLE GATT 链接。然后,它同时提供这三个网络端点的服务。当 X-431 应用程序发布打印任务时:
1. 端口 7001 上的 TCP socket 接收 ESC/POS 字节。
2. 桥接程序检查每个数据块中是否包含 HLK 特定的哨兵值(`1D 7A 31`),并根据配置将其丢弃或替换为水平分隔线。
3. 转换后的字节以低于典型 247 字节 ATT MTU 的数据块写入 BLE 外设,并在数据块之间加入少量延迟。
4. 桥接程序合成应用程序 `readByte()` 调用所期望的状态回复(在 `GS r` 查询后回复 `0x00`,并在最后的 `ESC J 0x40` 后回复 `0x00`),因此应用程序会报告打印成功。
对于向导配置步骤,桥接程序接受 HTTP POST,验证 Basic auth 标头,“保存”凭据(在 Mac 端为空操作 no-op,在 ESP32 端为真实持久化),并像真正的 Hi-Link 模块那样进行回复。
## 硬件支持
已确认可作为 BLE 目标正常工作的设备:
* HPRT MPT-II
* Hanyin (HPRT) N41
* Autel BT608 / BT608E 热敏打印模块
同样基于 B58G 平台,理论上应该支持,但未经亲自验证的设备:
* Zjiang ZJ-5805
* GOOJPRT MTP-II / MTP-3
* Caysn T-series
* GOOJPRT PT-210
如果您的打印机通过“无响应写入 (write-without-response)”的 GATT 特征值(通常为 UUID `FF02`)暴露 ESC/POS,只需编辑一个配置字段即可使其工作。如果它使用不同的 UUID,请运行 GATT 发现(例如手机上的 nRF Connect)并将正确的 UUID 填入配置中。
对于 ESP32-C3 固件,任何 C3 模块均可工作:
* Seeed XIAO ESP32-C3
* WeAct ESP32-C3 SuperMini
* Espressif ESP32-C3-DevKitM-1
您还可以刷入任何其他带有内置 WiFi+BLE 的 Espressif 芯片(C6、S3)——`wifi_mode.c` 和 `ble_printer.c` 模块是与目标无关的。如果您希望通过 USB Printer Class 而不是 BLE 转发打印数据,S3 还具有 USB Host 功能;这不在本仓库中,但其集成点仅在一个文件中(`tcp_print_server.c` 的转发调用)。
## 快速开始
Python 桥接程序:
```
cd mac-bridge
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp config.yaml.example config.yaml
python bridge.py --scan # find your printer's BLE address
# 编辑 config.yaml 并将地址填入 printer.address
sudo python bridge.py # sudo needed for privileged port 80
```
ESP32-C3 固件:
```
cd esp32-c3-firmware
. $IDF_PATH/export.sh
idf.py set-target esp32c3
idf.py build
idf.py -p /dev/cu.usbmodemXXX flash monitor
```
运行其中任何一个后,在 X-431 平板电脑上:
1. 打开 LAUNCH 应用程序,转到 **Settings → Printer Set**。
2. 点击 **Reset → Scan**。
3. 从列表中选择桥接设备(Mac 桥接:它是运行脚本的主机;ESP32:它是一个名为 `X-431PRINTER-XXXX` 的 SSID)。
4. 连接,然后使用家庭 WiFi 凭据完成向导的第 2 步。
5. 打印。
详细说明位于 [`mac-bridge/README.md`](mac-bridge/README.md) 和 [`esp32-c3-firmware/README.md`](esp32-c3-firmware/README.md)。
## 配置
两种实现都将每个协议级常量作为配置键公开:
* **Mac 桥接** — YAML 文件 `mac-bridge/config.yaml`。
* **ESP32 固件** — `idf.py menuconfig` → "Launch Printer Bridge"。
协议文档中提到的每个魔术值(UUID、端口、哨兵字节、MAC 回复模板、硬编码的身份验证字符串)都作为配置公开,因此您可以在不接触源代码的情况下,适应不同的目标打印机或不同的 X-431 固件版本。
## 安全说明
凭据 `launch_yidsun:lauyid20130818` 被烧录在出厂的 APK 中——市面上的每一台 Launch 打印机都接受它们,并且只需打开 APK 就能以 base64 字符串的形式看到它们。WPA2 密码 `12345678` 同样硬编码在所有出厂 Launch 打印机的热点中。任何在未修改的 Launch 打印机 WiFi 范围内的人都可以加入其热点并重新配置它。这是已记录在案的行为,而不是我们引入的漏洞;桥接程序仅仅是将其原样镜像。
## 许可证
MIT。请参阅 [LICENSE](LICENSE)。
## 致谢
* LAUNCH 应用程序的逆向工程使用了 jadx 进行 APK 反编译。
* Hi-Link HLK-RM04 文档和 OpenWrt 论坛帖子帮助确定了底层打印机架构。
* github.com/tryger/barrot-tools 上发布的 Barrot bootloader 工具帮助阐明了某些目标打印机中使用的 BR 系列芯片组。
本项目不包含任何来自 LAUNCH、Hi-Link 或任何其他商业供应商的代码或资产。本仓库中的所有内容都是基于在线路上观察到的公共网络协议进行的原创实现工作。
标签:3D打印机替代, APK逆向工程, CSV导出, ESC/POS, ESP32-C3, HLK-RM04, LAUNCH X-431, OBD-II, Python桥接, TCP/IP, UDP组播, wifi打印机, 协议逆向, 嵌入式固件, 开源硬件, 极客工具, 汽修设备, 汽车诊断, 热敏打印机, 物联网硬件, 硬件替代方案, 硬件黑客, 移动应用逆向, 网络协议分析, 网络端点模拟, 蓝牙BLE, 逆向工具