再次遇到android  mUsbManager.getDevicelist() 得不到usb 设备的问题。于是深入去探讨android 与usb 外围设备通信的问题。第一篇文章写的有点乱,本质就是需要加入系统的usb操作权限(需要root权限,这种指导国内外的网站上都已经有很多了)。

前面做的项目usb设备是标准的HID设备,使用USBtrace可以看到是setup class支持HIDclass(如下图1),因此在root android加入权限之后可以通过getDeviceList()得到这个设备。

图1

目前在做的项目的usb设备支持的是复合型usb设备协议(包含usb audio,usb mouse,usb hid等功能),使用usb trace 之后发现setup class  是usb(如图2).

图2

  于是怎么折腾都get不到USB设备,于是查找android 源码的实现,最后发现在发现
https://code.google.com/p/android-source-browsing/source/browse/services/java/com/android/server/usb/UsbService.java?repo=platform--frameworks--base&name=android-3.2.4_r1&r=02eb8746de2d60563ec2751a34d20923192e4293&spec=svn.platform--frameworks--base.02eb8746de2d60563ec2751a34d20923192e4293第264行写着“ Slog.w(TAG, "This kernel does not have USB composite class support");”,果然翻看系统文件没有找到该文件夹。还是系统不支持的原因。同时第280行的方法也解释为什么键盘和鼠标没有被枚举出来的原因。

android usb host与usb设备的数据传输分为三种方式:控制传输,块传输和断点传输。

  控制传输的方式是controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)

  块传输的方法是 bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)

  断点传输方法:

UsbRequest request=new UsbRequest();
boolean isQueueOk = request.queue(buffer, 128);
if (isQueueOk && mUsbConnection.requestWait() == request) {
//do something;
}

如果项目中需要的usb设备不是自己开发的,最好先使用usbtrace在pc上先分析下它的协议端点支持的传输方式等(如图3)。

图3

android 与usb 设备通信(二)的更多相关文章

  1. Ubuntu/Windows下利用“HIDAPI”库函数实现与Hid类USB设备通信

    一.背景: 最近在做的一个项目需要使用USB传递数据,对USB理解不是很深,USB的系统驱动编写则更是天方 夜谭,因此将设备配置成HID类设备成为了首选.其最大的好处在于,LINUX/Windows系 ...

  2. android获取USB设备的名称

    1.注释内 .是三星设备可能不支持,需要更换的代码. 2.mUsbManager.是getSystemService(Context.USB_SERVICE)获的. 3. 从stackoverflow ...

  3. Android笔记5-与USB HID 设备通信(一)

    1.了解 支持USB 主机(host)或者从机(accessary )模式最终是取决于设备的硬件,而与平台版本无关.我们可以通过usesfeature这个方法来查询自己的设备是否支持USB主从.   ...

  4. USB设备驱动程序(一)

    USB驱动编程原理: 当我们把USB设备插入USB口时会提示需要安装相对应的驱动,如USB鼠标.USB键盘等,这些电脑自己自身已经自带有相对于的驱动程序, 当电脑检查到该USB设备类型相同就去帮你安装 ...

  5. usb-host与外设通信(二)

    本文是接着上一篇的的usb-host与外设通信(一)接着写的 3.枚举设备 当你的程序运行时,如果应用程序对当前连接的USB设备都感兴趣的,程序可以枚举所以当前的设备.使用getDeviceList( ...

  6. USB设备---URB请求快

    1.urb 结构体USB 请求块(USB request block,urb)是USB 设备驱动中用来描述与USB 设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff 结构 ...

  7. USB设备驱动概述

    USB设备驱动 ·  )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...

  8. USB设备---URB请求块

    1.urb 结构体 USB 请求块(USB request block,urb)是USB 设备驱动中用来描述与USB 设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff 结 ...

  9. C# 上位机的USB设备拔插检测

    我们做USB通信时,通信成功后,往往要检测USB设备的拔插状态,这里就USB拔插进行一下说明. 参考:https://www.imooc.com/article/17438 先说明一下,我这里只是用C ...

随机推荐

  1. ERwin 连接 mysql

    1. install mysql connector; 2. run odbc connection management (c:\windows\syswow64\odbcad32.exe); 3. ...

  2. iOS崩溃日志分析

    Incident Identifier: 55864905-937C-4172-B435-2ACA13D3070ECrashReporter Key: b85cab13431711060a5fab55 ...

  3. SQL SERVER删除列,报错."由于一个或多个对象访问此列,ALTER TABLE DROP COLUMN ... 失败"

    队友给我修改数据的语句.总是执行失败.很纳闷. 如下图: 仔细看了下这个列,并没有什么特殊.如下图: 但其确实有个约束: 'DF__HIS_DRUG___ALL_I__04E4BC85' . 为什么有 ...

  4. struts2的java文件中不能直接弹出script对话框

    需要引入接口 ServletResponseAware public class Login extends ActionSupport implements SessionAware,Servlet ...

  5. 虚拟机单一网卡设置两个IP

    一.在虚拟机里修改虚拟网卡配置 cd /ect/sysconfig/network-scripts/ vi ifcfg-eth0 改BOOTPROTO=static cp ifcfg-eth0 ifc ...

  6. QT宏 Q_OBJECT,explicit, QHostAddress, quint, emit

    QT相關 一. 參考: 1.宏Q_OBJECT 二. explicit struct constrcution 三. QHostAddress Detailed Description: The QH ...

  7. C++学习之路,漫长而遥远

    一.C/C++语言 如果你的基础很差, 建议不要一开始就学C++语言,从C开始学起,对程序有个初步的认识,循序渐进.C语言的书嘛,先买一本 300 页以内的,把书中的每一个例子都通过键盘敲打进去到 V ...

  8. 正确理解javascript的this关键字

    javascript有this关键字,它和javascript的执行上下文有着密切的关系,就是说this具体指代什么要根据它的上下文来判断. 一.this和对象的关系    var Person={ ...

  9. jQuery 1.4.4 中 function( window, undefined ) 写法原因

    读 jQuery 1.4.4 版本代码的时候,发现下面的写法: (function( window, undefined ) { ... // code goes here })(window); w ...

  10. 重力加速度陀螺仪传感器MPU-6050(一)

    MPU-60X0 对陀螺仪和加速度计分别用了三个16 位的ADC,将其测量的模拟量转化 为可输出的数字量.为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±50 ...