自定义HID设备与Android设备通信
这是我2017年中最大的收获,也是陷入一个技术漩涡中的一次经历!
由于公司需要,领导安排做一个自定义HID设备在Android系统上的信号检测工具。如图。
而Android主板不是自家的,希望不要驱动下来完成这件事,表面看起来想想有点不现实,但是我知道有Android Host 通信啊,应该是可以的,回想起来觉自己还是被什么给遮住了双眼?陷入了一个常识里了,现在来说一说我的折腾之路。
首先,Android系统的API mUsbManager.getDeviceList 获取不到自定义的HID设备;经过网上查资料,深入学习USB协议,HID协议,各种描述符的配置;对比能获取到的设备的报告描述符,找到了这篇文章http://ask.****.net/questions/193856 修改了描述符的配置:
此时,通过Android系统的API mUsbManager.getDeviceList 获取能获取到了自己自定义的HID设备。
其次,照这么一说,做这个工具应该就没有什么问题了,在实操的过程中,当我将设备的状态切换的时候,固件会断开,以另一个自定义设备的形式“一直发送数据”出来(这就是我折腾很久的原因所在)。这样的情况下,Android使用host通信就会存在问题。因为是自定义HID设备,Android系统没有对应的驱动,每当host驱动加载完成之后,再向上HID驱动去解析,由于该设备是自定义的所以解析不了,所以会出现以下现象。如图:
该现象说明没有自定义的驱动,一直在枚举我自定义的HID设备。
接下来,想到是没有驱动的问题,于是又去自定义一个HID的驱动(这又不符合领导的要求,我想先把问题解决了再去说服领导,至少还是有解决方案的),而我添加的原因就是验证是否没有枚举上的原因,添加之后果然是,于是又在这个基础上,用Host通信,这又开始了下一步的验证。经过一段时间的验证,发现的现象,有能正常获取数据,而有时又不能获取正常数据,又在此基础上,追究深层原因,结果发现在这条命令:
又强制将我的驱动卸载了,卸载之后,相当于重新插拔了设备,虽然强制建立了连接关系,但是在Android应用层获取的设备始终是设备的前一个状态,这又导致了获取不到想要的数据。在此基础上也找不到新的试探方向。感觉就此要夭折了。
后来没事就在网上找相关自定义HID设备与Android系统通信的解决办法,再一次偶然的机会看到贴子,当然该帖子也是为了宣传他们的淘宝店产品(我以前在校期间也这么玩过)。果断地买了个回来研究,就一个STM32单片机的最小系统卖了我800多的大洋,虽然有点小贵,在研究的过程中,在技术上也没啥帮助,但是老板的一句话惊醒了我。Host 通信时主机端发起的,单片机里面是不可能一直发数据出来的,我当时就蒙B了,搞了尼玛这么大半天,老子原理都还没搞通啊。
最后调整策略,先让我自定义的HID设备,在没有与Android host建立连接之前,固件内不要一直填充数据,这样就系统就不会去加载HID类驱动,去解析,解析不出来,出现以上第二点的现象了。
总结:自定义HID设备,在建立连接之前,先不要想主机端发数据,建立连接之后,发控制命令给单片机设备,切换状态。再发数据。这样就能成功传送数据了。