flutter_zpl_printer 是一个开源 Flutter 包,用纯 Dart 实现 Zebra 标签打印,支持 iOS、Android、macOS 和 Windows。它不走 Zebra 的 Link-OS SDK,而是直接使用打印机本身支持的协议:ZPL 负责标签内容,SGD 文本协议读写设置,~HS 查询主机状态,以及 Zebra 的蓝牙 LE GATT 服务。
早期版本封装 Link-OS SDK,带来三道墙:无法用 pub get 安装,iOS 蓝牙需要 Apple 的 MFi 审批,且只支持手机、不支持桌面端。0.1.0 起作者删除 SDK,改为直接实现上述协议,原生代码只用于 USB 枚举和权限申请。
蓝牙 LE 让 iOS 应用绕开 MFi 审批,代价是打印机需支持蓝牙 4.0 及以上,仅支持经典蓝牙的老机型无法连接。同时扫描蓝牙和 Wi-Fi 时,同一台打印机会以两个名字出现,两者都含序列号,可按序列号合并成一行,点击后优先走 Wi-Fi 再走蓝牙。
打印前先调 getStatus() 发送 ~HS,能识别打印头打开、缺纸、暂停、过热等状态,把静默失败变成用户可读的提示。图片打印有四种常见失败:内联图形不打印、深色图触发过热、切刀模式不吐纸、Z64 校验和错误;对应改用 ~DG 存储加 ^XG 调用、阈值抖动、撕纸模式和不压缩十六进制。0.1.2 修复了校验和计算错误。
Wi-Fi 连接手机热点时,首次连接因 NAT 和 DHCP 延迟较大,3 秒超时必然失败,8 秒加一次重试可用。蓝牙断连由 ReconnectableConnection 以指数退避恢复,重连成功后抛出 ReconnectSuccessException 且不自动重发,避免重复打印运单。
USB 在 macOS 未测试、Windows 测试失败,生产环境建议用蓝牙 LE 或 Wi-Fi。状态解析面向 ZPL 打印机,CPCL 机型可连接打印但状态回复格式不同。
