当前位置: 首页 > 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博客

http://www.lryc.cn/news/370287.html

相关文章:

  • 学习AI 机器学习,深度学习需要用到的python库
  • 计算机网络 期末复习(谢希仁版本)第8章
  • abap 多线程运行demo
  • python科研做图系列之时序图的绘制——对比折线图
  • 数字信号处理:关于锁存器Latch的发现
  • C++ | Leetcode C++题解之第140题单词拆分II
  • JVM (四)GC过程
  • Web前端自学初中:探索与突破
  • 音视频开发26 FFmpeg 时间问题整理
  • 设计模式之MVC模式
  • u盘数据要在哪台电脑上恢复?u盘数据恢复后保存在哪里
  • Selenium 定位编辑框有span
  • mac 安装HomeBrew
  • Windows C++: 剪切板内容获取
  • 1panel运维面板
  • 人工智能GPT-4o?
  • python之语法糖
  • 纷享销客海外合规观点与方案:个人隐私数据保护与数据出入境
  • 公司面试题总结(四)
  • 守护山川,联通希望 —— 北斗户外应急呼叫柱:野外安全的守护神
  • 使用canvas制作一个无人机旋转特效
  • 感受风的速度~2024COSP上海国际户外展为您的骑行之旅锦上添花
  • 冲12分top刊|乳腺癌单细胞细分亚型的正确打开方式
  • 1-Maven-settings配置
  • 使用服务器搭建个人图床
  • 探索 doc 和 docx 文件格式的区别
  • kettle学习(利用jsonPath定位,json文件转换)
  • 选到哪里看命
  • MyBatis插件机制介绍与原理
  • [每日一练]利用.str.len()布尔值查询实现字数需求