先给个脚本,可以直接运行:

puts "=== before require "require'socket'sleep 0.1client =TCPSocket.new'192.168.1.181',9100sleep 0.1# 发现偶尔有的机器, 需要分别设置才行。# 设置英文字体。 和 数字client.write "\x1B\x21\x30 english 汉字"# 设置中文字体client.write "\x1C\x21\x0C 汉字 english 123".encode 'gbk','utf-8'  content ="你好,我是第三行"puts "== encoding: #{content.encoding}"content = content.encode 'gbk','utf-8'puts "== after , encoding: #{content.encoding}"client.write contentclient.write "\n\n\n\n\n\n\n\n"client.write "\x1D\x56\x01"sleep 0.1client.closeputs "=== done"

我们的一个项目中,设计到了 餐饮系统。

餐饮系统用的比较多的,是小票打印机。往往用在后厨,让后厨师傅看到了出菜。

也会用在前台,打印小票,作为预结单据。

虽然用触摸屏可以替代,但是触摸屏的特点是造价昂贵,屏幕在1000-2000元, 整机大概在 3000以上。

小票打印机,最贵的 三口打印机(网口,USB, 串口电话线)也就是400块。

所以,小票打印机还是有很大市场的。

这个打印机的用法跟其他打印机不同:

1. 有两种打印方式:

1.1 本地打印机,可以根据windows的系统来打印。 网页上是啥,就可以打印出啥来。特别方便。 前提是需要在windows上安装驱动程序。

1.2 非本地(网口/USB口打印机), 只能通过socket通讯来打印。  好处是不需要驱动。非常方便

所有的小票/热敏打印机,无论是58宽度,还是80宽度,无论是啥品牌,都是一样的。

都遵循着 EPSON 的ESC POS打印机的 编程规范来的。具体见:http://siwei.me/system/resources/W1siZiIsIjIwMTcvMTEvMjMvMThfNDNfMzhfOTUzXzU4Xy5wZGYiXV0/58%E4%B8%AD%E6%96%87%E6%97%A0%E7%BA%BF%E7%83%AD%E6%95%8F%E6%89%93%E5%8D%B0%E6%9C%BA%E8%AF%B4%E6%98%8E%E4%B9%A6.pdf

基本上,都是通过使用(原生的,不是websocket) socket 来发送请求。实现打印, 切纸,等功能。

socket 端口统一都是 9100.  下面是入门:

require'socket'sleep 0.1# 记得要睡 0.1 s , 有时候打印机会出现低温情况,下面语句都一样. 每次执行完,记得睡一下。# 详细原因还不知道。 建议在 连接, 切纸时,必须 sleep 0.1 s =TCPSocket.new('192.168.1.181',9100);# 打印 普通的字符串。s.write "hihihi"puts s.read(5)# 打印3个换行。 s.write "hihihi\n\n\n"# 换两行并切纸 ,但是慎用,可能会引起打印机死机。 # 出现死机时,重启打印机,或者 回复打印机配置到出产情况(按住feed不放,开机,持续按feed 20秒,看到两个红灯闪两下之后,松手,就会看到# 打印机打印出当前状态。   ip地址已经变更,需要重新配置ip)s.write "\x0a\x0a\x1d\x56\x01"(参考: http://www.360doc.com/content/11/1101/10/8005503_160738911.shtml    1d 56 00)# 以下高级功能,使用 EPSON 的ESC POS打印机函数# 加粗client.write "\x1B\x21\x08  bold ..."# 倍高client.write "\x1B\x21\x10  2x height..."# 倍宽client.write "\x1B\x21\x20  2x width...\n"# 倍宽, 倍高 (仅对英文和数字生效)client.write "\x1B\x21\x30 2x width, height..."# 仅对汉字生效。 所以,实际操作中,最好每次调用的时候,都要分别设置下 英文和中文。client.write "\x1C\x21\x0C 2X 汉字你好啊123 abc".encode("gbk","utf-8")s.close

这里需要注意的是,任何内容,都要查看 “编程手册”来。例如, 字体2x宽是 20, 2x高是 10, 那么又是倍宽,又是倍高,就要 \x30 。  这个是根据手册中看到的(2进制数字,8位的话,4,5,6位都是1 才行。通过二进制到16进制的在线转换,就可以了,点击这里: http://tool.oschina.net/hexconvert/

在“编程手册”中,要注意这么几个点:

1. 选择字符大小:   GS ! n

2. 选择对齐方式:  ESC a n

3. 选择字体: ESC M n

4. 选择打印模式:  ESC ! n  (加粗,加高,加宽,下划线等)

5. 设置左边距:  GS L nL nH

关于小票打印机的安装和调试:

安装:

1. 根据网络打印机提供的软件, 设置这些打印机的IP,成为固定的。(这一步往往需要打印机跟电脑用网线直连,具体见说明书)

2. 要把小票打印机跟 要跟它沟通的设备(例如电脑)放在同一局域网 。 (例如网段都是 192.168.1.x)

3. 运行更改iP的程序. (简易程序 在这里下载 ,完整程序见网盘。 https://pan.baidu.com/s/1hrSekpY

4. 会看到这个图:

配置打印机ip

5. 点击“设置按钮”,就可以了。(会发现,本机先是ip改变,然后改变打印机ip, 最后给出红字成功。 打印机也会打出新的ip地址。最后本机地址恢复)

调试:

1. 按钮 feed 表示出纸,

2. 当feed与paper键同时变红(不闪烁)时,表示缺纸

3. 放纸时,那个纸筒中间的小棍子,不用实打实的放在那里。 很宽松的一扔就行,不会影响打印机的出纸的。

4. 关机后, 按住feed, 不放,同时开电源,2秒后松手, 打印机会打印自动检测的纸片

5. 长按feed 20秒,回到初始状态。

6. 如果 客户端通过socket发送给打印机命令,打印机无法识别或者出错时,会  FEED, PAPER 同时红色闪烁,大约5秒闪一次,一次闪两下。

7. 调试时,建议电脑跟打印机挨着。

8. 注意: 各种命令要放在每一行的行首,才会被识别为命令。 (虽然有时候也行)

9. 注意: 打印机的工作温度是 0 - 40度。过高过低都会影响打印效果。 而且我们打印的时候,程序要适当的发送请求,不要一股脑发送出去。 这个在ipad端没问题,但是在windows端的 ruby程序,就会引起打印机不工作(不响应socket,  又不报错) . 解决办法是在关键点sleep 0.1 秒。 关键点是: 切纸,连接等。 具体还需要进一步的摸索。

另外,估计在刚开机的时候,需要几秒钟的预热时间。所以,这里最好在程序中,对打印机的状态做个判断。

10. 记得对字体要分别设置(英文的设置一次,中文的设置一次。)