主题
打印机
HCD POS 中,已将内置打印机映射为一个通用的 socket 连接方式的网口打印机,无需额外的 SDK 植 入。
开发者可采用通用的 socket + 端口 方式连接打印机,并发送相关的打印命令。
language
Socket s = new Socket();
// IP:String 类型,可设定为 "127.0.0.1",或者当前本机实际的 ip 地址
// portNum:int类型,可以为 9100 或者 9101,具体使用说明见下方
// 1000 表示连接 timeout -> 1000ms
s.connect(new InetSocketAddress(IP, portNum), 1000);
OutputStream out = s.getOutputStream();
InputStream in = s.getInputStream();
Log.d(TAG, tid + " Sending data to printer server " + IP + ":" + portNum); out.write(new byte[]{0x10, 0x04, 0x02});
out.write(printerBytes); // printerBytes 为实际打印的 bytes 数据内容,bytes[]数组
// 注:(重要,重要,重要)
// 当 portNum 设定为 9100 时,请将 out.write 中的内容 bytes[] 设定为 GB2312 字符集 // 当 portNum 设定为 9101 时,请将 out.write 中的内容 bytes[] 设定为 UTF8 字符集
// 在每一次新起 Socket 连接中,请先发送 DLE EOT 指令来同 HCD POS 的打印代理进行握手 // 发送 0x10, 0x04, 0x01 或者 0x10, 0x04, 0x02 都可以;
// 但建议发送 0x10, 0x04, 0x02,此命令还可以返回打印机状态,以确认打印机当前是否满足打印条件。具体的打印内容,还请参考通用的 ESC 指令集,如《佳博热敏票据打印机编程手册 v1.0.5.pdf》
DLE EOT指令参考


获取打印机已打印长度
类似上方的 DLE EOT 指令,在 socket 连接打印机后,通过发送 0x10 0x04 0x1F 给内置打印机,可获 取当前打印机打印长度。
发送后,可从打印机接收到 2个 bytes 数据,收到顺序如下:
byte[0] byte[1]
其中, byte[0] 为低字节, byte[1]为高字节,可通过如下方式获取实际的长度值: byte[1]<<8 + byte[0];
注:
(1)该长度为增加值,即上一次获取和这一次获取之间,打印机马达所走的距离;若两次获取之间未 做任何打印动作,则第二次获取长度为 0;
(2)该长度单位为毫米 ms;
(3) POS设备的内置打印机掉电则数据丢失,故无可存储功能,若需要计算打印机寿命(历史累计的 所有打印距离),请在【上层应用】端进行 定时查询 + 云端保存;
如:当从打印机返回数值 34 12(十六进制),则长度:0x1234 --->4660 毫米
获取打印机打印头温度值
发送指令 0x10 0x04 0x1e
发送后,可从打印机接收到 2个 bytes 数据,收到顺序如下: byte[0] byte[1]
其中, byte[0] 为低字节, byte[1]为高字节,可通过如下方式获取实际的温度值: byte[1]<<8 + byte[0];
注:
该温度值为小数点后三位,如: 当从打印机返回数值 0x58 0x98 (十六进制),则长度: 0x9858 ---> 39000 --> 39摄氏度
获取打印机浓度值
发送指令 0x10 0x04 0x1c
发送后,可从打印机接收到 1个 bytes 数据,为当前打印浓度,一般打印浓度获取到会是 0,1,2,3,4。 其中,0表示打印机浓度不强制设置,由打印机固件来进行默认; 1-4 分别代表由命令来设置对应的打印 浓度,浓度4最高。如,返回0x03,表示当前打印机内被设置了的打印浓度为 3 等级。
设置打印机浓度值
发送指令 0x1e 0x1a 0x51 <浓度值> ,无返回值。
其中<浓度值> 可以为 0-4,0表示打印机浓度不强制设置,由打印机固件来进行默认;1-4 分别代表由 命令来设置对应的打印浓度,浓度4最高;
如 0x1e 0x1a 0x51 0x03,表示设置浓度为 3 等级。
