C 检测USB HID设备何时模拟键盘的可靠方法

C 检测USB HID设备何时模拟键盘的可靠方法,c,embedded,usb,hid,C,Embedded,Usb,Hid,我正在使用嵌入式系统,我需要确定用户是否连接了模拟键盘(即条形码扫描仪)的HID设备或实际键盘 我可以检查iManufacturer、iProduct、iSerialNumber和iInterface字符串描述符以获得一些线索。例如,在连接条形码阅读器时,观察到“reader”或“scanner”出现在IPProduct字符串中。同样,在iInterface字符串中也可以看到“仿真”。然而,我有点不愿意仅仅依靠这些字符串(字符串大小写很容易处理,但处理诸如关键字/短语中的缩写之类的事情很快就会变

我正在使用嵌入式系统,我需要确定用户是否连接了模拟键盘(即条形码扫描仪)的HID设备或实际键盘

我可以检查iManufacturer、iProduct、iSerialNumber和iInterface字符串描述符以获得一些线索。例如,在连接条形码阅读器时,观察到“reader”或“scanner”出现在IPProduct字符串中。同样,在iInterface字符串中也可以看到“仿真”。然而,我有点不愿意仅仅依靠这些字符串(字符串大小写很容易处理,但处理诸如关键字/短语中的缩写之类的事情很快就会变得繁重。)

我查看了USB1.10和1.11规范,发现报告描述符也提供了一些线索。例如,对于通用桌面,全局使用项应该类似于0x0501,而本地使用项应该是0x0906(键盘)。报告描述符中是否还有其他东西可以帮助检测差异


我希望避免依赖供应商ID和产品ID列表,因为这是一个资源有限的嵌入式系统。建议?有什么我遗漏的吗?

没有绝对可靠的方法可以做到这一点。这是不可能的,因为没有关于什么是键盘或什么不是键盘的绝对定义,也没有关于“模拟键盘”和“作为键盘”之间的区别的绝对定义。在辅助设备和诸如和弦键盘之类的东西上,界限变得特别模糊,但除此之外,你还有一个根本问题,即模拟键盘的方法是以键盘通信的方式通过USB电缆进行通信


您建议的方法是合理的启发式方法,用于识别一些明显不是键盘的东西(在某些情况下有轻微的误报风险),但寻找提示的启发式方法是可能的最佳解决方案。

没有绝对可靠的方法来做到这一点。这是不可能的,因为没有关于什么是键盘或什么不是键盘的绝对定义,也没有关于“模拟键盘”和“作为键盘”之间的区别的绝对定义。在辅助设备和诸如和弦键盘之类的东西上,界限变得特别模糊,但除此之外,你还有一个根本问题,即模拟键盘的方法是以键盘通信的方式通过USB电缆进行通信


您建议的方法是合理的启发式方法,用于识别一些明显不是键盘的东西(在某些情况下有轻微的误报风险),但是,寻找提示的启发式是可能的最佳解决方案。

你有没有看一下Linux是如何处理类似的问题的?我不认为Linux需要消除键盘和假装键盘的东西之间的歧义。你有没有看一下Linux是如何处理类似的问题的?我不相信Linux需要消除键盘和假装键盘的东西之间的歧义。我完全同意。我的问题是为了找到一个更有力的解决方案而做的最后努力。谢谢我完全同意。我的问题是为了找到一个更有力的解决方案而做的最后努力。谢谢