如何读懂小票据热敏打印机编程指南

背景

买了个网络打印机, 随机光盘附带了一本 《XX系列中文编程手册.pdf》,打开一看, 艾玛, 这都是神马啊!
sample
艾玛,这都是什么命令啊?windows,明显不是,难不成他打印机里面装了个系统?哦对了,怎么他妈才能给这个打印机发送命令啊??


数据传输方式

有上面的疑问很正常,人家是堂堂网络打印机,当然是通过网络来发送命令啦,那怎么连呢?恩,他没告诉你,但这个应该是通用的标准,果不其然,该打印机(容大RP58-L)出厂设置了该ip地址是192.168.1.87,打印机端口是9100。既然IP地址和端口号都齐全了, 明显就是一个套接字(Socket)嘛,所以,通过socket来发送命令没跑了.


命令解读

command
这些命令怎么回事? 怎么奇葩的用 ESC HT GS什么的开头的?其实没那么复杂, 这些ESC, HT, GS, FS什么的不是一个字符串, 他们都是ASCII码表里面排名靠前的控制字符. 通过套接字你传送的数据是流, 而流的本质上是一个一个的字节, 所以这里的命令中, 一个符号代表一个字节, 而字节的值在每条命令的详解里面有参考值.

命令解读例子

command sample
比如这条命令, 他的用途是用来 “选择打印模式”
其中, 看[格式] 这一栏, 他的 ESC! 都是ASCII码对应的值, 下面列出了16进制码和10进制码提供对照.
然后主要变化的值是n, n是一个数字, 0~255的区间内变化,下面的表格列举的时候n的值是什么的时候可以做什么. 他这里有8个位(刚好一个字节)可以设置, 每个位的1/0代表开关的开启和关闭, 比如要设置字体加粗, 那么n的第3位应该是1, 也就是 2^3 = 8, 十六进制是08, 所以整个命令下来就是(用16进制表示)
0x1B,0x21,0x08


如何执行命令

还是上面的例子, 我们要给打印机设置接下来打印字体加粗, 那么要把 0x1B,0x21,0x08这三个字节发送给打印机, 从第二步我们已经知道, 打印机通过socket来提供服务, 我们可以直接用socket来发送指令:(java代码, 其他语言类似, 不同网络打印机其提供打印服务的套接字可能不同)

Socket client = new Socket("192.168.1.87", 9100);
OutputStream output = client.getOutputStream();
byte[] command = new byte[]{0x1B, 0x21, 0x08};
output.write(command);
output.flush();
client.close();

如何打印文字

通过上面的例子可以知道, 我们给打印机发送命令只有通过socket的流来发送指令, 所以只能把字符串转换为字节流, 再传送给打印机:

Socket client = new Socket("192.168.1.87", 9100);
OutputStream output = client.getOutputStream();
byte[] chars = "strings".getBytes();
output.write(chars);
output.flush();
client.close();

当然, 这里不同的打印机可能会有不同的字符, 比如中文, 你可能在转换为字节流的时候需要设置不同的编码.


最后

上面这些命令的格式在小票据热敏打印机中一般是通用的, 不同的是提供打印服务的方式, 有的通过网络来提供套接字服务, 有些通过COM串口来提供服务, 对于不同的服务最都可以最终转化为流来处理, 所以本质上都是差不多的