Android 의 POS 프린터 호출 이 간단 합 니 다.

본 고 는 GP 58 시 리 즈 를 바탕 으로 ESC/POS 명령 집합 을 호 환 하여 EPSON 프린터 에 통용 된다.
Android 에서 의 설비 디 버 깅 은 만약 에 설비 가 구동 을 제공 하면 공장 의 구동 에 따라 디 버 깅 하면 됩 니 다.장치 가 구동 을 제공 하지 않 아 일반적인 방법 에 따라 디 버 깅 할 수 밖 에 없다.프린터 출력 을 제어 하기 위해 USB 인 터 페 이 스 를 사용 합 니 다.
1.우선 USB 관리자 가 져 오기

public UsbAdmin(Context context) { 
    mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); 
    mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0); 
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
    context.registerReceiver(mUsbReceiver, filter); 
  }
지연 의 도 를 사용 하여 usb 접속 시의 방송 을 받 습 니 다.방송 이 수신 되면 새로운 장치 가 접속 되 었 음 을 설명 합 니 다.
boardcast action 추가

private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (ACTION_USB_PERMISSION.equals(action)) { 
        synchronized (this) { 
          UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
          if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
            if (device != null) { 
              setDevice(device); 
            } else { 
              Closeusb(); 
             // mDevice = device; 
            } 
          } else { 
            Log.d(TAG, "permission denied for device " + device); 
          } 
 
        } 
 
      } 
    } 
  }; 
usb 장치 의 인용 을 가 져 오 면 안 드 로 이 드 시스템 은 장치 접근 을 허용 하 는 지 물 어 볼 것 입 니 다.기본 값 은 false 입 니 다.접근 이 허용 되면 USB 의 인용 이 null 인지 여 부 를 판단 하고 비어 있 지 않 으 면 setDevice 를 사용 하여 Connection 을 만 듭 니 다.그렇지 않 으 면 이번 연결 을 닫 습 니 다.
setDevice 에서 우 리 는 장치 의 기능 집합(UsbInterface)을 가 져 올 수 있 고 통신 채널(UsbEndpoint)도 가 져 올 수 있 으 며 host 와 device 의 연결 을 만들어 데 이 터 를 전송 할 수 있 습 니 다.

private void setDevice(UsbDevice device) { 
    if (device != null) { 
      UsbInterface intf = null; 
      UsbEndpoint ep = null; 
 
      int InterfaceCount = device.getInterfaceCount(); 
      int j; 
 
      mDevice = device; 
      for (j = 0; j < InterfaceCount; j++) { 
        int i; 
 
        intf = device.getInterface(j); 
        Log.i(TAG, "   :" + j + "  :" + intf.getInterfaceClass()); 
        if (intf.getInterfaceClass() == 7) { 
          int UsbEndpointCount = intf.getEndpointCount(); 
          for (i = 0; i < UsbEndpointCount; i++) { 
            ep = intf.getEndpoint(i); 
            Log.i(TAG, "   :" + i + "   :" + ep.getDirection() + "   :" + ep.getType()); 
            if (ep.getDirection() == 0 && ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { 
              Log.i(TAG, "   :" + j + "   :" + i); 
              break; 
            } 
          } 
          if (i != UsbEndpointCount) { 
            break; 
          } 
        } 
      } 
      if (j == InterfaceCount) { 
        Log.i(TAG, "       "); 
        return; 
      } 
 
      mEndpointIntr = ep; 
 
        UsbDeviceConnection connection = mUsbManager.openDevice(device); 
 
        if (connection != null && connection.claimInterface(intf, true)) { 
          Log.i(TAG, "    ! "); 
          mConnection = connection; 
 
        } else { 
          Log.i(TAG, "    ! "); 
          mConnection = null; 
        } 
      } 
 
  } 
2.관련 클래스 에 UsbAdmin 을 새로 만 들 고 openUsb 를 호출 합 니 다.여 기 는 먼저 위의 setDevice()방법 으로 장치 의 인용 을 얻 었 습 니 다.연결 채널 이 만들어 질 때 모든 USB 장 치 를 보 여 줍 니 다.장치 의 인용 이 존재 하지 않 을 때 모든 USB 장 치 를 보 여 주 며 USB 권한 을 요청 합 니 다.

public void openUsb() { 
    if (mDevice != null) { 
      setDevice(mDevice); 
      if (mConnection == null) { 
        HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); 
        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
 
        while (deviceIterator.hasNext()) { 
          UsbDevice device = deviceIterator.next(); 
          mUsbManager.requestPermission(device, mPermissionIntent); 
        } 
      } 
    } else { 
      HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); 
      Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
 
      while (deviceIterator.hasNext()) { 
        UsbDevice device = deviceIterator.next(); 
        mUsbManager.requestPermission(device, mPermissionIntent); 
      } 
    } 
  } 

3.위의 두 부분 이 다 간 후에 우 리 는 연결 되 어 있 는 프린터 를 제어 하 는 명령 을 보 낼 수 있 습 니 다.여기 서 우 리 는 표준 ESC/POS 명령 집합 을 사용 하고 하드웨어 의 기본 값 으로 코드 를 붙 일 수 있 습 니 다.이곳 의 명령 집합 은 10 진법 표시 형식 을 사용 하고 16 진법 으로 바 꿀 수 있 습 니 다.

public class printerCmdUtils { 
 
  /** 
   *             , POS      
   */ 
 
  public static final byte ESC = 27;//   
  public static final byte FS = 28;//      
  public static final byte GS = 29;//     
  public static final byte DLE = 16;//       
  public static final byte EOT = 4;//     
  public static final byte ENQ = 5;//     
  public static final byte SP = 32;//   
  public static final byte HT = 9;//     
  public static final byte LF = 10;//     (    ) 
  public static final byte CR = 13;//    
  public static final byte FF = 12;//    (         (     ) ) 
  public static final byte CAN = 24;//  (           ) 
   
   
   
//------------------------      ----------------------------- 
   
   
  /** 
   *        
   * @return 
   */ 
  public static byte[] init_printer() 
  { 
    byte[] result = new byte[2]; 
    result[0] = ESC; 
    result[1] = 64; 
    return result; 
  } 
   
   
//------------------------  ----------------------------- 
  
   
  /** 
   *    
   * @param lineNum     
   * @return 
   */ 
  public static byte[] nextLine(int lineNum) 
  { 
      byte[] result = new byte[lineNum]; 
      for(int i=0;i<lineNum;i++) 
      { 
        result[i] = LF; 
      } 
       
      return result; 
  } 
   
 
//------------------------   -----------------------------   
   
   
  /** 
   *      (1  ) 
   * @return 
   */ 
  public static byte[] underlineWithOneDotWidthOn() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESC; 
    result[1] = 45; 
    result[2] = 1; 
    return result; 
  } 
   
   
  /** 
   *      (2  ) 
   * @return 
   */ 
  public static byte[] underlineWithTwoDotWidthOn() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESC; 
    result[1] = 45; 
    result[2] = 2; 
    return result; 
  } 
  /** 
   *         
   * @return 
   */ 
  public static byte[] underlineOff() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESC; 
    result[1] = 45; 
    result[2] = 0; 
    return result; 
  } 
 
   
//------------------------  ----------------------------- 
  
   
  /** 
   *        
   * @return 
   */ 
  public static byte[] boldOn() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESC; 
    result[1] = 69; 
    result[2] = 0xF; 
    return result; 
  } 
   
   
  /** 
   *        
   * @return 
   */ 
  public static byte[] boldOff() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESC; 
    result[1] = 69; 
    result[2] = 0; 
    return result; 
  } 
 
 
//------------------------  ----------------------------- 
   
   
  /** 
   *     
   * @return 
   */ 
  public static byte[] alignLeft() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESC; 
    result[1] = 97; 
    result[2] = 0; 
    return result; 
  } 
   
   
  /** 
   *      
   * @return 
   */ 
  public static byte[] alignCenter() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESC; 
    result[1] = 97; 
    result[2] = 1; 
    return result; 
  } 
   
   
  /** 
   *     
   * @return 
   */ 
  public static byte[] alignRight() 
  { 
      byte[] result = new byte[3]; 
    result[0] = ESC; 
    result[1] = 97; 
    result[2] = 2; 
    return result; 
  } 
 
   
  /** 
   *         col  
   * @param col 
   * @return 
   */ 
  public static byte[] set_HT_position( byte col ) 
  { 
    byte[] result = new byte[4]; 
    result[0] = ESC; 
    result[1] = 68; 
    result[2] = col; 
    result[3] = 0; 
    return result; 
  } 
//------------------------    ----------------------------- 
  
   
  /** 
   *         n  
   * @param num 
   * @return 
   */ 
  public static byte[] fontSizeSetBig(int num) 
  { 
      byte realSize = 0; 
      switch (num) 
      { 
      case 1: 
        realSize = 0;break; 
      case 2: 
        realSize = 17;break; 
      case 3: 
        realSize = 34;break; 
      case 4: 
        realSize = 51;break; 
      case 5: 
        realSize = 68;break; 
      case 6: 
        realSize = 85;break; 
      case 7: 
        realSize = 102;break; 
      case 8: 
        realSize = 119;break; 
      } 
      byte[] result = new byte[3]; 
      result[0] = 29; 
      result[1] = 33; 
      result[2] = realSize; 
      return result; 
  } 
 
   
//------------------------    ----------------------------- 
  
   
  /** 
   *          
   * @param num 
   * @return 
   */ 
  public static byte[] fontSizeSetSmall(int num) 
  { 
      byte[] result = new byte[3]; 
      result[0] = ESC; 
      result[1] = 33; 
     
    return result; 
  } 
 
 
//------------------------  -----------------------------   
  
   
  /** 
   *         
   * @return 
   */ 
  public static byte[] feedPaperCutAll() 
  { 
      byte[] result = new byte[4]; 
     result[0] = GS; 
     result[1] = 86; 
     result[2] = 65; 
     result[3] = 0; 
     return result; 
  } 
   
   
  /** 
   *      (       ) 
   * @return 
   */ 
  public static byte[] feedPaperCutPartial() 
  { 
      byte[] result = new byte[4]; 
     result[0] = GS; 
     result[1] = 86; 
     result[2] = 66; 
     result[3] = 0; 
     return result; 
  } 
 
//------------------------  ----------------------------- 
  public static byte[] byteMerger(byte[] byte_1, byte[] byte_2){  
    byte[] byte_3 = new byte[byte_1.length+byte_2.length];  
    System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);  
    System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);  
    return byte_3;  
  }  
   
   
  public static byte[] byteMerger(byte[][] byteList){  
     
      int length = 0; 
    for(int i=0;i<byteList.length;i++) 
    { 
        length += byteList[i].length; 
    } 
    byte[] result = new byte[length]; 
     
    int index = 0; 
    for(int i=0;i<byteList.length;i++) 
    { 
        byte[] nowByte = byteList[i]; 
        for(int k=0;k<byteList[i].length;k++) 
        { 
          result[index] = nowByte[k]; 
          index++; 
        } 
    } 
    return result;  
  }  
   
  
   
} 

4.위 에서 다 완성 한 후에 필요 한 문자열 을 byte 배열 로 변환 하고 sendmand 방법 으로 인쇄 할 수 있 습 니 다.

@SuppressLint("NewApi") 
  public boolean sendCommand(byte[] Content) { 
    boolean Result; 
    synchronized (this) { 
      int len = -1; 
      if (mConnection != null) { 
        len = mConnection.bulkTransfer(mEndpointIntr, Content, Content.length, 10000); 
      } 
 
      if (len < 0) { 
        Result = false; 
        Log.i(TAG, "    ! " + len); 
      } else { 
        Result = true; 
        Log.i(TAG, "  " + len + "    "); 
      } 
    } 
    return Result; 


len = mConnection.bulkTransfer(mEndpointIntr, Content, Content.length, 10000); 
이 단 계 는 동기 화 잠 금 만 추 가 했 을 뿐 새로운 스 레 드 를 켜 서 처리 하지 않 았 습 니 다.이 컴퓨터 에 문제 가 없 지만 위의 USB 통신 체제 의 글 은 비동기 스 레 드 에 두 어야 한 다 는 언급 이 있 습 니 다.여기 서 주의해 야 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기