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设备进行通讯的步骤都是大同小异:查询usb设备列表 ——>匹配对应的设备类型(如productid , vendorId)等——>连接usb设备,找到连接通讯的节点——>配置通讯信息,进行通讯。以上是…...
学习AI 机器学习,深度学习需要用到的python库
学习人工智能(AI)时,Python是最流行的编程语言之一。以下是一些常用的Python库和工具,它们可以帮助你入门并深入学习AI和机器学习: 数据处理和分析库 NumPy: 用于处理大型多维数组和矩阵运算,并提供数学函…...
计算机网络 期末复习(谢希仁版本)第8章
元文件就是一种非常小的文件,它描述或指明其他文件的一些重要信息。这里的元文件保存了有关这个音频/视频文件的信息。 10. 流式:TCP;流式实况: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的发现
关于锁存器的发明,有下面一段伪历史,所谓伪历史,就是我不想去考证发明人是否有这样一条思路,但是这肯定算是一个思路。 伪历史是这样开始的,人们先发明了反相器,就如下图所示。 接着,人们开始考…...
C++ | Leetcode C++题解之第140题单词拆分II
题目: 题解: 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过程
一。概述 程序计数器、虚拟机栈、本地方法栈都是随线程生灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,内存垃圾回收主要集中于Java堆和方法区中。 GC整体流程示意图: ① 年轻代对象的移动…...
Web前端自学初中:探索与突破
Web前端自学初中:探索与突破 在数字化时代,Web前端技术成为了连接用户与互联网世界的桥梁。对于初中生而言,自学Web前端不仅可以培养他们的逻辑思维能力,还能为他们打开一扇通往技术世界的大门。然而,这一过程中充满了…...
音视频开发26 FFmpeg 时间问题整理
time_base 、pts、dts、duration time_base:时间基,所谓时间基表示的就是每个刻度是多少秒 ,例如 如果把1秒分为25等份,你可以理解就是一把尺,那么每一格表示的就是1/25秒。此时的time_base{1,25} …...
设计模式之MVC模式
文章目录 MVC模式概要意图主要解决的问题使用场景实现方式关键代码应用实例特点优点缺点 使用建议注意事项 代码实现 MVC模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。 Model(模型&a…...
u盘数据要在哪台电脑上恢复?u盘数据恢复后保存在哪里
在数字化时代,U盘已成为我们日常生活中不可或缺的数据存储设备。然而,由于各种原因,U盘中的数据可能会意外丢失,这时数据恢复就显得尤为重要。但是,很多人对于在哪台电脑上进行U盘数据恢复以及恢复后的数据应保存在哪里…...
Selenium 定位编辑框有span
当使用Selenium进行网页自动化测试时,定位一个包含span元素的编辑框可能会有些棘手,因为span通常用于对其他HTML元素进行分组或应用样式,而不一定是真正的可输入字段。不过,一旦我们确定了正确的策略,定位编辑框还是相…...
mac 安装HomeBrew
目录 一、HomeBrew是什么?二、HomeBrew命令1、检查是否安装HomeBrew2、更新brew版本 三、安装HomeBrew1、官网安装2、100%成功安装 一、HomeBrew是什么? homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等功能…...
Windows C++: 剪切板内容获取
获取Windows用户的剪切操作是部分程序的需求,我们同样可以利用这个功能做一个小工具来记忆曾经的复制内容。 代码示例 if (OpenClipboard(nullptr)) {// 打开剪贴板HANDLE hClipboardData GetClipboardData(CF_UNICODETEXT);// 获取剪贴板中的Unicode文本数据if …...
1panel运维面板
文章目录 引言I 安装防火墙II 借助运维面板1panel运维面板安装nacos 引言 在 SSH 终端输入以下命令来查看面板入口: 1pctl user-info 提示:修改密码可执行命令:1pctl update password I 安装防火墙 https://1panel.cn/docs/user_manual/hosts/firewall…...
人工智能GPT-4o?
对比分析 在讨论GPT-4o时,我们首先需要了解其前身,即GPT-4,以及其之前的版本。GPT系列从GPT-1到GPT-4经历了多次迭代,每一次都带来了显著的进步。 GPT-4 vs GPT-4o: 1. **参数规模:** GPT-4o在参数规模上…...
python之语法糖
一.语法糖 语法糖不是糖,而是编程语言中的某些特殊写法,这些写法让书写起来更加简洁,容易理解,因此被叫做语法糖 二.语法糖分类 数字分隔符 a 10_0000_0000交换变量值 a 1;b 2 a,b b,a连续比较式 a 90 if 80<a<100: print(‘优秀’)字符串乘法 a ‘_’*10列表拼…...
纷享销客海外合规观点与方案:个人隐私数据保护与数据出入境
出海,已不再是企业的“备胎”,而是必须面对的“大考”!在这个全球化的大潮中,有的企业乘风破浪,勇攀高峰,也有的企业在异国他乡遭遇了“水土不服”。 面对“要么出海,要么出局”的抉择…...
公司面试题总结(四)
19.请解释什么是事件代理,应用场景 ⚫ 事件流的都会经过三个阶段: 捕获阶段 -> 目标阶段 -> 冒泡阶段,而事件委托就是 在冒泡阶段完成 ⚫ 事件委托,会把一个或者一组元素的事件委托到它的父层或者更外层元素上…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
