自制一个"咕咕机"
看到diygod和tcdw都入手了咕咕机,觉得官方那个太贵了,想着自制一个好了。
选购一个小票打印机
先上了某宝,看了一下小票打印机的价格,发现餐饮用的小票打印机价格便宜的想哭,于是随便选了一个79的,送两打印纸的小票打印机回来了。
拿到这个小票打印机,发现一个很严重的问题,就是这个打印机只支持GBK编码(之前做pos打印驱动,都是针对UTF-8做开发的,在Python中做GBK开发的经验并不是很多),这算是没有注意看介绍带来的坑把。不过不管了,反正买回来了。
这里说一下小票打印机,POS小票打印机分为热敏和针式两种。 打印纸的宽度分为58毫米、76毫米和80毫米三种。我这里用的是热敏的款式,宽度是58毫米的。我觉得这个宽度够用了。
开发驱动
现在所有市面上的小票打印机,都是支持爱普生的POS协议的,所以我们可以直接找一个爱普生pos协议的库来用。这里我选择了一个开源了很久的仓库来做开发:python-escpos 这个仓库很早之前在 google code 上就有了,目前还是用 python2 开发的,所以说我们需要花上一点时间,把它重写成python3的,因为这样可以更容易的处理文本信息。这个重写工作量其实并不大,我们可以通过 https://www.zhihu.com/question/19698598/answer/206703788 这个答案来完成绝大多数的工作。
编写程序
废话不多说先上我的代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import usb.core
import usb.util
import sys
from escpos import printer
idVendor= 0x6868
idProduct= 0x0600
dev = usb.core.find(idVendor=idVendor,idProduct=idProduct)
if dev is None:
exit()
cfg = dev.get_active_configuration()
intf = cfg[(0,0)]
ep = usb.util.find_descriptor(
intf,
# match the first OUT endpoint
custom_match = \
lambda e: \
usb.util.endpoint_direction(e.bEndpointAddress) == \
usb.util.ENDPOINT_OUT
)
dev.reset()
def printmsg(msg):
usb = printer.Usb(idVendor,idProduct, 0, out_ep=ep.bEndpointAddress)
usb.text(msg)
usb.set(align="center")
usb.close()
但是,当我开始运行它的时候,问题发生了。经过一堆的检查,我发现是ecspos库中,把文本的编码给写死了。所以我把仓库clone了一份,对其中的编码部分进行了修改。终于完成了整个打印机的接口。接下来的工作,大概就是编写web服务器然后科学的调用了。
以下为测试打印: