打印开发中关于打印协议

打印机打印协议有两种,EPOS和ESC/POS.

本文基于GP58系列,它可以兼容ESC/POS指令集,对EPSON的打印机通用.

对于EPOS的打印开发,可以使用微软的库POS.NET进行开发(连接打印机需要使用逻辑名字,
可以在打印机官网下载相关的驱动),对于ESC/POS,可以使用串口开发(连接打印机需要使用com口名字,对于除com口之外的打印机需要在官网上下载相关的驱动)

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设备的引用,android系统会询问你是否允许设备访问,默认为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; 
        } 
      } 

  } 

发表评论

电子邮件地址不会被公开。 必填项已用*标注