Android рдХреЗ рддрд╣рдд LibUsb рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛

рдПрдХ рджрд┐рди, рдореБрдЭреЗ рдПрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬрд┐рд╕реЗ рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдпреВрдПрд╕рдмреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рдереА рдХрд┐ HID, CDC рдФрд░ рдЕрдиреНрдп рдорд╛рдирдХ рдЙрдкрдХрд░рдг рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдмрд▓реНрдХ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдФрд░ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ред USB рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЖрдзрд╛рд░ libusb рдкреБрд╕реНрддрдХрд╛рд▓рдп рдерд╛ред

рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдордирдорд╛рдирд╛ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

рдореИрдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЫреВрдКрдВрдЧрд╛, рдФрд░ рдкреВрд░реНрдг рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рдЕрдВрдд рдореЗрдВ рд╣реЛрдЧрд╛ред

рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо UsbHost рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ

<uses-feature android:name="android.hardware.usb.host"/> 

рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рд╕реНрд╡рддрдГ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рд╣реЛ, рддреЛ рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрддреЗ рд╣реИрдВред

 <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter"/> 

рд╕рдВрд╕рд╛рдзрди рдбрд┐рд╡рд╛рдЗрд╕_filter.xml рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ VID рдФрд░ PID рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ

 <resources> <usb-device product-id="0037" vendor-id="8742"/> </resources> 

рд╣рдореЗрдВ onCreate рдореЗрдердб рдореЗрдВ usb рдореИрдиреЗрдЬрд░ рдорд┐рд▓рддрд╛ рд╣реИред

 mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ USB рд╕реЗ рдЬреБрдбрд╝реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд╣рдо USB_CLASS_PER_INTERFACE рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрдкрдХрд░рдг рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 UsbDevice findDevice(UsbManager usbManager) { for (UsbDevice usbDevice : usbManager.getDeviceList().values()) { if (usbDevice.getDeviceClass() == UsbConstants.USB_CLASS_PER_INTERFACE) { return usbDevice; } else { UsbInterface usbInterface = findInterface(usbDevice); if (usbInterface != null) return usbDevice; } } return null; } UsbInterface findInterface(UsbDevice usbDevice) { for (int nIf = 0; nIf < usbDevice.getInterfaceCount(); nIf++) { UsbInterface usbInterface = usbDevice.getInterface(nIf); if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_PER_INTERFACE) { return usbInterface; } } return null; } 

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рд╣рдо рдЗрд╕рдХреЗ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рд╣рдо рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВред

 private void initUsbDevice() { PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); registerReceiver(mUsbReceiver, filter); mUsbManager.requestPermission(mUsbDevice, mPermissionIntent); mUsbInterface = findInterface(mUsbDevice); for (int nEp = 0; nEp < mUsbInterface.getEndpointCount(); nEp++) { UsbEndpoint tmpEndpoint = mUsbInterface.getEndpoint(nEp); if (tmpEndpoint.getType() != UsbConstants.USB_ENDPOINT_XFER_BULK) continue; if ((mOutEndpoint == null) && (tmpEndpoint.getDirection() == UsbConstants.USB_DIR_OUT)) { mOutEndpoint = tmpEndpoint; } else if ((mInEndpoint == null) && (tmpEndpoint.getDirection() == UsbConstants.USB_DIR_IN)) { mInEndpoint = tmpEndpoint; } } if (mOutEndpoint == null) { Toast.makeText(this, "no endpoints", Toast.LENGTH_LONG).show(); } mConnection = mUsbManager.openDevice(mUsbDevice); if (mConnection == null) { Toast.makeText(this, "can't open device", Toast.LENGTH_SHORT).show(); return; } mConnection.claimInterface(mUsbInterface, true); startIoManager(); } 

I / O рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдмрдлрд╝рд░рд┐рдВрдЧ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рдФрд░ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдмрдВрдзрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдирд┐рдореНрди рдХреЛрдб рдореЗрдВ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдкрдврд╝рдиреЗ:

 mConnection.bulkTransfer(mInEndpoint, data, size, READ_TIMEOUT); 

рд░рд┐рдХреЙрд░реНрдб:

 int bytesWritten = mConnection.bulkTransfer(mOutEndpoint, Arrays.copyOfRange(data, offset, offset + size), size, WRITE_TIMEOUT); 

рдЗрд╕ рддрд░рд╣, BulkTransfer рдкреИрдХреЗрдЯ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирддреАрдЬрддрди, рд╣рдорд╛рд░рд╛ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдордирдорд╛рдирд╛ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред





рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

GitHub рдкрд░ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:

  1. рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ FT232 рдФрд░ рдЕрдиреНрдп рд╕реАрдбреАрд╕реА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реАред
  2. UsbHost рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Android рдкреНрд░рд▓реЗрдЦрдиред

Source: https://habr.com/ru/post/hi426697/


All Articles