Android USB Host 与 HID 之通讯方法

时间:2022-06-30 19:20:02

Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两个方法,要实现真正的通讯可谓要难倒一大片android开发者,至少对于我一开始就是这样,这对和我一样不懂HID及外设等底层通讯原理的人更是一个头两个大,况且不同的HID具体通讯机制也不同,因设备而异。

先不管其他,先仔细看看bulkTransfer()与controlTransfer()方法吧,个人觉得google Developer给出的资料太少,没啥详细说明,初一看简单,真正一用才知道问题一大堆。。

1),bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout):
    功能:Performs a bulk transaction on the given endpoint.没什么说的google原版解释,执行一个bulk transaction在我们给定的端点;
    参数:endpoint,OUT or IN(Host to Device用OUT,Device to Host 用IN);
          buffer  ,你将要发送/接收的指令或数据,当endpoint为OUT,buffer为你定义好的指令或数据,将下发给device,当endpoint为IN,buffer则是一个容器,用来存储device返回的应答指令或数据,此时一定要注意buffer的大小,以足够存储所有的数据;
          length  ,即发送/接收指令或数据的大小;
          timeout ,即指令或数据的最长通讯时间,在通讯出现问题时,若超时还未通讯完成,视为通讯失败;
    说明:此方法还算好,按照正常操作定义好4个参数,都可以正常实现,重点是对与不同设备进行bulkTransfer()的组合使用,指令下发次序和数据接收处理等问题,这些在此先不详谈,有时间下次再详细~~

2),controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
        功能:Performs a control transaction on endpoint zero.说直白点就是零点传输执行一个control transaction,即所有的通讯都是通过endpoint 0;
        参数:requestType,request type for this transaction
                  request      ,request ID for this transaction
                  value         ,value field for this transaction
                  index         ,index field for this transaction
                  buffer       ,同bulkTransfer()
                  length       ,同bulkTransfer()
                  timeout     ,同bulkTransfer()
        说明:此方法个人而言,难点在7个参数,特别是前四个参数,google能给出的针对各参数的具体说明少,到现在都还不太确定,所以前四个参数都只给出google的原解释。requestType可以确定是USB_ENDPOINT_DIR_MASK其中包含USB_DIR_OUT和USB_DIR_IN两种类型,而对于request,value,index,没有具体详细,我试了很多种情况,也看了下样例和在网上看了些他人的资料,至今未能完全弄懂,求分享,求扩散中~~

下面是曾经学习摸索中的写法,不知错对,请赐教。。
controlTransfer(UsbConstants.USB_TYPE_MASK, UsbConstants.USB_DIR_OUT, 0, 0, CMD, CMD.length, 5000);

PS:这阵子的Android HID学习开发有一段时间,也有些成就,目前已能进行通讯,但仍在进一步研究中,接下来我会抽时间先总结记录这段时间的一些知识。。