android 与usb 设备通信(二)

本文探讨了在Android上与非标准HID USB设备,特别是复合型USB设备(包括USB Audio, Mouse, HID功能)进行通信的问题。通过分析设备的协议端点和传输方式,以确保在root Android设备上能够成功获取并通信。使用USBTrace工具对于理解设备协议至关重要。" 107585971,9902759,算法基础与计算问题,"['算法', '计算问题', '数据结构', '并行处理', '效率分析']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

再次遇到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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值