需求分析
- 多端:发起标签打印的终端有 App 和 Web
- 批量:除了单个打印,还需要支持后台自动批量打印
- 便携:仓库人员能随身携带打印机,出标签后直接贴到对应库位或物品上
调研标签机
- 云打印机如飞鹅云都是需要插电的,没有电池,无法在仓库随身携带;
- 汉印蓝牙标签打印机,无法支持Web端发起打印请求
- 最后选定 优博讯 UROVO K329 WIFI版。
Web触发打印方案分析
标签打印机有2种调用方式:
- 驱动模式:在Windows上安装驱动,发送要打印的数据到打印机
- 指令模式:将 tspl,cpcl或esc 指令通过蓝牙或者WIFI方式发送到打印机
使用驱动模式的话,App端无法发送数据,Web端也必须先生成图片或PDF,无法跳过浏览器的文件存储逻辑,也就无法实现后台静默自动打印。
使用指令模式,由于蓝牙距离限制,PC和打印机通过蓝牙通信是不稳定的,所以采用 WIFI 连接发送数据。
其实也可以主要用App蓝牙交互的逻辑,Web把数据推到队列,App轮询接口或者websockt连接,和前端同事讨论对App性能有影响。
另外考虑到工期和前端工作量问题,App端的打印调API来还是走Web转发打印的逻辑,后期可以实现App通过蓝牙发指令到打印机,这样会更稳定,毕竟WiFi信号离路由器远了也会变弱。
流程确认
- App和Web向队列写数据
- PC上运行一个打印数据转发程序 Printer.exe,向服务器请求打印数据
- PC程序 Printer.exe 向打印机发送打印指令数据
考虑到将 Rabbitmq 的配置写到exe程序里会有安全问题,所以还是才用接口轮询的方法,让 Printer.exe 每隔一秒去请求打印数据。
基于 Python 实现打印数据转发程序
主要实现以下几个功能:
- 请求数据接口
- 向标签机
IP:PORT
发送打印指令 - 定时重复请求
- 记录日志,清理7天前的日志文件
- 使用
pyinstaller -F .printer.py
打包成exe程序