zoukankan      html  css  js  c++  java
  • android 控制POS机图文打印(二)

    上一篇文章结束了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 StringPRINT_IP = "192.168.1.111";// 打印机IP地址

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

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

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

    // 建立打印机连接

    socket = new Socket();

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

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

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

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

    [java] view plaincopy在CODE上查看代码片派生到我的代码片

    1. /**
    2.      * @param PRINT_DATA
    3.      *            小票主要数据
    4.      * @param GS_INFO
    5.      *            小票附带信息
    6.      * @param CAIDAN_SN
    7.      *            小票号码
    8.      */
    9. public void print(List<Map<String, Object>> PRINT_DATA,Map<String, String> GS_INFO, String CAIDAN_SN) { 
    10. if (PRINT_DATA != null && PRINT_DATA.size() > 0) { 
    11. try { 
    12. // 条码打印指令
    13. byte[] PRINT_CODE = new byte[9]; 
    14.             PRINT_CODE[0] = 0x1d; 
    15.             PRINT_CODE[1] = 0x68; 
    16.             PRINT_CODE[2] = 120; 
    17.             PRINT_CODE[3] = 0x1d; 
    18.             PRINT_CODE[4] = 0x48; 
    19.             PRINT_CODE[5] = 0x10; 
    20.             PRINT_CODE[6] = 0x1d; 
    21.             PRINT_CODE[7] = 0x6B; 
    22.             PRINT_CODE[8] = 0x02; 
    23. // 清除字体放大指令
    24. byte[] FD_FONT = new byte[3]; 
    25.             FD_FONT[0] = 0x1c; 
    26.             FD_FONT[1] = 0x21; 
    27.             FD_FONT[2] = 4; 
    28. // 字体加粗指令
    29. byte[] FONT_B = new byte[3]; 
    30.             FONT_B[0] = 27; 
    31.             FONT_B[1] = 33; 
    32.             FONT_B[2] = 8; 
    33. // 字体纵向放大一倍
    34. byte[] CLEAR_FONT = new byte[3]; 
    35.             CLEAR_FONT[0] = 0x1c; 
    36.             CLEAR_FONT[1] = 0x21; 
    37.             CLEAR_FONT[2] = 0; 
    38. // 计算合计金额
    39. int price = 0; 
    40. // 初始化打印机
    41.             socketOut.write(27); 
    42.             socketOut.write(64); 
    43.             socketOut.write(FD_FONT);// 字体放大
    44.             socketOut.write(FONT_B);// 字体加粗
    45.             socketOut.write(10); 
    46.             writer.write("  " + GS_INFO.get("GS_Name") + " "); 
    47.             writer.flush();// 关键,很重要,不然指令一次性输出,后面指令覆盖前面指令,导致取消放大指令无效
    48.             socketOut.write(CLEAR_FONT); 
    49.             socketOut.write(10); 
    50.             writer.write("NO: " + CAIDAN_SN + " "); 
    51.             writer.write("------------------------------ "); 
    52.             writer.write("买家姓名: " + GS_INFO.get("GS_user_name") + " "); 
    53.             writer.write("地址: " + GS_INFO.get("GS_address") + " "); 
    54.             writer.write("联系电话: " + GS_INFO.get("GS_tel") + " "); 
    55.             writer.write("付款方式: " + GS_INFO.get("GS_pay_type") + " "); 
    56.             writer.write("------------------------------ "); 
    57.             writer.write(Fix_String_Lenth(1,Colum_Name[0], 4) 
    58.                     + Fix_String_Lenth(0,Colum_Name[1], 14) 
    59.                     + Fix_String_Lenth(1,Colum_Name[2], 4) 
    60.                     + Fix_String_Lenth(1,Colum_Name[3], 6) + " "); 
    61. for (int i = 0; i < PRINT_DATA.size() - 1; i++) { 
    62.                 writer.write(Fix_String_Lenth(1,i + 1 + "", 2) 
    63.                         + Fix_String_Lenth(0,PRINT_DATA.get(i).get("cai_name").toString(), 14) 
    64.                         + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_num").toString(), 4) 
    65.                         + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_price").toString(), 6) + " "); 
    66.                 price += Double.parseDouble(PRINT_DATA.get(i).get("cai_price").toString()); 
    67.             } 
    68. // 打印二维码
    69.             Bitmap bmp = (Bitmap)PRINT_DATA.get(PRINT_DATA.size() - 1).get("erweima"); 
    70. byte[] data = new byte[] { 0x1B, 0x33, 0x00 }; 
    71.             socketOut.write(data); 
    72.             data[0] = (byte)0x00; 
    73.             data[1] = (byte)0x00; 
    74.             data[2] = (byte)0x00;    //重置参数
    75. int pixelColor; 
    76. // ESC * m nL nH 点阵图
    77. byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x00, 0x00, 0x00 }; 
    78.             escBmp[2] = (byte)0x21; 
    79. //nL, nH 
    80.             escBmp[3] = (byte)(bmp.getWidth() % 256); 
    81.             escBmp[4] = (byte)(bmp.getWidth() / 256); 
    82. // 每行进行打印
    83. for (int i = 0; i < bmp.getHeight()  / 24 + 1; i++){ 
    84.                 socketOut.write(escBmp); 
    85. for (int j = 0; j < bmp.getWidth(); j++){ 
    86. for (int k = 0; k < 24; k++){ 
    87. if (((i * 24) + k) < bmp.getHeight()){ 
    88.                             pixelColor = bmp.getPixel(j, (i * 24) + k); 
    89. if (pixelColor != -1){ 
    90.                                 data[k / 8] += (byte)(128 >> (k % 8)); 
    91.                             } 
    92.                         } 
    93.                     } 
    94.                     socketOut.write(data); 
    95. // 重置参数
    96.                     data[0] = (byte)0x00; 
    97.                     data[1] = (byte)0x00; 
    98.                     data[2] = (byte)0x00; 
    99.                 } 
    100. //换行
    101. byte[] byte_send1 = new byte[2]; 
    102.                 byte_send1[0] = 0x0d; 
    103.                 byte_send1[1] = 0x0a; 
    104.                 socketOut.write(byte_send1); 
    105.             } 
    106. //换行
    107. byte[] byte_send2 = new byte[2]; 
    108.             byte_send2[0] = 0x0d; 
    109.             byte_send2[1] = 0x0a; 
    110. //发送测试信息
    111.             socketOut.write(byte_send2); 
    112.             writer.write("------------------------------ "); 
    113.             writer.write("本单共" + (PRINT_DATA.size() - 1) + "件商品,合计费用:" + price + "元 "); 
    114.             writer.write("------------------------------ "); 
    115.             writer.write("  谢 谢 惠 顾 "); 
    116. // 下面指令为打印完成后自动走纸
    117.             writer.write(27); 
    118.             writer.write(100); 
    119.             writer.write(4); 
    120.             writer.write(10); 
    121.             writer.close(); 
    122.             socketOut.close(); 
    123.         } catch (IOException e) { 
    124.             e.printStackTrace(); 
    125.         } catch (Exception e) { 
    126.             e.printStackTrace(); 
    127.         } 
    128.         } 
    129.     } 

    打印文字是传输String过去进行打印的,而需要打印图片的话比较麻烦一下,需要把图片转换成点阵数据然后进行每行打印,可以参考print方法。

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

    [java] view plaincopy在CODE上查看代码片派生到我的代码片

    1. new Thread() { 
    2. <span style="white-space:pre">    </span>public void run() { 
    3. <span style="white-space:pre">        </span>try { 
    4. <span style="white-space:pre">            </span>new PrintLine().print(lists, mapgs, sn); 
    5. <span style="white-space:pre">        </span>} catch (IOException e) { 
    6. <span style="white-space:pre">            </span>e.printStackTrace(); 
    7. <span style="white-space:pre">        </span>} 
    8. <span style="white-space:pre">    </span>}; 
    9. }.start(); 

    其实android调用po

  • 相关阅读:
    mysql创建用户后无法访问数据库的问题
    mysql索引
    hadoop安装
    MySQL工作原理
    MySQL数据库优化的八种方式
    FLOAT 和 DOUBLE区别
    在C++中定义常量
    C++变量类型
    FTP主动模式、被动模式(转)
    FtpClient ReplyCode 意义及 FtpClientHelper辅助类
  • 原文地址:https://www.cnblogs.com/cute/p/4892418.html
Copyright © 2011-2022 走看看