zoukankan      html  css  js  c++  java
  • Android USB Host 与 HID 之通讯方法(bulkTransfer()与controlTransfer()方法使用)

    转载地址:差满多乃几

    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, 则为读数据

  • 相关阅读:
    基础总结深入:数据类型的分类和判断(数据、内存、变量) 对象 函数 回调函数 IIFE 函数中的this 分号
    BOM 定时器 通过修改元素的类来改变css JSON
    事件 事件的冒泡 事件的委派 事件的绑定 事件的传播
    DOM修改 使用DOM操作CSS
    包装类 Date Math 字符串的相关的方法 正则表达式 DOM DOM查询
    数组 call()、apply()、bind()的使用 this arguments
    autocad 二次开发 最小包围圆算法
    win10 objectarx向导在 vs2015中不起作用的解决办法
    AutoCad 二次开发 jig操作之标注跟随线移动
    AutoCad 二次开发 文字镜像
  • 原文地址:https://www.cnblogs.com/sowhat4999/p/4439874.html
Copyright © 2011-2022 走看看