上一篇文章结束了ESC/POS的指令集,没看过的可以去看一下,可以当作工具文档来使用的

android 控制POS机图文打印(一)

这一篇正式介绍如何使用POS机来打印图文信息。

首先介绍一下,ESC/POS指令是如何使用的,

字体加粗指令:

byte[] FONT_B = new byte[3];

FONT_B[0] = 27;

FONT_B[1] = 33;

FONT_B[2] = 8;

字体纵向放大一倍:

byte[] CLEAR_FONT = new byte[3];

CLEAR_FONT[0] = 0x1c;

CLEAR_FONT[1] = 0x21;

CLEAR_FONT[2] = 0;

清除字体放大指令:

byte[] FD_FONT = new byte[3];

FD_FONT[0] = 0x1c;

FD_FONT[1] = 0x21;

FD_FONT[2] = 4;

打印条形码指令:

byte[] PRINT_CODE = new byte[9];

PRINT_CODE[0] = 0x1d;

PRINT_CODE[1] = 0x68;

PRINT_CODE[2] = 120;

PRINT_CODE[3] = 0x1d;

PRINT_CODE[4] = 0x48;

PRINT_CODE[5] = 0x10;

PRINT_CODE[6] = 0x1d;

PRINT_CODE[7] = 0x6B;

PRINT_CODE[8] = 0x02;

等等的指令使用。。。

可以参考下上一篇文章的指令集来进行设置。其中,ESC/POS指令是可以进行十进制和十六进制的设定的,这个大家要注意了。

接下来是介绍如何连接到打印机。

private static String PRINT_IP = "192.168.1.111";// 打印机IP地址

private static int PRINT_PORT = 9100;// 打印机端口 默认为9100 建议不要修改打印机端口,修改了可能会连接不上的

这里设定了打印机的IP地址和端口,其中,端口号为9100是打印机默认的设置,最好就不要去修改,如果修改了,可能导致连接不上的,我一开始的时候设置了9000,就连接不上了。。。

然后就通过socket进行连接打印机

// 建立打印机连接

socket = new Socket();

InetSocketAddress iSocketAddress = new InetSocketAddress(PRINT_IP, PRINT_PORT);// 绑定打印机

socket.connect(iSocketAddress);// 建立连接

接下来就是写一个打印的方法,调用打印机传输指令和数据到打印机进行打印。

直接上代码了,代码里面的注释得非常清楚

/** * @param PRINT_DATA *            小票主要数据 * @param GS_INFO *            小票附带信息 * @param CAIDAN_SN *            小票号码 */public void print(List<Map<String, Object>> PRINT_DATA,Map<String, String> GS_INFO, String CAIDAN_SN) {if (PRINT_DATA != null && PRINT_DATA.size() > 0) {try {// 条码打印指令byte[] PRINT_CODE = new byte[9];PRINT_CODE[0] = 0x1d;PRINT_CODE[1] = 0x68;PRINT_CODE[2] = 120;PRINT_CODE[3] = 0x1d;PRINT_CODE[4] = 0x48;PRINT_CODE[5] = 0x10;PRINT_CODE[6] = 0x1d;PRINT_CODE[7] = 0x6B;PRINT_CODE[8] = 0x02;// 清除字体放大指令byte[] FD_FONT = new byte[3];FD_FONT[0] = 0x1c;FD_FONT[1] = 0x21;FD_FONT[2] = 4;// 字体加粗指令byte[] FONT_B = new byte[3];FONT_B[0] = 27;FONT_B[1] = 33;FONT_B[2] = 8;// 字体纵向放大一倍byte[] CLEAR_FONT = new byte[3];CLEAR_FONT[0] = 0x1c;CLEAR_FONT[1] = 0x21;CLEAR_FONT[2] = 0;// 计算合计金额int price = 0;// 初始化打印机socketOut.write(27);socketOut.write(64);socketOut.write(FD_FONT);// 字体放大socketOut.write(FONT_B);// 字体加粗socketOut.write(10);writer.write("  " + GS_INFO.get("GS_Name") + " \r\n");writer.flush();// 关键,很重要,不然指令一次性输出,后面指令覆盖前面指令,导致取消放大指令无效socketOut.write(CLEAR_FONT);socketOut.write(10);writer.write("NO: " + CAIDAN_SN + " \r\n");writer.write("------------------------------\r\n");writer.write("买家姓名: " + GS_INFO.get("GS_user_name") + "\r\n");writer.write("地址: " + GS_INFO.get("GS_address") + "\r\n");writer.write("联系电话: " + GS_INFO.get("GS_tel") + " \r\n");writer.write("付款方式: " + GS_INFO.get("GS_pay_type") + "\r\n");writer.write("------------------------------\r\n");writer.write(Fix_String_Lenth(1,Colum_Name[0], 4)+ Fix_String_Lenth(0,Colum_Name[1], 14)+ Fix_String_Lenth(1,Colum_Name[2], 4)+ Fix_String_Lenth(1,Colum_Name[3], 6) + "\r\n");for (int i = 0; i < PRINT_DATA.size() - 1; i++) {writer.write(Fix_String_Lenth(1,i + 1 + "", 2)+ Fix_String_Lenth(0,PRINT_DATA.get(i).get("cai_name").toString(), 14)+ Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_num").toString(), 4)+ Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_price").toString(), 6) + "\r\n");price += Double.parseDouble(PRINT_DATA.get(i).get("cai_price").toString());}// 打印二维码Bitmap bmp = (Bitmap)PRINT_DATA.get(PRINT_DATA.size() - 1).get("erweima");            byte[] data = new byte[] { 0x1B, 0x33, 0x00 };            socketOut.write(data);            data[0] = (byte)0x00;            data[1] = (byte)0x00;            data[2] = (byte)0x00;    //重置参数                        int pixelColor;                        // ESC * m nL nH 点阵图            byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x00, 0x00, 0x00 };                        escBmp[2] = (byte)0x21;                        //nL, nH              escBmp[3] = (byte)(bmp.getWidth() % 256);            escBmp[4] = (byte)(bmp.getWidth() / 256);                        // 每行进行打印            for (int i = 0; i < bmp.getHeight()  / 24 + 1; i++){            socketOut.write(escBmp);                            for (int j = 0; j < bmp.getWidth(); j++){                    for (int k = 0; k < 24; k++){                        if (((i * 24) + k) < bmp.getHeight()){                            pixelColor = bmp.getPixel(j, (i * 24) + k);                            if (pixelColor != -1){                            data[k / 8] += (byte)(128 >> (k % 8));                            }                        }                    }                                        socketOut.write(data);                    // 重置参数                    data[0] = (byte)0x00;                    data[1] = (byte)0x00;                    data[2] = (byte)0x00;                }                //换行                byte[] byte_send1 = new byte[2];                byte_send1[0] = 0x0d;                byte_send1[1] = 0x0a;                socketOut.write(byte_send1);            }                        //换行            byte[] byte_send2 = new byte[2];            byte_send2[0] = 0x0d;            byte_send2[1] = 0x0a;            //发送测试信息             socketOut.write(byte_send2);            writer.write("------------------------------\r\n");writer.write("本单共" + (PRINT_DATA.size() - 1) + "件商品,合计费用:" + price + "元\r\n");writer.write("------------------------------\r\n");writer.write("  谢 谢 惠 顾\r\n");// 下面指令为打印完成后自动走纸writer.write(27);writer.write(100);writer.write(4);writer.write(10);writer.close();socketOut.close();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}}
打印文字是传输String过去进行打印的,而需要打印图片的话比较麻烦一下,需要把图片转换成点阵数据然后进行每行打印,可以参考print方法。

然后直接调用该方法就可以进行打印了,记住,android4.0之后不能在主线程中执行了,需要新建一个线程来执行该方法,如

new Thread() {<span style="white-space:pre"></span>public void run() {<span style="white-space:pre"></span>try {<span style="white-space:pre"></span>new PrintLine().print(lists, mapgs, sn);<span style="white-space:pre"></span>} catch (IOException e) {<span style="white-space:pre"></span>e.printStackTrace();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>};}.start();
其实android调用pos机进行打印也不是想象中的那么难搞的,只要把ESC/POS指令掌握了,如何传输指令和数据过去搞定了,就不难了,如果还需要其他操作,比如打印特殊符号,字体的其他效果的打印等等,都可以参考print方法中传输指令的方式进行设定,pos机就能识别到指令接收到数据进行打印了,是不是挺简单的?有什么问题大家可以一起讨论的,本人也是初次接触pos机的。


更多相关文章

  1. 实时监控Android设备网络封包
  2. 编译Linaro的Android内核有感
  3. Android(安卓)cavas将横向字体转换为竖直rotate(),drawText(),se
  4. 彻底解决 Android(安卓)Studio 乱码问题
  5. Material Design设计规范
  6. Android(安卓)初始化脚本语法解析
  7. Android连接蓝牙打印机实现PDF文档的打印
  8. Android自定义View,你必须知道的几点
  9. qt for android中文字体显示异常解决方案

随机推荐

  1. 每天学一个 Linux 命令(29):tail
  2. 排序算法——冒泡排序
  3. 2021年Clion激活码来了,亲测永久有效!
  4. 后台八 文章分类
  5. Java Lambda 表达式
  6. 深入理解Java Stream流水线
  7. ELK 之 elasticsearch集群安装
  8. 如何记忆 Spring Bean 的生命周期
  9. GoPath模式和GoMoudle模式的相爱相杀
  10. 一次 JVM 进程退出的原因分析