3

我想在 OS X 上使用 Python 从 USB HID 扫描仪读取字符串。下面的示例是我的起点,我已经能够为我的扫描仪定制代码:我已经能够执行命令:h.open () 成功并打印出制造商和产品字符串。扫描代码已通过扫描仪与 EVDEV 进行验证。

挑战在于解释返回的数据并将其映射回 ascii 字符串。

这篇文章提供了 python HIDAPI 示例代码

 from __future__ import print_function

import hid
import time

print("Opening the device")

h = hid.device()
h.open(1118, 2048) # A Microsoft wireless combo keyboard & mouse

print("Manufacturer: %s" % h.get_manufacturer_string())
print("Product: %s" % h.get_product_string())
print("Serial No: %s" % h.get_serial_number_string())

try:
    while True:
        d = h.read(64)
        if d:
            print('read: "{}"'.format(d))
finally:
    print("Closing the device")
    h.close()

$ sudo python try.py输出:

Opening the device
Manufacturer: Microsoft
Product: Microsoft® Nano Transceiver v2.0
Serial No: None
read: "[0, 0, 0, 0, 0, 0, 0, 0]"
read: "[0, 0, 0, 0, 0, 0, 0, 0]"
read: "[0, 0, 0, 0, 0, 0, 0, 0]"

--8<-- snip lots of repeated lines --8<--

read: "[0, 0, 0, 0, 0, 0, 0, 0]"
read: "[0, 0, 0, 0, 0, 0, 0, 0]"
read: "[0, 0, 21, 0, 0, 0, 0, 0]"
read: "[0, 0, 21, 0, 0, 0, 0, 0]"
read: "[0, 0, 21, 0, 0, 0, 0, 0]"
read: "[0, 0, 21, 0, 0, 0, 0, 0]"
read: "[0, 0, 0, 0, 0, 0, 0, 0]"
read: "[0, 0, 4, 0, 0, 0, 0, 0]"
read: "[0, 0, 4, 22, 0, 0, 0, 0]"
read: "[0, 0, 4, 22, 0, 0, 0, 0]"
read: "[0, 0, 4, 22, 0, 0, 0, 0]"
read: "[0, 0, 4, 22, 0, 0, 0, 0]"
read: "[0, 0, 4, 22, 0, 0, 0, 0]"
read: "[0, 0, 4, 0, 0, 0, 0, 0]"
read: "[0, 0, 4, 0, 0, 0, 0, 0]"
read: "[0, 0, 4, 9, 0, 0, 0, 0]"
read: "[0, 0, 4, 9, 0, 0, 0, 0]"
read: "[0, 0, 4, 9, 0, 0, 0, 0]"
read: "[0, 0, 4, 9, 0, 0, 0, 0]"
read: "[0, 0, 4, 9, 7, 0, 0, 0]"
read: "[0, 0, 4, 9, 7, 0, 0, 0]"
read: "[0, 0, 7, 0, 0, 0, 0, 0]"
^Closing the device
Traceback (most recent call last):
  File "try.py", line 17, in <module>
    d = h.read(64)
KeyboardInterrupt

问题

我找不到好的例子(比如用 EVDEV 找到的例子)。任何指向等效项的链接都会非常有帮助。 在没有良好文档的情况下解释输出是一个挑战。 h.read() 返回一个列表

  1. 为什么 h.read() 选择 64?

    d = h.read(64)

当 64 替换为 1,2,3...8 中的数字时,列表中的元素数相同。9 个或更多结果是 8 个元素的列表。

  1. 为什么变量 'd' 是 8 个元素的输出列表?(8 没有在任何地方指定)

    print('read: "{}"'.format(d))

  2. 每个打印的输出列表代表什么?1个打字字符?

  3. 输出列表中的每一列代表什么\encode?

  4. 是否有已发布的表格将数字映射到键盘?

我期待回复:如果您有使用 HIDAPI(尤其是 Python)的经验,请在您的回答中说明这一点。进入双倍奖励回合以获得 HID 扫描仪体验

4

2 回答 2

2

HIDAPI(这是 Python 正在使用的)不检索描述符,这是解析传入数据所需的。您需要的是一种转储和解码这些描述符的方法: https ://github.com/todbot/mac-hid-dump https://eleccelerator.com/usbdescreqparser/

于 2021-03-07T19:50:10.797 回答
1

您需要阅读并理解 USB HID 规范。

隐藏规格

按搜索按钮并查看文档。这是最重要的:“HID 1.11 的设备类定义” 另请参阅“使用页面”文档。

每个设备都会发送一个 HID 描述符,该描述符准确地描述了报告中的每一位。因此,要解释报告,您的代码可以解析描述符 (api),也可以手动将字节/位分配给结构(不推荐,因为它仅适用于知名设备)。

于 2018-10-19T11:58:17.390 回答