不好意思,从上一篇到现在确实比较忙,中间又外出了一段时间,虽然也上LOFTER,或者看到一些朋友QQ上加我,给我发信息询问,有些看到了有些可能没看到,偶尔回复了一两个,也不咋的详细,在此我想说,一方面原因在我,不应该叫大家加Q,然后各位朋友都直接QQ信息发过来,结果就变成,要么没看到,要么看到当时没回,后来想回的时候又找不到各位问的是什么,如果要找聊天记录又有几位朋友还找得到给我发的问题记录?另一方面,我们的生活中有一种东西叫Email,它真的很好用,不信大家可以试试。。请直接文后留言或者Email,ok?

【差满多乃几sina邮箱:han21912@sina.cn】

接上一篇:Android USB Host与HID通讯 (一)

从上篇已经可以枚举到HID设备,接下来看看寻找设备的接口和通信端点,即上篇中的findIntfAndEpt()方法;

// find interface and assign end point
private void findIntfAndEpt() {
    if (mUsbDevice == null) {
        return;
    }

// find the device interface
    for (int i = 0; i < mUsbDevice.getInterfaceCount();) {
        // 获取设备接口,一般都是一个接口,你可以打印getInterfaceCount()方法查看接
        // 口的个数,在这个接口上有两个端点,OUT 和 IN 
        UsbInterface intf = mUsbDevice.getInterface(i);
        Log.d(TAG, i + " " + intf);
        if (intf.getInterfaceClass() == 8 && intf.getInterfaceSubclass() == 6 && //
                 intf.getInterfaceProtocol() == 80) {    //HID设备的相关信息
            mInterface = intf;
        }
        break;
    }

if (mInterface != null) {
        UsbDeviceConnection connection = null;
        // 判断是否有权限
        if(mUsbManager.hasPermission(mUsbDevice)) {
            // 打开设备,获取 UsbDeviceConnection 对象,连接设备,用于后面的通讯
            connection = mUsbManager.openDevice(mUsbDevice); 
            if (connection == null) {
                return;
            }
            if (connection.claimInterface(mInterface, true)) {
                mDeviceConnection = connection;
            } else {
                connection.close();
            }
        } else {
            Toast.makeText(context, "没有权限", Toast.LENGTH_SHORT).show();
        }
    }
}

上面主要用到UsbDevice.getInterface()方法和UsbManager.openDevice()方法,在连接上设备后,用UsbDeviceConnection 与 UsbInterface 进行端点设置和通讯,如下:

private void getEndpoint(UsbDeviceConnection connection, UsbInterface intf) {
    if (intf.getEndpoint(1) != null) {
        epOut = intf.getEndpoint(1);
    }
    if (intf.getEndpoint(0) != null) {
        epIn = intf.getEndpoint(0);
    }
}

在此我们获得了通讯的OUT和IN端点,也就是我们常说的输入输出,查看api可知一般1为OUT端点,0为IN端点,接下来的任务就是通讯了,而最终需要的就是connection,OUT/IN 端点,在加上你要发送的指令,打成命令包进行发送,若命令发送成功会返回相应的数据信息,当然不同的设备发送/接收命令模式不同,同一设备不同的命令也需具体处理,这就需要根据自己手上的设备而定,好好研究研究自己的HID,掌握它的命令发送/接收方式,我的设备发送/接收模式为:发送命令out(发送预发送命令+发送命令+接收发送成功信息);接收数据in(发送预接收命令+接收数据+接收数据成功信息)。

所以到这,主要的工作就是设备的通讯模式和bulkTransfer()方法的参数配置,如下是我的设备进行通讯的一个发送包,从下面可以看出,仅仅发送一个命令到HID设备,其实际进行了三次命令的发送接收,两OUT一IN,总共调用了三次bulkTransfer()方法;

// 发送包操作,发送OUT + 发送COM + 接收IN

private void sendPackage(byte[] command) {
    int ret = -100;
    int len = command.length;

// 组织准备命令
    byte[] sendOut = Commands.OUT_S;
    sendOut[8] = (byte) (len & 0xff);
    sendOut[9] = (byte) ((len >> 8) & 0xff);
    sendOut[10] = (byte) ((len >> 16) & 0xff);
    sendOut[11] = (byte) ((len >> 24) & 0xff);

// 1,发送准备命令
    ret = mDeviceConnection.bulkTransfer(epOut, sendOut, 31, 10000);
    if(ret != 31) {        
        return;
    }

// 2,发送COM
    ret = mDeviceConnection.bulkTransfer(epOut, command, len, 10000);
    if(ret != len) {
        return;
    }

// 3,接收发送成功信息
    ret = mDeviceConnection.bulkTransfer(epIn, Commands.IN, 13, 10000);
    if(ret != 13) {
        return;
    }
}

可以看出调用一次bulkTransfer()方法,若通讯成功,返回的应该是发送命令或返回信息的数据长度,一开始我的bulkTransfer()方法总是返回-1,一直处于通讯失败,这时我们应该做的事情,第一,好好的组织bulkTransfer()方法中的参数,endpoint为OUT还是IN,buffer,也就是我们要发送的命令,对此不太理解的可以反复查阅:① google开发指南,穿一手的鞋: http://developer.android.com/reference/android/hardware/usb/UsbDeviceConnection.html ② 我之前发的一篇关于HID通讯方法的文章: Android USB Host 与 HID 之通讯方法 ;第二,重点还是你自己的HID设备,如何通讯,通讯方式等等。

简单Demo下载:http://www.oschina.net/code/snippet_811255_21652

Android USB Host与HID通讯 (二)的更多相关文章

  1. Android USB Host与HID通讯

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

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

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

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

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

  4. Android USB Host 与 HID 之通讯方法(bulkTransfer()与controlTransfer()方法使用)

    转载地址:差满多乃几 Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两 ...

  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 Hid 设备的通信

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

  8. Android USB Host 通信程序

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

  9. Android USB Host框架

    Android 下的usb框架及功能点:https://blog.csdn.net/tianruxishui/article/details/379029591.Android framework中* ...

随机推荐

  1. GWT环境搭建--eclipse

    上面下来需求,需要用到GWT,以前没接触过,搭个开发环境研究研究 安装软件我放在百度云盘里了(其他版本自己找,我的版本 eclipse4.4 luna  gwt2.7) 链接:http://pan.b ...

  2. ACM——五位以内的对称素数

    http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1026 五位以内的对称素数 时间限制(普 ...

  3. HW--自守数

    package testcase; import huawei.Demo; import junit.framework.TestCase;//加入测试框架,不需要写Main函数 public cla ...

  4. Jsp与servlet之间页面跳转及参数传递实例(转)

    原网址:http://blog.csdn.net/ssy_shandong/article/details/9328985 11. jsp与servlet之间页面跳转及参数传递实例 分类: Java ...

  5. WCF编程系列(一)初识WCF

    WCF编程系列(一)初识WCF   Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型.WCF的基本概念:  地址:定义服务的 ...

  6. freemark页面中获取list循环中的counter

    如何在freemark页面中获取到当前list循环的counter 直接上代码 <#list lists as x> <#assign j=x?counter> ${j} // ...

  7. ios - cordova(phoneGap)

    安装教程 下载 node.js. http://nodejs.org/ 下载后,直接安装就可以了. 安装 Cordova工具, $ sudo npm install -g cordova 创建APP: ...

  8. ajax和jsonp的封装

    一直在用jQuery的ajax,跨域也是一直用的jQuery的jsonp,jQuery确实很方便,$.ajax({...})就可以搞定. 为了更好的理解ajax和jsonp,又重新看了下书,看了一些博 ...

  9. Java多线程练习:ticket卖票程序

    /*需求:简单的卖票程序多个窗口买票 */ class Ticket extends Thread{    private static int tick=100;    public void ru ...

  10. 九度OJ 1386 旋转数组的最小数字 【算法】

    题目地址:http://ac.jobdu.com/problem.php?pid=1386 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋 ...