Интерпретация вывода Python HIDAPI

Я хотел бы прочитать строку со сканера USB HID с Python на OS X. Приведенный ниже пример является моей отправной точкой, и я смог адаптировать код для своего сканера: я смог выполнить команду: 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. Почему 64 выбрано для h.read ()?

    d = h.read (64)

Когда 64 заменяется на число от 1,2,3...8, количество элементов в списке одинаково. 9 или более результатов список из 8 элементов.

  1. Почему переменная 'd' является выходным списком из 8 элементов? (8 нигде не указано)

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

  2. Что представляет собой каждый распечатанный список вывода? 1 печатный символ?

  3. Что каждый столбец в списке вывода представляет \ кодировать?

  4. Есть ли опубликованные таблицы, которые отображают цифры на клавиатуре?

Я с нетерпением жду ответов: если у вас есть опыт использования HIDAPI (особенно с Python), укажите это в своем ответе. Введите двойной бонусный раунд для опыта HID сканера

2 ответа

HIDAPI (это то, что использует Python) не извлекает дескрипторы, что вам нужно для анализа входящих данных. Что вам нужно, так это способ сбросить и декодировать эти дескрипторы:https://github.com/todbot/mac-hid-dumphttps://eleccelerator.com/usbdescreqparser/

Вам необходимо прочитать и понять спецификации USB HID.

Спрятанные спецификации

Нажмите кнопку поиска и посмотрите документы. Это наиболее важно: "Определение класса устройства для HID 1.11". См. Также документы "Страница использования".

Каждое устройство отправляет HID-дескриптор, который точно описывает каждый бит в отчете. Таким образом, для интерпретации отчета ваш код может либо проанализировать дескриптор (api), либо вы можете вручную назначить байты / биты для структуры (не рекомендуется, поскольку это работает только для хорошо известных устройств).

Другие вопросы по тегам