转载地址:差满多乃几

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,没有具体详细,我试了很多种情况,也看了下样例和在网上看了些他人的资料,至今未能完全弄懂,求分享,求扩散中~~

一些简单的基础知识(自己后加的)

2.1 UsbManager

负责管理USB设备的类,你可以在相应代码中通过以下方法获得此对象的一个实例:

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

该类提供的主要方法有:

1) getDeviceList()

获得设备列表,返回的是一个HashMap.;

2) hasPermission(UsbDevice device)

判断你的应用程序是否有接入此USB设备的权限,如果有则返回真,否则返回false.

3) openDevice(UsbDevice device)

打开USB设备,以便向此USB设备发送和接受数据,返回一个关于此USB设备的连接。

4) requestPermission(UsbDevice device, PendingIntent pi)

向USB设备请求临时的接入权限。



2.2 UsbDevice

代表一个USB设备的类,每个设备都包含了一个或多个接口,每个接口又包含一个或多个节点用来与此设备传输数据。该类的主要方法有:

1) getDeviceClass()

返回此USB设备的类别,用一个整型来表示。

2) getDeviceId()

返回唯一标识此设备的ID号,也用一个整型来表示。

3) getDeviceName()

返回此设备的名称,用一个字符串来表示。

4) getDeviceProtocol()

返回此设备的协议类别,用一个整型来表示。

5) getDeviceSubclass()

返回此设备的子类别,用一个整型来表示。

6) getVendorId()

返回生产商ID

7) getProductId()

返回产品ID

8) getInterfaceCount()

返回此设备的接口数量

9) getInterface(int index)

得到此设备的一个接口,返回一个UsbInterface。



2.3UsbInterface

代表USB设备的一个接口,注意:UsbInterface本身是一个类,并不是一个接口。此类的主要方法有以下:

1) getId()

得到给接口的id号。

2) getInterfaceClass()

得到该接口的类别。

3) getInterfaceSubclass()

得到该接口的子类。

4) getInterfaceProtocol()

得到该接口的协议类别。

5) getEndpointCount()

获得关于此接口的节点数量。

6) getEndpoint(int index)

对于指定的index获得此接口的一个节点,返回一个UsbEndpoint.

2.4 UsbEndpoint

代表一个接口的某个节点的类。该类主要提供了一下方法供你使用:

1) getAddress()

获得此节点的地址

2) getAttributes()

获得此节点的属性

3) getDirection()

获得此节点的数据传输方向

2.5 UsbDeviceConnection

代表USB连接的一个类。用此连接可以想USB设备发送和接收数据,可以通过调用该方法openDevice(UsbDevice) 来得到该类的一个实例。该类提供了以下方法供你使用:

1)bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)

通过给定的endpoint来进行大量的数据传输,传输的方向取决于该节点的方向,buffer是要发送或接收的字节数组,length是该字节数组的长度。传输成功则返回所传输的字节数组的长度,失败则返回负数。

2)controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)

该方法通过0节点向此设备传输数据,传输的方向取决于请求的类别,如果requestType为USB_DIR_OUT则为写数据,USB_DIR_IN, 则为读数据

Android USB Host 与 HID 之通讯方法(bulkTransfer()与controlTransfer()方法使用)的更多相关文章

  1. Android USB Host 与 HID 之通讯方法

    Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两个方法,要实现真正的通 ...

  2. Android USB Host与HID通讯 (二)

    不好意思,从上一篇到现在确实比较忙,中间又外出了一段时间,虽然也上LOFTER,或者看到一些朋友QQ上加我,给我发信息询问,有些看到了有些可能没看到,偶尔回复了一两个,也不咋的详细,在此我想说,一方面 ...

  3. Android USB Host与HID通讯 (一)

    去年9月份来到现在的公司,接到新公司的第一个项目就是Android USB Host与HID通讯,当时也什么都不懂,就拿着google的api 开发指南 (http://developer.andro ...

  4. Android USB Host与HID通讯

    前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小. 比较好的文章是:      Android USB Host与HID通讯 Android Service创建US ...

  5. Android USB Host 与 Hid 设备通信bulkTransfer()返回-1问题的原因

    近期一直在做Android USB Host 与USB Hid设备(STM32FXXX)的通信,遇到了很多问题.项目源码以及所遇到的其他问题可以见本博客其他相关文章,这里重点讲一下bulkTransf ...

  6. 翻译Android USB HOST API

    翻译Android USB HOST API 源代码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者 ...

  7. 『翻译』Android USB Host

    USB Host When your Android-powered device is in USB host mode, it acts as the USB host, powers the b ...

  8. android usb Host模式下与usb Hid 设备的通信

    做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法: 1,第一次遇到的问题:android 版本低不支持usb hid, 被要求做相关项目的时候,就从mUsbMana ...

  9. Android USB Host 通信程序

    换到了一家新公司,于是就有了新的项目.这次的项目 要用Android SDK与USB HID设备进行通信.第一次接触Android SDK,以及USB,记录下源程序.开发过程以及一些心得. 首先,要感 ...

随机推荐

  1. 数据概览神器pandas_profiling

    安装: pip install pandas_profiling 用法如下: import pandas as pd import pandas_profiling df = pd.read_exce ...

  2. 37-python基础-python3-字典的常用方法-keys()-values()-items()

    有 3 个字典方法,它们将返回类似列表的值,分别对应于字典的键.值和键-值对:keys().values()和 items(). 这些方法返回的值不是真正的列表,它们不能被修改,没有append()方 ...

  3. Clairewd's message /// 字符串hash

    题目大意: 给定字符串s 是26个字母对应的密文字母 给定字符串c1 是 密文+部分原文 原文可能缺损 要求将原文补全输出 利用s得到密文字母对应的原字母rs 利用rs翻译c1得到 原文+部分密文c2 ...

  4. 分布式-技术专区-Redis分布式锁原理实现

    在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务.分布式锁等.那具体什么是分布式锁,分布式锁应用在哪些业务场景.如何来实现分布式锁呢?今天来探讨分布式锁这个话题. ...

  5. Redis事务 和 pipleline

    1.reidis事务 Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败 ...

  6. Hooks初探

    一.创建自己的HOOkS,并进行封装 二.创建自己的HOOkS,并进行封装

  7. javascript 中的函数

    /*   第二天   */ 函数 函数是js里最有趣的东西了,函数实际上就是对象,每个函数Function类型的实例,函数名实际上是指向函数对象的指针.不带圆括号的函数时访问函数的指针,带圆括号的是调 ...

  8. ICPC2008哈尔滨-E-Gauss Elimination

    题目描述 Li Zhixiang have already been in “Friendship” ocean-going freighter for three months. The excit ...

  9. HDU-6532 Chessboard 2019广东省省赛B题(费用流)

    比赛场上很容易想到是费用流,但是没有想到建图方法qwq,太弱了. 这里直接贴官方题解: 费用流.离散化坐标,每行用一个点表示,每列也用一个点表示.表示第i-1行的点向表示第i行的点连边,容量为第i行及 ...

  10. Codeforces 1163E 高斯消元 + dfs

    题意:给你一个集合,让你构造一个长度尽量长的排列,使得排列中任意相邻两个位置的数XOR后是集合中的数. 思路:我们考虑枚举i, 然后判断集合中所有小于1 << i的数是否可以构成一组异或空 ...