2015-01-21 5 views
4

Я работаю с отправкой данных на термопринтер из моего приложения. Я уже правильно работаю над сетью, и мои данные правильно печатаются. Теперь есть дополнительное требование, при котором мы также должны иметь возможность печатать через usb.Отправка данных на термопринтер с устройства Android через usb

Вот что я пробовал:

private UsbManager mUsbManager; 
    private UsbDevice mDevice; 
    private UsbDeviceConnection mConnection; 
    private UsbInterface mInterface; 
    private UsbEndpoint mEndPoint; 
    private PendingIntent mPermissionIntent; 
    private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; 
    private static Boolean forceCLaim = true; 

    HashMap<String, UsbDevice> mDeviceList; 
    Iterator<UsbDevice> mDeviceIterator; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 

     mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
     mDeviceList = mUsbManager.getDeviceList();  
     mDeviceIterator = mDeviceList.values().iterator(); 

     Button print = (Button)findViewById(R.id.print); 

     Toast.makeText(this, "Device List Size: " + String.valueOf(mDeviceList.size()), Toast.LENGTH_SHORT).show(); 
     TextView textView = (TextView) findViewById(R.id.usbDevice); 
     String usbDevice = ""; 
     //This is just testing what devices are connected 
     while (mDeviceIterator.hasNext()) { 
      UsbDevice usbDevice1 = mDeviceIterator.next(); 
      usbDevice += "\n" + 
        "DeviceID: " + usbDevice1.getDeviceId() + "\n" + 
        "DeviceName: " + usbDevice1.getDeviceName() + "\n" + 
        "DeviceClass: " + usbDevice1.getDeviceClass() + " - " + translateDeviceClass(usbDevice1.getDeviceClass()) + "\n" + 
        "DeviceSubClass: " + usbDevice1.getDeviceSubclass() + "\n" + 
        "VendorID: " + usbDevice1.getVendorId() + "\n" + 
        "ProductID: " + usbDevice1.getProductId() + "\n"; 

      int interfaceCount = usbDevice1.getInterfaceCount(); 
      Toast.makeText(this, "INTERFACE COUNT: " + String.valueOf(interfaceCount), Toast.LENGTH_SHORT).show(); 

      mDevice = usbDevice1; 

      if (mDevice == null) { 
       Toast.makeText(this, "mDevice is null", Toast.LENGTH_SHORT).show(); 
      }else{ 
       Toast.makeText(this, "mDevice is not null", Toast.LENGTH_SHORT).show(); 
      } 
      textView.setText(usbDevice); 
     } 

     if (mDevice == null) { 
      Toast.makeText(this, "mDevice is null", Toast.LENGTH_SHORT).show(); 
     }else{ 
      Toast.makeText(this, "mDevice is not null", Toast.LENGTH_SHORT).show(); 
     } 

     mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); 
     IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
     registerReceiver(mUsbReceiver, filter); 
     mUsbManager.requestPermission(mDevice, mPermissionIntent); 

    print.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //setup(); 
       print(mConnection, mInterface); 
      } 
     }); 
} 

    private String translateDeviceClass(int deviceClass){ 
     switch(deviceClass){ 
      case UsbConstants.USB_CLASS_APP_SPEC: 
       return "Application specific USB class"; 
      case UsbConstants.USB_CLASS_AUDIO: 
       return "USB class for audio devices"; 
      case UsbConstants.USB_CLASS_CDC_DATA: 
       return "USB class for CDC devices (communications device class)"; 
      case UsbConstants.USB_CLASS_COMM: 
       return "USB class for communication devices"; 
      case UsbConstants.USB_CLASS_CONTENT_SEC: 
       return "USB class for content security devices"; 
      case UsbConstants.USB_CLASS_CSCID: 
       return "USB class for content smart card devices"; 
      case UsbConstants.USB_CLASS_HID: 
       return "USB class for human interface devices (for example, mice and keyboards)"; 
      case UsbConstants.USB_CLASS_HUB: 
       return "USB class for USB hubs"; 
      case UsbConstants.USB_CLASS_MASS_STORAGE: 
       return "USB class for mass storage devices"; 
      case UsbConstants.USB_CLASS_MISC: 
       return "USB class for wireless miscellaneous devices"; 
      case UsbConstants.USB_CLASS_PER_INTERFACE: 
       return "USB class indicating that the class is determined on a per-interface basis"; 
      case UsbConstants.USB_CLASS_PHYSICA: 
       return "USB class for physical devices"; 
      case UsbConstants.USB_CLASS_PRINTER: 
       return "USB class for printers"; 
      case UsbConstants.USB_CLASS_STILL_IMAGE: 
       return "USB class for still image devices (digital cameras)"; 
      case UsbConstants.USB_CLASS_VENDOR_SPEC: 
       return "Vendor specific USB class"; 
      case UsbConstants.USB_CLASS_VIDEO: 
       return "USB class for video devices"; 
      case UsbConstants.USB_CLASS_WIRELESS_CONTROLLER: 
       return "USB class for wireless controller devices"; 
      default: return "Unknown USB class!"; 
     } 
//Broadcast receiver to obtain permission from user for connection 
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){ 
          //call method to set up device communication 
          mInterface = device.getInterface(0); 
          mEndPoint = mInterface.getEndpoint(0); 
          mConnection = mUsbManager.openDevice(device); 

          //setup(); 
         } 
        } 
        else { 
         //Log.d("SUB", "permission denied for device " + device); 
         Toast.makeText(context, "PERMISSION DENIED FOR THIS DEVICE", Toast.LENGTH_SHORT).show(); 
        } 
       } 
      } 
     } 
    }; 

private void print(UsbDeviceConnection connection, UsbInterface intrface){ 

     String test = "THIS IS A PRINT TEST"; 
     byte [] testBytes = test.getBytes(); 

     if(intrface==null){ 
      Toast.makeText(this, "INTERFACE IS NULL", Toast.LENGTH_SHORT).show(); 
     } 
     if(connection==null){ 
      Toast.makeText(this, "CONNECTION IS NULL", Toast.LENGTH_SHORT).show(); 
     } 

     if(forceCLaim==null){ 
      Toast.makeText(this, "FORCE CLAIM IS NULL", Toast.LENGTH_SHORT).show(); 
     } 

     connection.claimInterface(intrface, forceCLaim); 
     connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); 

    } 

Так устройство подключается к USB-устройству, но когда я пытаюсь bulktransfer ничего не происходит, кто-то может пролить свет на это? Подключение USB новая область для меня, поэтому любые советы приветствуются

EDIT

Так получается, были проблемы с конечными точками и не возвращается из bulktransfer, однако, в настоящее время эти вопросы будут решены, и возвращает массовый перенос, однако он все равно не печатает. У кого-нибудь есть идеи по этому поводу?

+0

проблемы заключается в том, что вы должны знать протокол принтера ... отправка только текста не сработает ... получите документацию принтера и узнайте, как печатать ... например (я сделал это!) вам нужно отправить '#move 10,10; #print «НАСТОЯЩИЙ ТЕСТИРОВАНИЕ ПЕЧАТИ» «... возможно, ваш принтер использует [ZPL] (http://en.wikipedia.org/wiki/ZPL_%28programming_language%29) – Selvin

+0

неправильная ссылка ... должна быть [ZPL ] (http://en.wikipedia.org/wiki/Zebra_ (programming_language)) – Selvin

+0

@Selvin Когда я печатаю по сети, я просто открываю сокет и отправляю байты, нет необходимости в каких-либо дополнительных функциях, чтобы иметь он печатает. Существуют команды термопринтеров для центрирования, резки и т. Д., Но нет команд печати. Было бы иначе для usb? –

ответ

0

частная аннулируются печать (UsbDeviceConnection соединение, UsbInterface intrface) {

String test = "THIS IS A PRINT TEST"; 
    byte [] testBytes = test.getBytes(); 

    if(intrface==null){ 
     Toast.makeText(this, "INTERFACE IS NULL", Toast.LENGTH_SHORT).show(); 
    } 
    if(connection==null){ 
     Toast.makeText(this, "CONNECTION IS NULL", Toast.LENGTH_SHORT).show(); 
    } 

    if(forceCLaim==null){ 
     Toast.makeText(this, "FORCE CLAIM IS NULL", Toast.LENGTH_SHORT).show(); 
    } 

    connection.claimInterface(intrface, forceCLaim); 
    connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); 
    //Just Add 
    connection.close(); 

} 
0

@ DJ-DOO, я попробовал один и тот же подход, но я сделал это так:

вместо String test = "THIS IS A PRINT TEST";

использовать это: String test = "THIS IS A PRINT TEST\r\n";

Для дополнительной проверки: What is the difference between \r and \n?

и ваша последняя строка кода «connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0);» должна быть в другом потоке.

Например:

Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
    connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); 
    } 
}); 
thread.run(); //or thread.start(); -as you wish 

Бонус: для бумаги использования резки: byte[] cut_paper = {0x1D, 0x56, 0x41, 0x10}; До этого байтового массива я рекомендую отправить строку с выше \n. Достаточно поставить ту же строку с массивом cut_paper байт после первого:

Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); 
     connection.bulkTransfer(mEndPoint, cut_paper, cut_paper.length, 0); 
    } 
}); 
thread.run(); 

Также источник помощи: https://developer.android.com/guide/topics/connectivity/usb/host.html

Надеется, что это помогает :)

+0

Спасибо, cut_paper arry работал для меня на принтере Star – Herman

 Смежные вопросы

  • Нет связанных вопросов^_^