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);// 建立连接

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

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

  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.             // 清除字体放大指令  
  25.             byte[] FD_FONT = new byte[3];  
  26.             FD_FONT[0] = 0x1c;  
  27.             FD_FONT[1] = 0x21;  
  28.             FD_FONT[2] = 4;  
  29.               
  30.             // 字体加粗指令  
  31.             byte[] FONT_B = new byte[3];  
  32.             FONT_B[0] = 27;  
  33.             FONT_B[1] = 33;  
  34.             FONT_B[2] = 8;  
  35.               
  36.             // 字体纵向放大一倍  
  37.             byte[] CLEAR_FONT = new byte[3];  
  38.             CLEAR_FONT[0] = 0x1c;  
  39.             CLEAR_FONT[1] = 0x21;  
  40.             CLEAR_FONT[2] = 0;  
  41.               
  42.             // 计算合计金额  
  43.             int price = 0;  
  44.               
  45.             // 初始化打印机  
  46.             socketOut.write(27);  
  47.             socketOut.write(64);  
  48.             socketOut.write(FD_FONT);// 字体放大  
  49.             socketOut.write(FONT_B);// 字体加粗  
  50.             socketOut.write(10);  
  51.             writer.write("  " + GS_INFO.get("GS_Name") + " \r\n");  
  52.             writer.flush();// 关键,很重要,不然指令一次性输出,后面指令覆盖前面指令,导致取消放大指令无效  
  53.   
  54.             socketOut.write(CLEAR_FONT);  
  55.             socketOut.write(10);  
  56.             writer.write("NO: " + CAIDAN_SN + " \r\n");  
  57.             writer.write("------------------------------\r\n");  
  58.             writer.write("买家姓名: " + GS_INFO.get("GS_user_name") + "\r\n");  
  59.             writer.write("地址: " + GS_INFO.get("GS_address") + "\r\n");  
  60.             writer.write("联系电话: " + GS_INFO.get("GS_tel") + " \r\n");  
  61.             writer.write("付款方式: " + GS_INFO.get("GS_pay_type") + "\r\n");  
  62.             writer.write("------------------------------\r\n");  
  63.             writer.write(Fix_String_Lenth(1,Colum_Name[0], 4)  
  64.                     + Fix_String_Lenth(0,Colum_Name[1], 14)  
  65.                     + Fix_String_Lenth(1,Colum_Name[2], 4)  
  66.                     + Fix_String_Lenth(1,Colum_Name[3], 6) + "\r\n");  
  67.             for (int i = 0; i < PRINT_DATA.size() - 1; i++) {  
  68.                 writer.write(Fix_String_Lenth(1,i + 1 + ""2)  
  69.                         + Fix_String_Lenth(0,PRINT_DATA.get(i).get("cai_name").toString(), 14)  
  70.                         + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_num").toString(), 4)  
  71.                         + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_price").toString(), 6) + "\r\n");  
  72.                 price += Double.parseDouble(PRINT_DATA.get(i).get("cai_price").toString());  
  73.             }  
  74.               
  75.             // 打印二维码  
  76.             Bitmap bmp = (Bitmap)PRINT_DATA.get(PRINT_DATA.size() - 1).get("erweima");  
  77.               
  78.             byte[] data = new byte[] { 0x1B0x330x00 };  
  79.             socketOut.write(data);  
  80.             data[0] = (byte)0x00;  
  81.             data[1] = (byte)0x00;  
  82.             data[2] = (byte)0x00;    //重置参数  
  83.               
  84.             int pixelColor;  
  85.               
  86.             // ESC * m nL nH 点阵图  
  87.             byte[] escBmp = new byte[] { 0x1B0x2A0x000x000x00 };  
  88.               
  89.             escBmp[2] = (byte)0x21;  
  90.               
  91.             //nL, nH    
  92.             escBmp[3] = (byte)(bmp.getWidth() % 256);  
  93.             escBmp[4] = (byte)(bmp.getWidth() / 256);  
  94.               
  95.             // 每行进行打印  
  96.             for (int i = 0; i < bmp.getHeight()  / 24 + 1; i++){  
  97.                 socketOut.write(escBmp);  
  98.                   
  99.                 for (int j = 0; j < bmp.getWidth(); j++){  
  100.                     for (int k = 0; k < 24; k++){  
  101.                         if (((i * 24) + k) < bmp.getHeight()){  
  102.                             pixelColor = bmp.getPixel(j, (i * 24) + k);  
  103.                             if (pixelColor != -1){  
  104.                                 data[k / 8] += (byte)(128 >> (k % 8));  
  105.                             }  
  106.                         }  
  107.                     }  
  108.                       
  109.                     socketOut.write(data);  
  110.                     // 重置参数  
  111.                     data[0] = (byte)0x00;  
  112.                     data[1] = (byte)0x00;  
  113.                     data[2] = (byte)0x00;  
  114.                 }  
  115.                 //换行  
  116.                 byte[] byte_send1 = new byte[2];  
  117.                 byte_send1[0] = 0x0d;  
  118.                 byte_send1[1] = 0x0a;  
  119.                 socketOut.write(byte_send1);  
  120.             }  
  121.               
  122.             //换行  
  123.             byte[] byte_send2 = new byte[2];  
  124.             byte_send2[0] = 0x0d;  
  125.             byte_send2[1] = 0x0a;  
  126.             //发送测试信息   
  127.             socketOut.write(byte_send2);  
  128.               
  129.             writer.write("------------------------------\r\n");  
  130.             writer.write("本单共" + (PRINT_DATA.size() - 1) + "件商品,合计费用:" + price + "元\r\n");  
  131.             writer.write("------------------------------\r\n");  
  132.             writer.write("  谢 谢 惠 顾\r\n");  
  133.             // 下面指令为打印完成后自动走纸  
  134.             writer.write(27);  
  135.             writer.write(100);  
  136.             writer.write(4);  
  137.             writer.write(10);  
  138.             writer.close();  
  139.             socketOut.close();  
  140.         } catch (IOException e) {  
  141.             e.printStackTrace();  
  142.         } catch (Exception e) {  
  143.             e.printStackTrace();  
  144.         }  
  145.         }  
  146.     }  
打印文字是传输String过去进行打印的,而需要打印图片的话比较麻烦一下,需要把图片转换成点阵数据然后进行每行打印,可以参考print方法。

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

  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
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值