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.请解释什么是事件代理,应用场景 ⚫ 事件流的都会经过三个阶段: 捕获阶段 -> 目标阶段 -> 冒泡阶段,而事件委托就是 在冒泡阶段完成 ⚫ 事件委托,会把一个或者一组元素的事件委托到它的父层或者更外层元素上…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
