Android USB Host与HID通讯(二)

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

原文出处: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7安装PHP5.6.23

为什么80%的码农都做不了架构师&#xff1f;>>> 美国时间2014年11月13日&#xff0c;PHP开发团队&#xff0c;在「PHP 5.6.3 is available&#xff5c;PHP: Hypertext Preprocessor」上公布了PHP5.6系的最新版本「PHP 5.6.3」。 在最新的版本5.6.3不仅修改了多个Bu…

为什么接吻需要闭眼睛?

1 你用上5G了吗&#xff1f;它已经用上了▼2 戴口罩的好处又增加了▼3 原来如此...▼4 哈哈哈哈▼5 露脐装的正确打开方式&#xff08;素材源于网络&#xff0c;侵删&#xff09;▼6 火鸡面到底有多辣▼7 孩子你要完了&#xff08;素材来源网络&#xff0c;侵删&#xff0…

最近要出绩效了

上周我们公司的绩效面谈全部结束了&#xff0c;每年到这个时间点就是打绩效的时候了&#xff0c;对于职场打工人来说绩效绝对是最重要的事情之一&#xff0c;原因也很简单&#xff1a;奖金、晋升、涨薪都和它有关系。比如下面这个美团员工在脉脉上的自曝就很凄凉&#xff1a;互…

从B 树、B+ 树、B* 树谈到R 树

作者&#xff1a;July、weedge、Frankie。编程艺术室出品。 说明&#xff1a;本文从B树开始谈起&#xff0c;然后论述B树、B*树&#xff0c;最后谈到R 树。其中B树、B树及B*树部分由weedge完成&#xff0c;R 树部分由Frankie完成&#xff0c;全文最终由July统稿修订完成。 出…

纯IPv6环境App适配的坑

来源&#xff1a;伯乐在线专栏作者 - MrPeak 链接&#xff1a;http://ios.jobbole.com/86580/ 苹果从2016年6月1号开始&#xff0c;强制所有app必须支持纯IPv6的网络环境。这项举措将对IPv6的普及起到一定的推动作用&#xff0c;也体现了Apple作为国际大厂的担当。 大部分App由…

使用Visual Studio 创建新的Web Part项目

使用Visual Studio 创建新的Web Part项目 Web Part是你将为SharePoint创建的最常见的对象之一。它是平台构建的核心基块。1. 管理员身份打开Visual Studio&#xff0c;新建空白SharePoint项目。命名WroxSPProject&#xff0c;点击确定。部署为场解决方案&#xff0c;点击完成。…

聊一聊Yarp结合Nacos完成服务发现

背景 Yarp 这个反向代理出来后&#xff0c;相信还是有不少人在关注的。在 Yarp 中&#xff0c;反向代理的配置默认也是基于配置文件的&#xff0c;也有不少大佬已经把这个配置做成了数据库配置可视化界面。仔细想了想&#xff0c;做成数据库配置&#xff0c;好像只是便于配置的…

相亲对象能有多油腻......

1 冰起来再烧&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 还没从年假清醒的我&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 孙悟空为啥没被人收去当坐骑&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 成年人的潜台词&#xff08;素材…

教你如何迅速秒杀掉:99%的海量数据处理面试题

教你如何迅速秒杀掉&#xff1a;99%的海量数据处理面试题 作者&#xff1a;July 出处&#xff1a;结构之法算法之道blog 前言 一般而言&#xff0c;标题含有“秒杀”&#xff0c;“99%”&#xff0c;“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌&#xff0c;但进一步来讲…

【.NET 遇上 GraphQL】 ChilliCream 平台介绍

ChilliCreamhttps://chillicream.com/https://github.com/ChilliCream/hotchocolateChilliCream 平台包含了四个产品, Hot Chocolate, Banana Cake Pop, Strawberry Shake, 平台提供开发人员工具和服务以加快整个开发过程。Hot ChocolateHot Chocolate 是 .NET 平台下的一个开源…

.NET 的 WebSocket 开发包比较

编者按 本文出现在第三方产品评论部分中。在这一部分的文章只提供给会员&#xff0c;不允许工具供应商用来以任何方式和形式来促销或宣传产品。请会员报告任何垃圾信息或广告。 Web项目常常需要将数据尽可能快地推送给客户&#xff0c;必要时无需等待客户端请求。对于与用户之间…

《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

《CMake实践》笔记一&#xff1a;PROJECT/MESSAGE/ADD_EXECUTABLE 《CMake实践》笔记二&#xff1a;INSTALL/CMAKE_INSTALL_PREFIX 《CMake实践》笔记三&#xff1a;构建静态库与动态库 及 如何使用外部共享库和头文件 四、更好一点的Hello World 没有最好&#xff0c;只有更好…

14年前,林国强院士发现自己学生论文无法重复后,是这样处理的

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;iNature让我们把时间拨回至 2007 年 3 月&#xff0c;当年&#xff0c;一封以林国强院士的名义发表的公开信&#xff0c;在网络上流传。信中披露&#xff0c;林院士发现自己的一名博士生发表在权威期刊《美国化学会志…

支持向量机通俗导论(理解SVM的三层境界)

支持向量机通俗导论&#xff08;理解SVM的三层境界&#xff09; 作者&#xff1a; July &#xff1b; 致谢&#xff1a; pluskid、 白石、J erryLead。出处&#xff1a;结构之法算法之道 blog 。 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的&#…

WPF 实现加速小火箭~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。01—代码如下一、创建 SpeedRocketsExample.xaml 代码如下。<Window x:Class"WPFDevelopers…

最懂男人心的内裤,戳100个洞透气,超舒服

▲ 点击查看有什么日用品&#xff0c;需要盆友们时不时就经常补货买买买的&#xff1f;除了家里的酱油、纸巾、沐浴露&#xff0c;还有一样hin重要&#xff0c;那就是内裤&#xff01;除了洗澡的空挡&#xff0c;内裤就一直穿在身上&#xff0c;可以说内裤是比女友还亲、比手机…

Logback也爆漏洞了,总结下最近log相关的几个漏洞

大家好&#xff0c;我是君哥&#xff0c;周末又要结束了。前些天 Apache Log4j2 接连报了几个重大漏洞&#xff0c;好在我们的系统使用的 logback&#xff0c;可当我们正庆幸的时候&#xff0c;logback 也爆出漏洞了。今天我们一起来看一下这几个漏洞。CVE-2021-42550先看一下官…

九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题

九月十月百度人搜&#xff0c;阿里巴巴&#xff0c;腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今&#xff08;事实上&#xff0c;上篇文章更新了近3个月之久&#xff09;&#xff0c;blog已经停了3个多月&#xff0c;而在那之前&#xff0c;自开博以来的21个月每…

C++ exception类

语言本身或者标准库抛出的异常都是 exception 的子类&#xff0c;称为标准异常&#xff08;Standard Exception&#xff09;。你可以通过下面的语句来匹配所有标准异常&#xff1a; try{ //可能抛出异常的语句}catch(exception &e){ //处理异常的语句} 之所以使用引用…

拿了年终奖后,发现自己又拖后腿了?对不起,可能事实并没有那么糟糕...

全世界只有3.14 % 的人关注了爆炸吧知识不平凡的2020年早已过去了&#xff0c;打工人们已经跨过了2021年的门槛。2021年将会怎么样&#xff0c;那只有到2021年结束后我们才会知道。但我们的情绪常常毫无例外地会被“年终奖”这个关键词所扰动&#xff0c;无论在什么时候&#x…