2019独角兽企业重金招聘Python工程师标准>>>

原文出处:http://han21912.lofter.com/post/c3919_51401d

接上一篇: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设备,如何通讯,通讯方式等等。

转载于:https://my.oschina.net/han21912/blog/133707

Android USB Host与HID通讯(二)相关推荐

  1. Android USB Host与HID通讯

    Android USB Host与HID通讯 (一) Android USB Host与HID通讯 (二) Android USB Host与HID通讯Demo android usb host 读写 ...

  2. android usb host hid,Android USB Host与HID通讯

    前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小. 其中代码之处有些地方需要注意的, 特此注明一下: /*** USB HOST 连接 HID *@authorIV ...

  3. android USB摄像头做条形码及二维码扫描(1)

    摘要: 1.前言 2.底层配置 3.JNI实现 4.总结 5.BUG及优化记录 android USB摄像头做条形码及二维码扫描(2) 1. 前言 公司做的产品基于android开发板搭建的控制系统, ...

  4. 翻译Android USB HOST API

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

  5. Android usb host

    当你的Android主机是处于USB主模式下,它充当USB主机,开启设备并列举出所有已连接的USB设备.这种模式在Android 3.1及以上的版本支持. API预览 在开始开发USB Host之前, ...

  6. android USB host编程

    测试手机:华为p8 测试系统:android ------------------------------------------- android的native层usbhost供java层andro ...

  7. Android USB Host开发之manager.getDeviceList()获取不到设备列表【转载】

    原文:https://www.2cto.com/kf/201305/211304.html 同样遇到这样的问题,我的Android设备是原道N12C,官方的4.0.3系统,遇到这个问题,后来找了半天找 ...

  8. Android USB Host开发之manager.getDeviceList()获取不到设备列表

    同样遇到这样的问题,我的Android设备是原道N12C,官方的4.0.3系统,遇到这个问题,后来找了半天找到的,现在汇总一下吧: 1.创建 android.hardware.usb.host.xml ...

  9. android otg读写文件,Android USB Host在USB设备OTG中读/写文件

    我正在编写Android设备是主机的应用程序.用户将USB驱动器连接到Android设备,我的应用程序将在USB驱动器中写入一些文本文件.文本文件的路径就像USB_DRIVE/Data/APP_NAM ...

最新文章

  1. pycharm设置回退功能
  2. 美团爱问Kafka?太真实了!
  3. SQL大圣之路笔记——SQL 创建索引 index
  4. redis3---使用
  5. 深入理解 ValueTask
  6. hadoop-集群管理(3)——不常用参数
  7. 华为魔术手机拆机图解_华为荣耀20进水不开机
  8. js模块化与面向对象编程思考与实践
  9. NSMutableString基本概念
  10. python 字符串交集_集合 (Set) | 一山不容二虎的 Python 数据类型
  11. 《Head First设计模式》第二版中译本内文彩页欣赏
  12. 【macOS】Macbook修改键盘映射
  13. 声网Agora 孙雨润:下一代实时传输体系结构的升级与应用
  14. 数学建模--神经网络在线绘图工具,流程图绘图工具,OCR图片公式识别
  15. 无人机油动发动机调试
  16. Linux系统接口ioc,Linux下SCSI API研究及应用
  17. 从飞猪智能酒店到优酷视频,探索阿里智能研发协同流程
  18. 五大领域总目标指南_幼儿园五大领域活动总目标
  19. linux制作U盘win10启动盘
  20. 802.11 帧(MAC架构)

热门文章

  1. 实现点击按钮后,倒计时60秒才能再次点击
  2. 形容人的内核是什么意思_成语雪泥鸿爪是形容什么的?雪泥鸿爪什么意思?蚂蚁庄园2020年12月10日答案...
  3. Linux stmac网卡代码分析----probe
  4. java代码块的定义_Java几种代码块的定义与常见问题
  5. java BigDecimal去掉小数点后的零
  6. 学习笔记~~~~~python基础
  7. 友善之臂编linux内核,友善之臂NanoPC-T3 Plus,s5p6818编译Linux内核流程
  8. 100个高低压配电知识!网络弱电必备知识~
  9. APP技巧:电脑登录微信,要删除这5个文件!否则别人能查看聊天记录
  10. 数据结构基础:图结构的学习笔记