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

  • 相关阅读:
    关于DB2 ORACLE MYSQL 数据库 where字句执行顺序问题
    关于图片上传的一些问题
    集合、迭代器的一些总结
    关于使用Echart记录
    DB2序列的使用
    (转载)判断浏览器类型是否IE及版本问题
    SQL中 IS NULL 和IS NOT NULL
    JS 中substr 和 substring
    (转载)身份证验证
    Echars 自适应浏览器大小
  • 原文地址:https://www.cnblogs.com/sowhat4999/p/4439874.html
Copyright © 2011-2022 走看看