标签打印机在 DPI 上虚标

一个开源的 Web Bluetooth 驱动程序显示,Niimbot 的 N1 标签打印机虽然标称分辨率为 300 dpi,但实际打印分辨率仅约为 203 dpi。

该开发者开发此驱动程序的目的是为了直接从网页进行打印,而无需使用 Niimbot 的移动端 App。他通过逆向工程破解了其私有协议,并通过 Web Bluetooth API 将其开放给浏览器。在此过程中,他不仅发现了一个缺失的功能,还发现了一个根本性的规格错误——这可能会破坏对精度有要求的批量包装、库存标签或爱好者项目。

规格错误是如何暴露的

Niimbot 将 N1 宣传为 300 dpi 的打印机,意味着每英寸有 300 个点。开发者打印了一张带有刻度尺图像和编号测试图案的样本,然后用物理直尺测量标记。计算结果始终指向约 203 dpi,而非声称的 300 dpi。

编写硬件驱动程序带来的四个血泪教训

  1. “成功”的任务可能毫无产出。 打印机以突发(bursts)方式传输数据。在某些平台上,蓝牙协议栈在丢弃写入操作时不会报告错误。驱动程序会认为任务已完成,但打印出的标签却是空白或残缺的。作者现在会在每个任务完成后读取打印机的物理页计数器,以验证标签是否确实已出纸。

  2. 文档并不代表现实。 300 dpi 的说法就是一个典型的例子。规格参数可能是乐观的、过时的,或者干脆就是错误的。当视觉保真度至关重要时,开发者必须亲自测量关键参数。

  3. 物理标记优于“适配”测试。 通过打印一张图像来观察其是否符合标签区域,会掩盖分辨率、打印头宽度或偏移误差。打印一个已知的几何标记并测量其精确位置,才能揭示设备的真实表现。

  4. 协议描述的是语法,而非硬件特性。 两台打印机可能使用相同的指令集,但表现却截然不同——一台可以处理快速连续打印,另一台则会卡顿。驱动程序不能仅凭协议文档就假设性能完全一致;每个型号都需要进行实际测试。

为什么这个驱动程序很重要

该驱动程序从不假装无所不知。每当它通过推断而非从打印机读取数值时,都会将该字段标记为“猜测”。这种透明度可以防止那些可能导致数小时调试工作的隐性错误。

获取驱动程序

该驱动程序运行在 Chrome 或 Edge 浏览器中,仅需要支持蓝牙的设备和受支持的 Niimbot 打印机。请尝试在线演示:

https://iscarelli.github.io/niimbot-web-bluetooth/demo/

源代码托管在 GitHub 上,社区可以在那里贡献型号数据、修复漏洞或为其他浏览器适配驱动程序:

https://github.com/iscarelli/niimbot-web-bluetooth

Niimbot 用户可以帮助完善型号数据库;整个过程大约需要十分钟和两张标签。

权衡

在公司澄清这一差异之前,开发者必须以测量得出的数值为准进行开发。

核心启示很简单:你从网页调用的硬件可能并不符合其规格书上的承诺。请务必验证关键参数,预料到隐性失败,并选择那些会暴露不确定性而非掩盖不确定性的驱动程序。