如何利用android ADK访问外围设备

  如果想要通过android控制外围设备,android设备端必须是host USB,这样才可以使用usb总线来和外围设备通信。
  有人可能会想到用写驱动的方式来实现设备通信,虽然android底层也是linux内核,但是想要为android编写驱动确实极其困难,因为每个android设备部署的android系统都是有区别的,你可以简单的通过modinfo查看android设备内部自带的驱动,如果mod所带的字串信息不同,你编译的驱动就不会被同样版本的android设备识别,所以最好的方式是采用android提供的ADK配套开发包编写“软驱动”来实现HOST USB和外围设备的通信。
  android关于host USB知识可以参考:http://developer.android.com/guide/topics/connectivity/usb/host.html
  host USB实现步骤基本包括:

  1、注册receiver
     permissionIntent = PendingIntent.getBroadcast(activity, 0, new Intent(ACTION_USB_PERMISSION), 0);
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        activity.registerReceiver(mUsbReceiver, filter);
        activity.registerReceiver(mUsbReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED));
  2、获取USB列表
   usbMgr = (UsbManager)activity.getSystemService(Context.USB_SERVICE);
        HashMap<String, UsbDevice> deviceList = usbMgr.getDeviceList();
       Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
        while (deviceIterator.hasNext())
        {
            UsbDevice usd = deviceIterator.next();
           if(usd.getVendorId() == vendorId && usd.getProductId() == productId) {
                usbDevice = usd;
                break;
            }
        }
  3、获得权限
   try{
            if(usbDevice != null) {
                usbMgr.requestPermission(usbDevice, permissionIntent);
            }
        }catch(Exception e) {
           
        }

 4、实现BroadcastReceiver
 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){
                            usbInterface = device.getInterface(0);
                            for(int i = 0; i < usbInterface.getEndpointCount(); i++) {
                                UsbEndpoint ep = usbInterface.getEndpoint(i);
                                if(ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK
                                        && ep.getDirection() == UsbConstants.USB_DIR_OUT) {
                                                                      usbEndpoint = ep;
                                 }
                             
                            }
                                      usbConn = usbMgr.openDevice(device);
                                usbConn.claimInterface(usbInterface, forceClain);
                                configUsb();
                        }
                    }
                    else {
                        Log.d("SerailTest", "permission denied for device " + device);
                    }
                }
            }
            }
        }
    };

 配置usb方法,以CH341串口芯片为例:
byte[] buffer = new byte[8];
            usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_IN , 0x5f, 0, 0, buffer, 8, 1000);
            usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0xa1, 0, 0, null, 0, 1000);
            //baud rate
            int baudRate = 4800;
            long factor = 1532620800 / baudRate;
            int divisor = 3;
            while((factor > 0xfff0) && (divisor > 0)) {
                factor >>=3;
                divisor--;
            }
            factor = 0x10000-factor;
            short a = (short) ((factor & 0xff00) | divisor);
            short b = (short)(factor & 0xff);
            usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0x9a, 0x1312, a, null, 0, 1000);
            usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0x9a, 0x0f2c, b, null, 0, 1000);
            usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_IN, 0x95, 0x2518, 0, buffer, 8, 1000);
            usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0x9a, 0x0518, 0x0050, null, 0, 1000);
            usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0xa1, 0x501f, 0xd90a, null, 0, 1000);
            usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0x9a, 0x1312, a, null, 0, 1000);
            usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0x9a, 0x0f2c, b, null, 0, 1000);
            usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0xa4, 0, 0, null, 0, 1000);

你可能感兴趣的:(如何利用android ADK访问外围设备)