自制一个"咕咕机"

看到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服务器然后科学的调用了。

以下为测试打印: IMG_2079.jpg

qwe7002

一直很高调,其实就是个小丑。技术本就渣,还要冒充大牛。什么事情都爱多考虑三分,最后往往发现是想太多。爱好极简,但是做出来的东西往往还是差那么些。对自己的作品超级苛刻,往往最后逼死的是自己。半理工半文艺思维,至今没搞懂这是个什么玩意。一切都是浮云,欢喜就好。

本站使用Disqus评论服务,如果无法显示,请检查您的网络链接