android 控制POS機圖文列印(二)

來源:互聯網
上載者:User

標籤:

上一篇文章結束了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

  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") + " \r\n"); 
  47.             writer.flush();// 關鍵,很重要,不然指令一次性輸出,後面指令覆蓋前面指令,導致取消放大指令無效
  48.             socketOut.write(CLEAR_FONT); 
  49.             socketOut.write(10); 
  50.             writer.write("NO: " + CAIDAN_SN + " \r\n"); 
  51.             writer.write("------------------------------\r\n"); 
  52.             writer.write("買家姓名: " + GS_INFO.get("GS_user_name") + "\r\n"); 
  53.             writer.write("地址: " + GS_INFO.get("GS_address") + "\r\n"); 
  54.             writer.write("聯絡電話: " + GS_INFO.get("GS_tel") + " \r\n"); 
  55.             writer.write("付款條件: " + GS_INFO.get("GS_pay_type") + "\r\n"); 
  56.             writer.write("------------------------------\r\n"); 
  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) + "\r\n"); 
  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) + "\r\n"); 
  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("------------------------------\r\n"); 
  113.             writer.write("本單共" + (PRINT_DATA.size() - 1) + "件商品,合計費用:" + price + "元\r\n"); 
  114.             writer.write("------------------------------\r\n"); 
  115.             writer.write("  謝 謝 惠 顧\r\n"); 
  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

  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

android 控制POS機圖文列印(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.