问题标签 [usb-hid]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
223 浏览

c - USB HID 空功能报告

我在 Windows 中使用 C 与 USB HID 设备通信。

根据 USB 设备的文档,我通过控制管道发送/接收功能报告(报告 ID 0x03)。

我可以成功发送和接收功能报告,但在许多情况下,当我执行获取功能报告时,它不会收到我期望从设备返回的报告,而是会发送一个空报告:正确报告 ID 为 0x03 的报告作为第一个字节,但所有剩余的字节都为零。

我确信这不是我的代码中的误读,因为当我使用 USB 嗅探器/分析器时,我也可以看到这些“空”报告。

我不熟悉 USB HID:这正常吗?我应该忽略这些“空”报告吗?

谢谢。

0 投票
1 回答
266 浏览

c - 如何从 STM32F103 USB 设备应用程序发送 ALT 代码?

我已将 STM32CubMX 生成的 STM32F1 USB HID 设备示例从鼠标修改为键盘,并且我可以通过在 USB 报告中发送扫描码来向主机发送字符。

现在我希望在按下特定按钮时从键盘发送一些特殊字符。

我认为他们的方式是发送包含字符 Unicode 的键的扫描码。

例如,要将带有 Unicode U+1F601(十进制 128513)的笑脸发送到 Windows 机器,我必须发送 1、2、8、5、1、3 的扫描码。我不明白的是如何用 ALT 键修饰符发送这个?

所有扫描代码都应该在带有 ALT 修饰符集的单个报告中发送,还是在不同的报告中发送?

我有一台 Ubuntu 机器并在报告中发送 CTRL+SHIFT+u 然后扫描代码后跟 Enter 键工作正常。

0 投票
1 回答
1243 浏览

python - 如何仅通过一个 Python 进程使用 USB HID 设备?

我正在使用条形码扫描仪开发后台应用程序。条形码扫描仪在我的 Linux 操作系统上被识别为 USB HID(人机接口设备)设备。因此,默认的 USB HID 驱动程序已加载,扫描仪的行为就像键盘一样。

我可以使用 pyxhook Python 模块读取扫描仪的 STDIN 内容。因此,即使我的进程在后台运行,我也可以从条形码扫描仪读取输入。

我的问题是,后台应用程序也在从常规键盘读取输入,因为它也写入 STDIN。

我想仅通过后台进程使用条形码扫描仪的 STDIN,而忽略其他 HID 设备(如键盘)的 STDIN,但我不知道如何实现。任何想法?

0 投票
0 回答
354 浏览

linux - 为旧键盘/隐藏设备编写 linux 内核模块/驱动程序

我有一个旧的 Compaq 键盘,上面有一组不起作用的键。

我已经尝试过xev, evtestevemu-record并且libinput debug-events除了这些键之外的所有其他键都可以识别。

但是,当我打开 Wireshark USB 记录器时,我会得到一些如下所示的输出:

这意味着密钥确实有效,我只需要为它编写一个驱动程序。

现在我在编写 linux 驱动程序方面的经验为零,但我查看linux/drivers/hid/github.com/torvalds/linux,具体来说hid-asus.c,我知道我必须以某种方式用相应的十六进制值识别每个击键。

问题是我可以弄清楚在哪里看,因为只有十六进制转储的0000,00200030行保持不变,并且0010每次我通过wireshark记录它时都不同。

我知道这可能是基本的,但你能指出我正确的方向吗,即提供一些我可以阅读的关于这个主题的内容,或者知道我应该如何继续?

输出evtest

这是来自的输出lsusb

0 投票
1 回答
230 浏览

javascript - WebHID API:如何解析来自 inputReport 事件的数据?

我正在尝试使用 WebHID API 从我的数字化仪(X Tilt、Y Tilt、Tip Pressure、Tip Switch、Eraser、Pen、Puck 等)获取传感器输入。这是我到目前为止所得到的:

index.js:

控制台输出:

如何找出每个数字对应的传感器?

我已经尝试阅读WebHID 规范HID 使用表,但到目前为止我一直无法找到解密输出所需的信息。


更新:

安装 Wacom 的官方驱动程序后,我在 Windows 中进行了测试,我从 InputReport 中获得了更多数据。

输出:(带有 wacom 驱动程序的 Windows)

注意:我已经记录了reportId这次,因为我现在得到了 2 个不同的。

我还注意到HIDDevice.collections对象中的不同数据: devtools 截图窗口 这次我在我的一个outputReports.

输出:(Linux用于比较)

另外HIDDevice.collections我在linux上: 在此处输入图像描述

所以我仍然不明白如何使用featureReports,InputReportsOutputReports. 所以我发现我从 Windows 上的 Wacom 驱动程序中获得的 HID 数据比 Linux 上的要多。


更新 2:

我一直在查看HIDDevice.collectionWindows 输出上的对象,并将其与Report Descriptors我在 Linux 上运行(以使它们可读)得到的usbhid-dump进行hidrd-convert比较。这是我到目前为止所发现的。

  • 看起来我只需要查看inputReports适当的元素,reportID因为我只是想读取发送到主机的传感器数据。

  • 我查看数组items以查看报告发送了哪些数据。

    • 我查看项目的索引号以了解从 DataView(我的变量)items中提取数据的顺序。data
    • 我查看reportCountreportSize了解 DataView 中该项目的数据形状。
    • 我查看每个项目的“使用情况”以了解数据的用途。
      • 不幸的是,WebHID 似乎并没有在每个项目的基础上公开“使用情况” (就像我在节目中的“报告描述符”usbhid-dump一样)。相反,它仅在每个集合的基础上公开它。
      • 可以在HID 使用表中查找“使用情况”(如果可用),方法是通过 的十六进制值查找“使用页面” ,然后对给定的十六进制值执行相同usagePage操作。collectionusage

例子:

这是我在 Windows 版本上拆分我进入的数据和数组时所做的事情。第一个items[1-6]是 1 位,items[7]是2 位,items[7-10]是 16 位,依此类推。

同样,由于 WebHID 不会针对每个项目公开“使用情况”,因此每个项目映射到的传感器/按钮仍然未知。至少在单独测试每个简单的测试之外,这在如此复杂的设备上很难做到。

更新 3:

事实证明,我的用例并不需要WebHID API(从我的数字化仪获取传感器输入)。看起来PointerEventMouseEvent属性可以满足我的需求。(真的,实际上应该先看看那个(;一_一))至少,我学会了一些如何使用WebHID API。

0 投票
1 回答
1616 浏览

python - 使用 Python 从 USB RFID 阅读器读取数据

我正在尝试使用 Python 脚本从 USB RFID 阅读器读取数据。使用手机上的 NFC 工具将数据写入 RFID 标签。因此,当我在 RFID 阅读器上扫描 RFID 标签时,Python 脚本应该显示我写入 RFID 标签的数据。

例如,我在 RFID 标签中写入一个字符串“123456”。

我希望它显示字符串。

我参考本指南来阅读 RFID 阅读器:https ://github.com/charlysan/pyrfidhid

但这不起作用。我认为它不起作用,因为脚本用于不同的阅读器模型。我尝试使用这些命令在我的 Linux 上查找 RFID 阅读器信息。

须藤 lsusb

须藤 lsusb -vd ffff:0035

须藤树/开发/输入

但是这个命令sudo tree /dev/input没有显示任何与我的 RFID 阅读器相关的设备。

硬件:

  • USB RFID 阅读器 EM4100
  • RFID 贴纸 NXP MIFARE Ultralight (Ultralight C)

据我了解,USB 应该用作 Python 中的串行库,但阅读器充当 HID 设备。所以我尝试使用这个命令安装 Python 库。

须藤 pip 安装隐藏

任何人都知道如何制作 Python 脚本或任何可能相关的指南?我已经在作者的 GitHub 上打开了这个问题:https ://github.com/charlysan/pyrfidhid/issues/8

谢谢。

0 投票
0 回答
67 浏览

python - 使用python从usb hid设备读取

我正在尝试使用python pywinusb从usbhid设备读取数据,我无法从设备读取数据,从wireshark捕获数据包我得到set_idle_request作为第一个hid,我们如何远程唤醒设备这样我们就可以从设备中获取数据。

任何建议,都会很有帮助。

0 投票
1 回答
104 浏览

usb - 带有 MSP430 USB API 的 USB-HID 游戏手柄 - 描述符问题

我正在尝试使用具有 7-14 个模拟输入的 MSP430 模拟 USB-HID 游戏手柄/控制器,但我无法为我的自定义 USB-HID 设备获取正确的描述符。

我在网上看到了这段代码:https ://github.com/TI-FIRST/MSP430-Gamepad ,它非常适合让 MSP430 启动并作为只有 8 个模拟输入的游戏手柄运行。

main.c 文件包含更改报告结构的说明:

  • 此示例用作主机上的游戏手柄。游戏手柄具有 HID 报告,如中所述
  • descriptors.c 中的 report_desc_HID0 变量。请注意,如果此报告结构是
  • 更改然后需要更新以下长度 -
    1. #define report_desc_size_HID0 in descriptors.h 需要更新为描述符大小
    1. report_desc_size 和 report_len_input 不需要在 descriptors.c 中更新
  • 因为这个演示将枚举 18 字节的输入报告和 2 字节的输出报告
  • USB_gamepad.h 中描述的游戏手柄的输入和输出报告结构
  • 输入报告用于报告 ADC 值和按钮 (GPIO) 的状态
  • 输出报告用于设置/重置指标(GPIO)

descriptors.c 文件中当前的描述符是:

我想将其更改为 14 个 16 位模拟输入,如下所示:

但是,我无法弄清楚如何计算描述符的长度/大小/字节。我尝试通过 USB-HID 规范(HID 1.11 的设备类定义 | USB-IF),其中指出项目具有字节前缀,但我无法真正弄清楚要计算哪些项目以及它们如何相加。抱歉,我对 USB 非常缺乏经验。

是否有人能够查看代码,并让我知道我需要在描述符文件中的 report_desc_size、report_len_input 中需要哪些值,以及我需要更改的任何其他内容,以扩展此代码的 14 个 16 位模拟输入的功能。

PS 要复制并查看正常工作的游戏手柄,只需将代码上传到开发工具包并在 Windows 上搜索“设置 USB 游戏控制器”,如果一切正常并且报告被接受,它应该将其识别为游戏手柄。

0 投票
0 回答
31 浏览

java - 为什么从 USB 读取会阻止我的 Android 应用程序?

我需要使用 USB 条形码扫描仪读取条形码,扫描仪配置为我们 USB Hid。对于通信,我使用https://github.com/benlypan/UsbHid 阅读有效,但问题是如果我连接到设备应用程序被阻止。与设备的连接是在 Thread 中建立的,但无论如何它都会阻塞。线程在服务中运行。

我解决了这样的问题

在后台图书馆使用

我尝试阅读,如果遇到超时,我会等待 1000 毫秒并再次阅读,这是可行的,但我认为应该有可能以更好的方式做到这一点。

有没有办法在不阻塞整个应用程序的情况下阅读?

谢谢

0 投票
0 回答
135 浏览

usb - 编写 USB 自定义 HID 报告描述符

我需要使用 stm32 制作一个小型 USB 设备。我认为这很容易,但事实并非如此。

我从网上实现了一些示例,包括鼠标(使用两个电位计操纵杆)、键盘(不是只有 LED 的按键)和来自 github 的一些其他片段。但我完全误解了报告描述符是如何形成的。

我需要在 pc 和设备之间进行通信,其中 pc 向设备发送 1 位,设备发回 8 或 32 位数字(来自 ADC 的值)和一位变量。

现在我有这个代码:

此代码允许我闪烁板上的 LED。但是当我尝试更改 USAGE_MINIMUM、USAGE_MAXIMUM、REPORT_SIZE 或 REPORT_COUNT 中的任何数字时,电脑无法识别设备,它会写入 Code:10。当我尝试删除一个 OUTPUT 部分时也会发生同样的情况。