ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

brother_ql 源码架构深度走读:从 PackBits 压缩到后端工厂模式的设计全景

brother_ql 源码架构深度走读:从 PackBits 压缩到后端工厂模式的设计全景 brother_ql 源码架构深度走读从 PackBits 压缩到后端工厂模式的设计全景【免费下载链接】brother_qlPython package for the raster language protocol of the Brother QL series label printers (QL-500, QL-550, QL-560, QL-570, QL-700, QL-710W, QL-720NW, QL-800, QL-810W, QL-820NWB, QL-1050, QL-1060N and more).项目地址: https://gitcode.com/gh_mirrors/br/brother_qlbrother_ql 是面向Brother QL 系列标签打印机的 Python 包完整实现了 Brother QL 标签打印机的raster 光栅语言协议覆盖 QL-500 到 QL-1115NWB让你无需任何打印机驱动就能把打印指令直接发进打印机——即使在 Brother 官方不提供驱动的树莓派上也能精确到每个像素地打印条码与标签。下面逐层拆解它的源码架构。️ 项目目录结构全貌整个代码库非常精炼约 20 个核心文件就能完成图像 → 协议 → 通信的全链路模块路径职责brother_ql/cli.pyClick 命令行入口提供print/discover/info/analyze/send子命令brother_ql/raster.pyraster 语言核心组装 ESC 指令序列负责 PackBits 压缩brother_ql/models.py型号能力表声明式定义 18 台打印机的特性brother_ql/labels.py标签带规格宽度、可打印像素、模切 / 连续卷brother_ql/conversion.py图像 → 光栅指令的转换流水线brother_ql/image_trafos.pyHSV 通道滤镜用于红黑双色分离brother_ql/reader.py二进制指令的逆向解析器analyze 命令的核心brother_ql/backends/三种通信后端pyusb / network / linux_kernelbrother_ql/helpers.pyElementsManager通用注册表基类brother_ql/exceptions.py统一的异常体系设计思路一目了然协议层raster 能力层models / labels 图像处理层conversion 通信层backends 接口层cli各模块可独立开发与测试。️ 型号能力表声明式定义打印机支持特性在brother_ql/models.py中Model类用 attrs 声明式地记录每台打印机的能力number_bytes_per_row打印头每行像素数62mm 带 90 字节 720 像素compression是否支持 PackBits 压缩mode_setting/expanded_mode/cutting是否支持对应的 ESC 子命令two_color是否支持黑红双色打印QL-8xx 系列num_invalidate_bytes清空打印机缓冲区所需的 0x00 前导字节数文件内的ALL_MODELS列表给出了全部 18 个型号例如老型号QL-500不支持压缩、不支持切刀、不支持模式切换而QL-810W支持黑红双色且前导字节数翻倍。ModelsManager继承自brother_ql/helpers.py的ElementsManager提供按标识符查询的接口。这种声明式设计的最大好处是新增一台打印机只需增加一行配置完全不用改协议代码。 PackBits 压缩是如何编码的brother_ql/raster.py中的BrotherQLRaster是整个项目的编码器它的每个add_*方法向内部data字节流追加一条指令组装出一条完整打印作业add_switch_mode()— 发送ESC i a切入 raster 模式仅支持模式切换的型号需要add_invalidate()— 发送一串0x00前导字节清空打印机命令缓冲add_initialize()— 发送ESC 初始化add_media_and_quality()— 发送ESC i z声明带材类型、宽度与打印质量add_compression(True)— 发送0x4D命令此后每一行光栅数据都按 PackBits 编码add_raster_data()— 写入图像主体核心方法add_print()— 发送0x1AEOF触发打印add_raster_data()的关键逻辑先校验图像宽度必须等于打印头像素宽然后水平翻转、二值化逐行输出——每行先写0x67前缀与行字节长度再写行数据若开启了压缩行数据先经第三方库packbits.encode()处理row frame[start:startrow_len] if self._compression: row packbits.encode(row)PackBits 是经典的游程压缩连续重复的像素被压成计数 字节对。黑白标签图像大面积同色像素极多压缩率非常高能显著缩短 USB / 网络传输时间。而能力表中compressionFalse的老型号会自动跳过压缩触发告警而非报错——这就是能力层约束协议层的典型体现。QL-8xx 系列的双色打印也在此处实现add_raster_data(image, second_image)接收黑色与红色两层图像每一行用0x77 0x01/0x77 0x02前缀区分色层。️ 图像到光栅完整的转换流水线brother_ql/conversion.py的convert()是连接图像世界与光栅世界的编排函数流水线如下查规格从labels.py的LabelsManager取得所选标签的可打印点阵数与边距尺寸适配连续卷按宽度自动缩放模切标签要求像素尺寸严格匹配不匹配直接报错右对齐填充把图像贴到打印头满宽含右侧偏移量的白色画布上二值化灰度化 → 反相 → 按阈值-t或 Floyd–Steinberg 抖动-d转黑白红黑分离可选针对 QL-8xx 双色打印brother_ql/image_trafos.py的filtered_hsv()按 HSV 通道把红色像素与黑色像素各自过滤成两层二值图组装依次调用BrotherQLRaster的一串add_*方法最终返回qlr.data——完整的指令字节流CLI 上的brother_ql print -l 62 my_image.png本质上就是在执行这条流水线。 后端工厂模式统一抽象三种通信通道brother_ql/backends/是项目中工厂模式 模板方法模式的教科书式实现共四块拼图① 工厂函数backend_factory()位于backends/__init__.py按后端名称惰性 import对应模块返回一个包含list_available_devices设备发现函数与后端类的字典。惰性导入保证了你用网络后端时不必安装 pyusb 依赖。② 自动识别guess_backend()从打印机标识符的 URI 前缀判断通道——usb://→ pyusbtcp://→ network/dev/usb/→ linux_kernel用户零配置。③ 模板方法BrotherQLBackendGeneric位于backends/generic.py基类统一实现write()/read()/dispose()的公共逻辑日志、异常包装、资源释放三个子类只需实现_write/_read/_dispose与设备发现后端通道标识符示例特点pyusbUSB跨平台usb://0x04f9:0x2015/序列号用户态 USB 通信自动处理内核驱动挂接/释放networkTCP 9100 端口tcp://192.168.1.21全平台可用支持 WiFi/有线打印机但无法读回打印机状态linux_kernel/dev/usb/lp0/dev/usb/lp0走 Linux 内核 USB 打印驱动最省资源④ 统一发送send()位于backends/helpers.py工厂选定后端 → 写入指令 → 阻塞轮询读取打印机状态回包交给reader.py的interpret_response()解析直到收到Printing completedWaiting to receive两个状态才判定作业成功。 一条 print 命令的完整旅程把上面各层串起来brother_ql print -l 62 -c img.png的数据流是cli.py 解析选项模型 / 打印机 / 后端 → conversion.convert() 图像变换 指令组装含 PackBits 压缩 → backends.helpers.send() 工厂选定通信通道 → backend.write() 实际下发pyusb / network / linux_kernel → reader.interpret_response() 轮询确认打印完成反向工具analyze则用brother_ql/reader.py的BrotherQLReader把二进制指令文件逐条解码、还原成 PNG 图片——你可以亲眼看到发给打印机的光栅长什么样是排查打印问题的利器。⚡ 快速上手3 步打印第一张标签# 第 1 步安装 pip install --upgrade brother_ql # 第 2 步指定打印机与型号环境变量或 -p / -m 参数 export BROTHER_QL_PRINTERtcp://192.168.1.21 export BROTHER_QL_MODELQL-710W # 第 3 步把图片印到 62mm 连续带上 brother_ql print -l 62 my_image.png其他常用命令brother_ql discover发现打印机、brother_ql info labels查看全部标签规格与理想像素尺寸、brother_ql analyze file.bin反解指令为图像。 架构精华总结能力驱动型号能力表决定协议层能发哪些指令硬件差异被隔离在配置里惰性工厂后端工厂模式 惰性导入装多少依赖取决于你用哪种通道统一模板基类模板方法统一读写与释放新后端只需实现三个钩子对称设计编码器raster.py与解码器reader.py共享同一套操作码定义指令双向可验证无论你是想扩展新打印机型号、接入新的连接方式还是把标签打印集成进自己的应用brother_ql 的分层架构都能让你在最合适的层次切入——这正是它值得深度走读的地方。【免费下载链接】brother_qlPython package for the raster language protocol of the Brother QL series label printers (QL-500, QL-550, QL-560, QL-570, QL-700, QL-710W, QL-720NW, QL-800, QL-810W, QL-820NWB, QL-1050, QL-1060N and more).项目地址: https://gitcode.com/gh_mirrors/br/brother_ql创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表