Android USB Host 와 HID 통신

16160 단어 androidkernel
from : http://www.cnblogs.com/doorsky/p/4388849.html
refer to :http://www.usb.org/developers/defined_class
Android USB Host与HID通讯_第1张图片
전단 시간 에 HID 의 하드웨어 를 만 들 려 면 안 드 로 이 드 와 통신 해 야 합 니 다. 인터넷 에서 한 바퀴 검색 하면 수확 이 적지 않 습 니 다.
비교적 좋 은 글 은:       Android USB Host 와 HID 통신
     Android Service USB HOST 통신 생 성
그 중에서 코드 부분 에 주의해 야 할 부분 이 있 습 니 다. 여기에 설명 하 겠 습 니 다.
/**
 * USB HOST    HID
 * @author IVAN
 *
 */
public class MainActivity extends Activity {
    private static final String TAG = "USB_HOST";
 
    private UsbManager myUsbManager;
    private UsbDevice myUsbDevice;
    private UsbInterface myInterface;
    private UsbDeviceConnection myDeviceConnection;
 
    private final int VendorID = 8457;    //          ID
    private final int ProductID = 30264;
 
    private TextView info;
 
    private UsbEndpoint epOut;
    private UsbEndpoint epIn;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        info = (TextView) findViewById(R.id.info);
 
        //   UsbManager
        myUsbManager = (UsbManager) getSystemService(USB_SERVICE);
 
        enumerateDevice();
 
        findInterface();
 
        openDevice();
 
        assignEndpoint();
 
    }
 
    /**
     *     ,IN | OUT,     ;      1 OUT  ,0 IN,          
     */

     //USB_ENDPOINT_XFER_BULK      /*      #define USB_ENDPOINT_XFER_CONTROL 0 -- 제어 전송     #define USB_ENDPOINT_XFER_ISOC 1 -- 등 시 전송     #define USB_ENDPOINT_XFER_BULK 2 -- 블록 전송     #define USB_ENDPOINT_XFER_INT 3 -- 전송 중단      * */
    private void assignEndpoint() {

          if (my Interface! = null) {/ 많은 사람들 이 각종 게시판 에서 왜 잘못 보 고 했 느 냐 고 물 었 다. 
              //여기 코드 가 바 뀌 었 어 요. 자기 하드웨어 속성 으로 판단 하 세 요.
             for (int i = 0; i < myInterface.getEndpointCount(); i++) { 
                UsbEndpoint ep = myInterface.getEndpoint(i);
                if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT) {                  if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {                     epOut = ep;
                 } else { 
                  epIn = ep;
                  }                  }               }            }
        Log.d(TAG, getString(R.string.text));
    }
 
    /**
     *     
     */
    private void openDevice() {
        if (myInterface != null) {
            UsbDeviceConnection conn = null;
            //  open          ;            ,         ,        
            if (myUsbManager.hasPermission(myUsbDevice)) {
                conn = myUsbManager.openDevice(myUsbDevice);
            }
 
            if (conn == null) {
                return;
            }
 
            if (conn.claimInterface(myInterface, true)) {
                myDeviceConnection = conn; //     android      HID  
                Log.d(TAG, "      ");
            } else {
                conn.close();
            }
        }
    }
 
    /**
     *      
     */
    private void findInterface() {
        if (myUsbDevice != null) {
            Log.d(TAG, "interfaceCounts : " + myUsbDevice.getInterfaceCount());
            for (int i = 0; i < myUsbDevice.getInterfaceCount(); i++) {
                UsbInterface intf = myUsbDevice.getInterface(i);
                //
                if (intf.getInterfaceClass() == 8
                        && intf.getInterfaceSubclass() == 6
                        && intf.getInterfaceProtocol() == 80) {
                    myInterface = intf;
                    Log.d(TAG, "        ");
                }
                break;
            }
        }
    }
 
    /**
     *     
     */
    private void enumerateDevice() {
        if (myUsbManager == null)
            return;
 
        HashMap deviceList = myUsbManager.getDeviceList();
        if (!deviceList.isEmpty()) { // deviceList   
            StringBuffer sb = new StringBuffer();
            for (UsbDevice device : deviceList.values()) {
                sb.append(device.toString());
                sb.append("
"); info.setText(sb); // Log.d(TAG, "DeviceInfo: " + device.getVendorId() + " , " + device.getProductId()); // if (device.getVendorId() == VendorID && device.getProductId() == ProductID) { myUsbDevice = device; Log.d(TAG, " "); } } } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }


데이터 가 져 오 는 코드:
 ncount = myDeviceConnection.bulkTransfer(epIn, buffer, buffer.length,  
                            100);

데이터 읽 기 길 이 를 주의 하 십시오. 이것 은 일부 하드웨어 에 있어 서 매우 중요 합 니 다. 어떤 하드웨어 는 작 거나 크 면 즉시 다운 되 거나 계속 되 돌아 오 거나 - 1
이 데이터 의 길 이 는 하드웨어 속성 에 따라
    int inMax = epin. getMaxPacketSize () 를 통 해 얻 을 수 있 는 방법 이 있 습 니 다.
    windows 아래 hid 프로그램 을 통 해 장치 의 데이터 길 이 를 탐지 하 는 방법 도 있다.
 
하드웨어 를 읽 지 못 하 는 문제 에 대해 저 는 다음 과 같은 방법 이 도움 이 되 지 않 을 것 이 라 고 생각 합 니 다. 하드웨어 가 지원 하지 않 거나 안 드 로 이 드 4.0 이상 에는 다음 과 같은 파일 정보 가 포 함 된 것 같 습 니 다.
android. hardware. usb. host. xml 파일 을 / system / etc / permissions 에 넣 고 두 번 째 는 같은 디 렉 터 리 에 있 는 handheld core hardware. xml 에 한 마디 를 추가 합 니 다.

좋은 웹페이지 즐겨찾기