当前位置: 首页 > news >正文

Android 中USB-HID协议实现

前言

所有通过USB连接android设备进行通讯的步骤都是大同小异:查询usb设备列表 ——>匹配对应的设备类型(如productid , vendorId)等——>连接usb设备,找到连接通讯的节点——>配置通讯信息,进行通讯。以上是通常的连接usb设备进行通讯的步骤和特点。

下面来说一下usb-hid的连接机制和步骤

首先讲讲hid是什么?

(Human Interface devices)指的是人机交互接口设备,通常是指我们日常用到的键盘鼠标等设备。

USB描述符的内容

标准的USB设备总共包括五种USB描述符:设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。HID设备除了需要标准的USB描述符还需要HID报告描述符,HID物理描述符可选。HID是一种USB通信协议,无需安装驱动就能进行交互。

有些场景下,我们会用到复合usb-hid,比如在usb camera中我们需要在摄像头硬件里增加物理按键来实现相关的功能,这种情况下就会涉及到复合usb'-hid的场景,这种情况下,我们需要找到相关的接口描述符,然后进行与硬件按钮进行协议交互。

步骤:
一,查找列表,匹配对应的设备
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
//找到对应的设备列表,然后与已知的productId和vendorID进行匹配找到对应的设备。
UsbDevice device = (UsbDevice) manager.getDeviceList().valuse().toArray()[0];
二、请求设备权限
PendingIntent pendingIntent = PendingIntent.getBroadcast(Application.getBaseApp().getApplicationContext(), 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE
);IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
Application.getBaseApp().getApplicationContext().registerReceiver(mUsbReceiver, filter);
manager.requestPermission(device, pendingIntent);
三、连接设备并进行通信
if (device != null) {connection = manager.openDevice(device);if (connection == null) {return;}interfacesList = new LinkedList();for (int i = 0; i < device.getInterfaceCount(); i++) {UsbInterface intf = device.getInterface(i);interfacesList.add(intf);}usbThreadDataReceiver = new USBThreadDataReceiver();usbThreadDataReceiver.start();}

//循环接收消息

for (UsbInterface intf : interfacesList) {if (intf.getInterfaceClass() != 0x0E) {  //非视频流接口描述for (int i = 0; i < intf.getEndpointCount(); i++) {UsbEndpoint endPointRead = intf.getEndpoint(i);connection.claimInterface(intf, true);if (UsbConstants.USB_DIR_IN == endPointRead.getDirection()) {while (!isStopped) {final byte[] buffer = new byte[endPointRead.getMaxPacketSize()];int status = connection.bulkTransfer(endPointRead, buffer, buffer.length, 100);if (status > 0) {if (listener != null) {listener.recevie(bytes2HexString(buffer));}}
}
}
这里需要注意的是:设备中每一个接口描述都是对应的HID 设备支持的一种功能。可以参考对应的文献资料:USB-HID设备中的复合设备_usb interface number-CSDN博客

相关文章:

Android 中USB-HID协议实现

前言 所有通过USB连接android设备进行通讯的步骤都是大同小异&#xff1a;查询usb设备列表 ——>匹配对应的设备类型&#xff08;如productid , vendorId&#xff09;等——>连接usb设备&#xff0c;找到连接通讯的节点——>配置通讯信息&#xff0c;进行通讯。以上是…...

学习AI 机器学习,深度学习需要用到的python库

学习人工智能&#xff08;AI&#xff09;时&#xff0c;Python是最流行的编程语言之一。以下是一些常用的Python库和工具&#xff0c;它们可以帮助你入门并深入学习AI和机器学习&#xff1a; 数据处理和分析库 NumPy: 用于处理大型多维数组和矩阵运算&#xff0c;并提供数学函…...

计算机网络 期末复习(谢希仁版本)第8章

元文件就是一种非常小的文件&#xff0c;它描述或指明其他文件的一些重要信息。这里的元文件保存了有关这个音频/视频文件的信息。 10. 流式&#xff1a;TCP&#xff1b;流式实况&#xff1a;UDP。...

abap 多线程运行demo

SAP 提供多种多线程的方法去优化程序的执行效率 1.分别执行多个job 2.Call function STARTING NEW TASK 3.直接使用SAP 提供的SPTA 框架函数:SPTA_PARA_PROCESS_START_2 本次,我们着重来介绍一下三种方法中函数的使用方法 获取空闲线程数:SPBT_INITIALIZE *&------…...

python科研做图系列之时序图的绘制——对比折线图

参考知乎 折线图 我需要从两个不同的excel都读取第一列作为时间列,第二列作为编码列。 在同一张图上画出两条时间序列的折线图 横坐标是分钟,纵坐标是编码 帮我画的好看一些,记得解决中文乱码问题 英文版折线图 ,先搞个英文版,导师要求中文的话,再换成中文版 impor…...

数字信号处理:关于锁存器Latch的发现

关于锁存器的发明&#xff0c;有下面一段伪历史&#xff0c;所谓伪历史&#xff0c;就是我不想去考证发明人是否有这样一条思路&#xff0c;但是这肯定算是一个思路。 伪历史是这样开始的&#xff0c;人们先发明了反相器&#xff0c;就如下图所示。 接着&#xff0c;人们开始考…...

C++ | Leetcode C++题解之第140题单词拆分II

题目&#xff1a; 题解&#xff1a; class Solution { private:unordered_map<int, vector<string>> ans;unordered_set<string> wordSet;public:vector<string> wordBreak(string s, vector<string>& wordDict) {wordSet unordered_set(w…...

JVM (四)GC过程

一。概述 程序计数器、虚拟机栈、本地方法栈都是随线程生灭&#xff0c;栈帧随着方法的进入和退出做入栈和出栈操作&#xff0c;实现了自动的内存清理&#xff0c;因此&#xff0c;内存垃圾回收主要集中于Java堆和方法区中。 GC整体流程示意图&#xff1a; ① 年轻代对象的移动…...

Web前端自学初中:探索与突破

Web前端自学初中&#xff1a;探索与突破 在数字化时代&#xff0c;Web前端技术成为了连接用户与互联网世界的桥梁。对于初中生而言&#xff0c;自学Web前端不仅可以培养他们的逻辑思维能力&#xff0c;还能为他们打开一扇通往技术世界的大门。然而&#xff0c;这一过程中充满了…...

音视频开发26 FFmpeg 时间问题整理

time_base 、pts、dts、duration time_base&#xff1a;时间基&#xff0c;所谓时间基表示的就是每个刻度是多少秒 &#xff0c;例如 如果把1秒分为25等份&#xff0c;你可以理解就是一把尺&#xff0c;那么每一格表示的就是1/25秒。此时的time_base{1&#xff0c;25} &#xf…...

设计模式之MVC模式

文章目录 MVC模式概要意图主要解决的问题使用场景实现方式关键代码应用实例特点优点缺点 使用建议注意事项 代码实现 MVC模式 MVC 模式代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式。这种模式用于应用程序的分层开发。 Model&#xff08;模型&a…...

u盘数据要在哪台电脑上恢复?u盘数据恢复后保存在哪里

在数字化时代&#xff0c;U盘已成为我们日常生活中不可或缺的数据存储设备。然而&#xff0c;由于各种原因&#xff0c;U盘中的数据可能会意外丢失&#xff0c;这时数据恢复就显得尤为重要。但是&#xff0c;很多人对于在哪台电脑上进行U盘数据恢复以及恢复后的数据应保存在哪里…...

Selenium 定位编辑框有span

当使用Selenium进行网页自动化测试时&#xff0c;定位一个包含span元素的编辑框可能会有些棘手&#xff0c;因为span通常用于对其他HTML元素进行分组或应用样式&#xff0c;而不一定是真正的可输入字段。不过&#xff0c;一旦我们确定了正确的策略&#xff0c;定位编辑框还是相…...

mac 安装HomeBrew

目录 一、HomeBrew是什么&#xff1f;二、HomeBrew命令1、检查是否安装HomeBrew2、更新brew版本 三、安装HomeBrew1、官网安装2、100%成功安装 一、HomeBrew是什么&#xff1f; homebrew是一款Mac OS平台下的软件包管理工具&#xff0c;拥有安装、卸载、更新、查看、搜索等功能…...

Windows C++: 剪切板内容获取

获取Windows用户的剪切操作是部分程序的需求&#xff0c;我们同样可以利用这个功能做一个小工具来记忆曾经的复制内容。 代码示例 if (OpenClipboard(nullptr)) {// 打开剪贴板HANDLE hClipboardData GetClipboardData(CF_UNICODETEXT);// 获取剪贴板中的Unicode文本数据if …...

1panel运维面板

文章目录 引言I 安装防火墙II 借助运维面板1panel运维面板安装nacos 引言 在 SSH 终端输入以下命令来查看面板入口: 1pctl user-info 提示&#xff1a;修改密码可执行命令&#xff1a;1pctl update password I 安装防火墙 https://1panel.cn/docs/user_manual/hosts/firewall…...

人工智能GPT-4o?

对比分析 在讨论GPT-4o时&#xff0c;我们首先需要了解其前身&#xff0c;即GPT-4&#xff0c;以及其之前的版本。GPT系列从GPT-1到GPT-4经历了多次迭代&#xff0c;每一次都带来了显著的进步。 GPT-4 vs GPT-4o&#xff1a; 1. **参数规模&#xff1a;** GPT-4o在参数规模上…...

python之语法糖

一.语法糖 语法糖不是糖,而是编程语言中的某些特殊写法,这些写法让书写起来更加简洁,容易理解,因此被叫做语法糖 二.语法糖分类 数字分隔符 a 10_0000_0000交换变量值 a 1;b 2 a,b b,a连续比较式 a 90 if 80<a<100: print(‘优秀’)字符串乘法 a ‘_’*10列表拼…...

纷享销客海外合规观点与方案:个人隐私数据保护与数据出入境

出海&#xff0c;已不再是企业的“备胎”&#xff0c;而是必须面对的“大考”&#xff01;在这个全球化的大潮中&#xff0c;有的企业乘风破浪&#xff0c;勇攀高峰&#xff0c;也有的企业在异国他乡遭遇了“水土不服”。 面对“要么出海&#xff0c;要么出局”的抉择&#xf…...

公司面试题总结(四)

19.请解释什么是事件代理&#xff0c;应用场景 ⚫ 事件流的都会经过三个阶段&#xff1a; 捕获阶段 -> 目标阶段 -> 冒泡阶段&#xff0c;而事件委托就是 在冒泡阶段完成 ⚫ 事件委托&#xff0c;会把一个或者一组元素的事件委托到它的父层或者更外层元素上&#xf…...

守护山川,联通希望 —— 北斗户外应急呼叫柱:野外安全的守护神

在大自然的怀抱中&#xff0c;每一次探险和巡检都是对未知的挑战&#xff0c;也是对安全的考验。北斗户外应急呼叫柱&#xff0c;以科技创新为基石&#xff0c;致力于在最偏远、最危险的环境中搭建起生命的桥梁&#xff0c;确保每一次求救都能被听见&#xff0c;每一处危机都能…...

使用canvas制作一个无人机旋转特效

​ 使用HTML5的Canvas API来制作一个无人机旋转特效。这个特效将包括一个无人机图标&#xff08;你可以使用任何你喜欢的图标&#xff09;&#xff0c;它会在一个固定的位置旋转。 首先&#xff0c;我们需要创建一个HTML文件&#xff0c;然后在其中添加一个canvas元素。canvas…...

感受风的速度~2024COSP上海国际户外展为您的骑行之旅锦上添花

夏天已经到来 你是在家里宅着 还是出去晒太阳呢 若是还没抉择好 不如来一场畅快淋漓的追风之旅 抬头可见蓝天白云 低头便是美丽风景 无论是在凉亭闲聊的人们 还是竞相绽放的花朵 每一个场景都令人难忘 骑累了 就到附近的座椅上小憩一番 不用刻意追求速度 尽享“慢…...

冲12分top刊|乳腺癌单细胞细分亚型的正确打开方式

说在前面 学习一下一篇自测数据工作量叠满的单细胞文章&#xff0c;也算是多组学的了&#xff0c;bulkRNAscRNA&#xff0c;还有个伪RNA。 整体是一个单细胞分小群的研究思路&#xff0c;分出三种上皮细胞亚群&#xff08;BM、LP、ML&#xff09;&#xff0c;在功能、免疫、预…...

1-Maven-settings配置

1-Maven-settings配置 整理下Maven工具的使用。 【本地仓库、私服、镜像仓库、远程仓库、中央仓库】 本文基于阅读其他博客和对公司Maven配置的学习整理出来的。希望通过本此学习能对Maven有个整体性的掌控。 顺序&#xff1a;profile.repository > pom文件中的repository &…...

使用服务器搭建个人图床

前置条件 云服务器picGo软件,下载地址开始搭建 发布站点 该步骤不一一说明,主要说明搭建图床的步骤。 可以直接使用nginx或者宝塔面板,发布一个静态资源的文件夹。 假如我发布的文件路径是/www/img,访问地址是http://cc.cc.cc(没有域名ip地址也行) 在img下建立两个文件夹…...

探索 doc 和 docx 文件格式的区别

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…...

kettle学习(利用jsonPath定位,json文件转换)

kettle学习&#xff08;利用jsonPath定位&#xff0c;json文件转换&#xff09; 于数据处理的广袤天地间&#xff0c;我们时常需应对各类繁杂状况与各式格式。Kettle 作为极具威力的数据集成利器&#xff0c;赋予了我们诸多功能与无限可能此次博客里&#xff0c;我们将重点投向…...

选到哪里看命

srand()、rand() srand(static_cast<unsigned int>(time(nullptr))) 是 C 中用于初始化随机数生成器&#xff08;Random Number Generator, RNG&#xff09;的一个常用语句。srand 函数是 C 标准库 <cstdlib> 中的一部分&#xff0c;用于设置随机数发生器的种子值…...

MyBatis插件机制介绍与原理

插件简介 什么是插件 插件是一种软件组件&#xff0c;可以在另一个软件程序中添加功能或特性。插件通常被设计成可以 随时添加或删除 的&#xff0c;而不影响 主程序 的功能。插件可以 扩展 软件程序的功能&#xff0c;这让用户可以根据自己的需求定制软件&#xff0c;提高工作…...

东莞seo关键词搜索关键词/国际站seo优化是什么意思

本文分享一个好用的php与mysql操作类&#xff0c;此mysql类与其它类的不同在于&#xff0c;可以设置表的读、写锁。有需要的朋友参考下吧。分享一个php与mysql操作类&#xff0c;代码&#xff1a;getConnected()) {$this->closeConnection();}if($this->connection ($bP…...

商城建站流程/设计网站logo

啦啦外卖41.7独立版最新外卖源码全开源 依旧是开源安装版&#xff0c;不是市面上的网站打包的垃圾版本。 包含完整vue源码 安装演示 版本验证 插件列表&#xff1a; vue源码 小程序新接口可以正确获取用户信息&#xff1a;...

深圳做电商网站/推广平台排行榜

吉林实验室洗煤压滤机欢迎来电,在冬季&#xff0c;被过滤液也会发生变化&#xff0c;从而间接的影响压滤机。过滤液在这个季节&#xff0c;其活动性没在夏季那么强&#xff0c;所以其流动性也会降低一些&#xff0c;这样就是导致了被过滤液在穿过滤布时的速度会减慢&#xff0c…...

做化工的网站/南京网站制作设计

微信上进行的网页宣传、游戏传播、APP下载各类活动很多&#xff0c;但是各位朋友肯定经常会遇到一些特殊需求&#xff0c;网页需要在手机默认浏览器打开而不是微信内置浏览器。这个问题怎么解决呢? 斗在微信营销的浪潮中 解决方案&#xff1a;微信中打开链接&#xff0c;自动打…...

wordpress多用户商城/数据分析师要学什么

本文收集整理关于python如何解一元二次方程的相关议题&#xff0c;使用内容导航快速到达。 内容导航&#xff1a; Q1&#xff1a;python 使用try except解一元二次方程问题 12345678910111213141516171819报错UnboundLocalError:localvariableareferencedbeforeassignment这个报…...

wordpress add_options_page/网络推广代理怎么做

对于该输入: python3如下: if __name__ __main__:while True:try:l list(map(int, input().strip().split()))if len(l) 0:breakprint(sum(l))except EOFError:break注:不加try、except模块oj系统报错...