socket实现手机连接网络打印机打印pos单 so

socket实现手机连接网络打印机打印pos单

0.00

★1057次@

A:

上架: 2019-08-09 14:09:30

socket实现手机连接网络打印机打印pos单

                 
 

四方仙域传送阵         

打印的工具类:

public class PrintLine {
String TAG = "xxl";
 static String PRINT_IP = "192.168.1.206";
 static int PRINT_PORT = 9100;
 OutputStream socketOut = null;
 OutputStreamWriter writer = null;
 String[] Colum_Name = new String[] { "ID", "菜名", "份数", "小计金额" };// 设定小票列标题
 /**
   * @throws IOException
   *
   */
 public PrintLine() throws IOException {
   // TODO Auto-generated constructor stub
   // 建立打印机连接
   //
  Socket  socket = new Socket( PRINT_IP, PRINT_PORT);
   Log.i(TAG, PRINT_PORT+"");
   socketOut = socket.getOutputStream();
   socket.isClosed();
   writer = new OutputStreamWriter(socketOut, "GBK");
 }
 /**
   * @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) {
   /*
    * 接收小票页面 公司信息 Map<String,String> map=new HashMap<String,String>();
    * map.put("GS_Name", "武汉联兴科技有限公司"); map.put("GS_Address",
    * "武汉市解放大道2679号"); map.put("GS_Tel", "13507115045"); map.put("GS_Qq",
    * "138027869");
    */
   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[] CLEAR_FONT = new byte[3];
    CLEAR_FONT[0] = 0x1c;
    CLEAR_FONT[1] = 0x21;
    CLEAR_FONT[2] = 1;
    // 字体加粗指令
    byte[] FONT_B = new byte[3];
    FONT_B[0] = 27;
    FONT_B[1] = 33;
    FONT_B[2] = 8;
    // 字体横向放大一倍
    byte[] FD_FONT = new byte[3];
    FD_FONT[0] = 0x1c;
    FD_FONT[1] = 0x21;
    FD_FONT[2] = 4;
    // 计算合计金额
    int price = 0;
    // 初始化打印机
    socketOut.write(27);
    socketOut.write(27);
    socketOut.write(FD_FONT);// 字体放大
    socketOut.write(FONT_B);// 字体加粗
    //公司名称
    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(Fix_String_Lenth(1,Colum_Name[0], 6)
      + 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(); i++) {
  int b =PRINT_DATA.get(i).get("cai_name").toString().length();
     writer.write(Fix_String_Lenth(1,i + 1 + "", 6)
       + Fix_String_Lenth(0,PRINT_DATA.get(i).get("cai_name")
         .toString(), 18-b)
       + Fix_String_Lenth(1,1 + "", 6)
       + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_price")
         .toString(), 6) + "\r\n");
     price += Integer.parseInt(PRINT_DATA.get(i).get("cai_price")
       .toString());
    }
    writer.write("-------------------------------------\r\n");
    writer.write("本单共  " + PRINT_DATA.size() + " 道菜品,合计费用:  " + price
      + "元\r\n");
    writer.write("-------------------------------------\r\n");
    writer.write("地址: " + GS_INFO.get("GS_Address") + "\r\n");
    writer.write("联系电话: " + GS_INFO.get("GS_Tel") + " \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) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
 }
 /**
   * 字符串长度补齐,方便打印时对齐,美化打印页面,不过中文计算好像有点问题
   *
   * @param strs
   *            源字符
   * @param len
   *            指定字符长度
   * @return
   * @throws UnsupportedEncodingException
   */
 public String Fix_String_Lenth(int type ,String strs, int len) {
   String strtemp = strs;
   int len1 = strs.length();
   switch (type) {
   case 0:
    while (strtemp.length() < len) {
     strtemp += " ";}
    break;
    case 1:
     while (strtemp.length() < len) {
      strtemp += " ";}
     break;
   default:
   
    break;
   }  

   return strtemp;
 }
 }


调用打印工具类打印的Activity

package com.example.airprint;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

String TAG = "xxl";
List list;
Map<String,String> map;
Map<String,Object> dishMap;
Map<String,Object> dishMap1;
@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 Button btn = (Button) findViewById(R.id.print);
 btn.setOnClickListener(this);
}

@Override
public void onClick(View v) {
 list = new ArrayList<Map<String, Object>>();
 dishMap = new HashMap<String,Object>();
 dishMap1 = new HashMap<String,Object>();
 dishMap.put("cai_name", "地三鲜");
 dishMap.put("cai_price", "20");
 dishMap1.put("cai_name", "长豆角肉末盖浇饭");
 dishMap1.put("cai_price", "10");
 list.add(dishMap);
 list.add(dishMap1);
 map =new HashMap<String,String>();
     map.put("GS_Name", "杭州友络软件有限公司");
     map.put("GS_Address",
     "浙江-杭州,滨江区南环路3760号保亿创艺大厦1203室");
     map.put("GS_Tel", "13507115045");
     map.put("GS_Qq","138027869");
     Log.i(TAG, map.get("GS_Address"));

     SimpleDateFormat   formatter   =   new   SimpleDateFormat   ("yyyy年MM月dd日   HH:mm:ss     ");  
     Date   curDate   =   new   Date(System.currentTimeMillis());//获取当前时间  
     final String   str   =   formatter.format(curDate); //可以获取当前的年月时分,也可以分开写:  


   new Thread(){
    @SuppressWarnings("unchecked")
   public void run() {
     try {
     new PrintLine().print(list,map,str);
     Log.i(TAG, map.get("GS_Name"));
    } catch (IOException e) {
     Log.i(TAG, e+"");
     e.printStackTrace();
    }
    };
   
   
   }.start();
   
   
 
 
}

 

}

pos打印机设置字体大小的代码:

  1. String content = "数据测据测试一下字体的大小\n";  

  2. Socket client = new Socket(ip, port);  

  3. OutputStream os = client.getOutputStream();  

  4. //字体横向放大一倍  

  5. os.write(0x1c);  

  6. os.write(0x21);  

  7. os.write(4);  

  8. os.write(content.getBytes("gbk"));  

  9. //字体纵向放大一倍  

  10. os.write(0x1c);  

  11. os.write(0x21);  

  12. os.write(8);  

  13. os.write(content.getBytes("gbk"));  

  14. //字体横向纵向均放大一倍  

  15. os.write(0x1c);  

  16. os.write(0x21);  

  17. os.write(4);  

  18. os.write(content.getBytes("gbk"));  

  19. os.flush();  

  20. 由于POS打印机的类型不同,可能支持的EPSON指令也不同。就拿放大字体来说,pos58 打印机和 pos80 打印机指令就不尽相同,那么如何兼容多种打印机呢。

    比如说,有的打印机并不是使用 0x1c 作为放大指令,而是使用 0x1b 作为放大指令

    1. /* 横向放大一倍 */  

    2. os.write(0x1c);  

    3. os.write(0x21);  

    4. os.write(4);  

    5.  

    6. os.write(0x1b);  

    7. os.write(0x21);  

    8. os.write(4);  

    9.  

    10. /* 纵向放大一倍 */  

    11. os.write(0x1c);  

    12. os.write(0x21);  

    13. os.write(8);  

    14.  

    15. os.write(0x1b);  

    16. os.write(0x21);  

    17. os.write(8);  

    18.  

    19. /* 横向纵向都放大一倍 */  

    20. os.write(0x1c);  

    21. os.write(0x21);  

    22. os.write(12);  

    23.  

    24. os.write(0x1b);  

    25. os.write(0x21);  

    26. os.write(12);  

    27. .打印符形码



  1. os.write(0x1d);  

  2. os.write(0x68);  

  3. os.write(120);  

  4. os.write(0x1d);  

  5. os.write(0x48);  

  6. os.write(0x01);  

  7. os.write(0x1d);  

  8. os.write(0x6B);  

  9. os.write(0x02);  

  10. os.write("091955826335".getBytes()); //条形码数字  

  11. os.write(0x00);  

  12. os.write("\n".getBytes());


硬件app