这是我2017年中最大的收获,也是陷入一个技术漩涡中的一次经历!

由于公司需要,领导安排做一个自定义HID设备在Android系统上的信号检测工具。如图。

自定义HID设备与Android设备通信_第1张图片

而Android主板不是自家的,希望不要驱动下来完成这件事,表面看起来想想有点不现实,但是我知道有Android Host 通信啊,应该是可以的,回想起来觉自己还是被什么给遮住了双眼?陷入了一个常识里了,现在来说一说我的折腾之路。

首先,Android系统的API  mUsbManager.getDeviceList 获取不到自定义的HID设备;经过网上查资料,深入学习USB协议,HID协议,各种描述符的配置;对比能获取到的设备的报告描述符,找到了这篇文章http://ask.csdn.net/questions/193856 修改了描述符的配置:

此时,通过Android系统的API  mUsbManager.getDeviceList 获取能获取到了自己自定义的HID设备。

其次,照这么一说,做这个工具应该就没有什么问题了,在实操的过程中,当我将设备的状态切换的时候,固件会断开,以另一个自定义设备的形式“一直发送数据”出来(这就是我折腾很久的原因所在)。这样的情况下,Android使用host通信就会存在问题。因为是自定义HID设备,Android系统没有对应的驱动,每当host驱动加载完成之后,再向上HID驱动去解析,由于该设备是自定义的所以解析不了,所以会出现以下现象。如图:

自定义HID设备与Android设备通信_第2张图片

该现象说明没有自定义的驱动,一直在枚举我自定义的HID设备。

接下来,想到是没有驱动的问题,于是又去自定义一个HID的驱动(这又不符合领导的要求,我想先把问题解决了再去说服领导,至少还是有解决方案的),而我添加的原因就是验证是否没有枚举上的原因,添加之后果然是,于是又在这个基础上,用Host通信,这又开始了下一步的验证。经过一段时间的验证,发现的现象,有能正常获取数据,而有时又不能获取正常数据,又在此基础上,追究深层原因,结果发现在这条命令:

                              

又强制将我的驱动卸载了,卸载之后,相当于重新插拔了设备,虽然强制建立了连接关系,但是在Android应用层获取的设备始终是设备的前一个状态,这又导致了获取不到想要的数据。在此基础上也找不到新的试探方向。感觉就此要夭折了。

后来没事就在网上找相关自定义HID设备与Android系统通信的解决办法,再一次偶然的机会看到贴子,当然该帖子也是为了宣传他们的淘宝店产品(我以前在校期间也这么玩过)。果断地买了个回来研究,就一个STM32单片机的最小系统卖了我800多的大洋,虽然有点小贵,在研究的过程中,在技术上也没啥帮助,但是老板的一句话惊醒了我。Host 通信时主机端发起的,单片机里面是不可能一直发数据出来的,我当时就蒙B了,搞了尼玛这么大半天,老子原理都还没搞通啊。

       最后调整策略,先让我自定义的HID设备,在没有与Android host建立连接之前,固件内不要一直填充数据,这样就系统就不会去加载HID类驱动,去解析,解析不出来,出现以上第二点的现象了。

总结:自定义HID设备,在建立连接之前,先不要想主机端发数据,建立连接之后,发控制命令给单片机设备,切换状态。再发数据。这样就能成功传送数据了。


             











更多相关文章

  1. Android 蓝牙对等通信初探
  2. Android和ROS的通信 消息的传递
  3. android之获取设备唯一标识符
  4. Android学习路线(十六)支持不同设备
  5. 将Unity3D项目导出到Android工程中二次开发并实现之间的数据交互
  6. Cellebrite Premium:一个访问iOS和高端Android设备的全面解决方案
  7. android连接onenet之获取onenet数据流和更新onnet数据流

随机推荐

  1. android 启动其它apk
  2. Android的Message机制
  3. [置顶] AIDL使用以及原理分析
  4. Android - View Alpha值
  5. Android弹性收缩自适应布局FlexboxLayout
  6. Vue实现掘金导航栏效果
  7. Android 8.1隐藏状态栏图标
  8. Android的Activity获取fragment和fragmen
  9. Android实现为GridView添加边框效果
  10. Andriod学习笔记(一)