1. 首页
  2. bug人生

安卓USB HOST开发之Android平板+OTG线+4口USB hub+4个HID设备

        首先解释一下此开发应用方案涉及到的几个术语。意思不弄明白,就不好往下玩了。

安卓USB HOST开发之Android平板+OTG线+4口USB hub+4个HID设备

释义说明:

       USB host:USB主设备,可以从另外一个USB 从设备中取得数据,包括USB host控制器和USB host协议。有主就有从,host设备与USB device或USB slave从设备相对应。

       USB OTG:On The Go,正在进行中的意思,直接传输,就是可以从一个机器直接传到另一个机器中。直接的意思为用户不需要其他的辅助,比如软件驱动,硬件接口转换等。

       USB HUB:USB扩展/集线器,一种可以将一个USB接口扩展为多个(通常为4个),可以使这些接口同时使用的仪器。Android4.4系统的平板电脑如NEXUS 7不支持USB HUB。

     USB-HID:全称为Human Interface Device,能直接与人交互的设备,例如键盘、鼠标与游戏杆等,操作系统会自带HID设备的驱动程序。

要准备的硬件设备有:

         一、Android USB HOST开发一定要用真机测试,模拟器是做不到的。没有真机还是等等吧。不能在脑海里妄想程序的执行结果吧,开发也算科学实验,是实验就是要放到实际环境中不断的测试调试,俗话说把骡子或马拿出去溜溜才知道结果,没有真机就无法连接USB OTG和HID设备。

        二、需要USB OTG线和USB HUB(4口或7口的都行,有一种把OTG和HUB集成在一个板子上的USB HUB,有一个外接电源接口给耗电较大的设备辅助供电)

        三、主角是要读取数据的对象和来源—-HUB HID设备。

硬件拿到手了以后就要先摸清楚一些硬件的情况:

         一、关于Android平板:由于Android3.1(API12)以上才支持USB HOST模式,因此需要高系统版本的平板电脑,本方案用的是装Android5.0.1系统的Google亲儿子NEXUS 9。

由于众所周知的原因,国内是没有国行NEXUS卖的,这些要么是淘宝海淘代购,要么就是港行,这是题外话了。当然用其他的国产主流平板也可以。

支持OTG和识别到USB HUB连接到的设备。注意:并不需要把新平板ROOT。由于USB host开发主要用到的包有

android.hardware.usb.UsbConstants;
android.hardware.usb.UsbDevice;
android.hardware.usb.UsbDeviceConnection;
android.hardware.usb.UsbEndpoint;
android.hardware.usb.UsbInterface;
android.hardware.usb.UsbManager;
import android.hardware.usb.UsbRequest;

所以需要确认Android系统根目录下的权限文件有没有android.hardware.usb.host.xml文件和tablet_core_hardware.xml或者handheld_core_hardware.xml。如果是平板就是tablet配置文件,手机就是handheld配置文件。具体操作打开ES或RE文件浏览器、根目录、/system/etc/permissions。查看这两个文件。或者直接用cmd命令文件导入这两个文件,本文最后会留下cmd格式修复文件的下载地址。还有一款老外开发的APP(需要ROOT权限才能修改系统文件)专门用来检测手机或平板电脑是否支持USB HOST,本文后也将一同提供下载链接。

     二、关于USB HID设备:要获得设备的信息,兵法上说知己知彼百战不殆,开发如战场,要了解开发对象的身子骨怎么样,有几斤几两。摸清楚底,做到心中有数。具体要获取的参数包括:USB 厂商ID、产品ID、有几个接口、接口号多少、几号接口的读端点号、写端点号、读端点地址、写端点地址、底层通信协议等。可以把USB设备连接到电脑上,通过查看设备管理器的设备属性、详细信息、属性、硬件ID,看下面的值是多少获得VID和PID。也可以用Bus Hound软件查看更多详细信息,或者在安卓手机或平板上安装一个专门看USB device info的APP。

   三、关于USB HUB设备: 平板+OTG线+USB Hub+多个设备方案中的多个设备都是由一个平板来供电的,一个平板电脑可能不足以同时驱动如此之多的外设。但是这次要用的4个HID设备都是自带锂电池的,可以自己供电。不存在供电不足的问题。请确认你的HID设备是否自带电池,如果没有考虑给HUB外接电源。

注意:HID设备不需要用户自己写驱动程序。Android系统内部已自带这种设备类型的驱动。以前就因为驱动的问题就把安卓的USB开发搁置下来了,实在不了解驱动开发。

必要的查看调试日志设置:安卓平板或手机只有一个microUSB接口,用这唯一的USB接口连接了USB设备后,那开发过程中的日志怎么看呢?为此Google搞了一个开发电脑通过wifi网络连接平板的方式。怎么实现呢?

首先,把SDK路径加入系统环境变量中。

平板或手机用一根microUSB线连接上开发电脑,等连接成功后拔掉usb连接线,接上otg线。

命令行输入:adb tcpip 5037         注:5037为端口,只要是未被占用的都可以。

命令行回复:restarting in TCP mode port: 5037

命令行输入:adb connect 192.168.1.120:5037

命令行回复:connected to 192.168.1.120:5037

收到已连接的回复后,说明连接建立成功,就可以回Eclipse或AS看程序运行的日志了。

一定要看日志,这就等于获得了开发程序的眼睛,不能像个瞎子一样乱试乱撞。找到错误的原因,发现程序运行的机理就靠它啦!这一步很重要!。

     这些前提条件都准备好了,那就真正开始吧。

关键代码片段:

UsbInterface usbInterface = mUsbDevice.getInterface(0);
mInterface = usbInterface;  
epIn = mInterface.getEndpoint(0);  //读数据节点
epOut = mInterface.getEndpoint(1); //写数据节点
UsbDeviceConnection connection = manager.openDevice(mUsbDevice);
connection.claimInterface(mInterface, true);
mDeviceConnection = connection;
安卓USB HOST开发之Android平板+OTG线+4口USB hub+4个HID设备

由于是公司项目,涉及到知识产权保护,在此不便把全部源码贴上来。

网上关于Android USB HOST的资料,大都是连接一个HID设备的,不需要USB Hub。要连接多个设备的资料真的是少之又少,准确的说是一篇都没有找到过。

一开始甚至还怀疑过Android USB HOST能不能同时和多个HID设备通信,理论上USB接口可以通过USB Hub扩展到最多连接127个设备。理论和实际的差距在于,现实中由于各种原因包括USB Hub质量等最多支持同时连接5到6个应该可以实现。要通过Hub同时连接4个HID设备理论上是没有问题。有了信心以后,就可以继续前进了。

       选择传输方式:同步或异步。

异步会用到UsbRequest类。

思路一、同步用controlTransfer或bulkTransfer。即控制传输或批量传输。USB一共有4种传输方式,这里只用了同步的批量传输。

思路二、不要在AndroidManifest.xml清单文件你添加设备过滤器文件device_filter.xml。添加的效果是,每次接入设备操作系统都会自动打开应用程序,至于是打开应用程序的哪个页面,在于你的过滤器在清单文件里设置在哪个页面活动下面。一般最常见的是把过滤器<intent-filter>放在“.MainActivity”里,当然系统就会自动打开应用的主页。如果有若干个应用都设置了一样VID和PID的device_filter.xml,那么当接入这个设备时,就会弹出一个框让你选择打开哪个应用。

    注意:由于网上的资料一般都是讲接入一个USB-HID设备的,因此设置此设备过滤文件是恰当的。但是这里要连接最多4个设备,如果也添加设备过滤功能,那么每接入一次USB设备,系统就打开一次应用,接入四次后系统打开了4个相同的应用界面。这样导致用户使用体验严重降低,至少要按返回键4次才能结束所有应用。所以这里就不要在清单文件里添加设备过滤文件了。而是在程序里动态的去判断设备VID和PID是否和我们要访问的设备一致。

原创文章,作者:维尼兔,如若转载,请注明出处:https://www.v2v0.com/?p=51

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

 

工作时间:周一至周五,09:30-17:00,节假日休息