LINUX.ORG.RU

Переделать «клавиатуру» во что-то ещё и ловить её ввод отдельно

 ,


0

2

Вот такая штука.

Прикидывается клавиатурой и при считывании карточки просто выплёвывает её номер как будто его на клавиатуре набрали.

Надо как-то убрать этот ввод скажем в файл.

Идеи? Логика подсказывает мне смотреть в сторону udev, но куда я бегло нагуглить не смог.

PS. Есть ПО для настройки из под windows, но оно только формат ввода переключает, ожидал, что можно будет заставить устройство прикидываться com портом, увы нет.


в логе при подключении выглядит так

usb 3-1: new full-speed USB device number 3 using uhci_hcd
usb 3-1: New USB device found, idVendor=ffff, idProduct=0035, bcdDevice= 0.01
usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 3-1: Product: USB Reader
usb 3-1: Manufacturer: USB Reader
usb 3-1: SerialNumber: SN201706VER1
input: USB Reader USB Reader as /devices/pci0000:00/0000:00:05.1/usb3/3-1/3-1:1.0/0003:FFFF:0035.0003/input/input9
hid-generic 0003:FFFF:0035.0003: input,hidraw1: USB HID v1.10 Keyboard [USB Reader USB Reader] on usb-0000:00:05.1-1/input0
★★

На компе что, иксы? Или чистая консоль?

Если иксы - могу только предложить добавить данный девайс(по VID/PID) в исключение в конфиг иксов(гуглить в сторону секций Match* и опции Ignore).

А уже потом какой-нибудь консольной тулзой цепляться к этому HID-устройству и забирать выхлоп с него.

Есть ли такая удобная тулза в природе готовая - хз.

Можно начать с этого

В идеале конечно хотелось бы глобально отцепить ввод/вывод с этого устройства по умолчанию, но боюсь тогда и все эти юзерспейсные либы сломаются.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)
Ответ на: комментарий от Pinkbyte

Да, иксы.

Если иксы - могу только предложить добавить данный девайс(по VID/PID) в исключение в конфиг иксов(гуглить в сторону секций Match* и опции Ignore).

Натыкался на это решение. Но отбросил т.к. оно показалось мне крайне костыльным.
Вернусь к нему, если ни чего ещё в голову не придёт.

Flotsky ★★
() автор топика
Ответ на: комментарий от Pinkbyte

Сделал в custom udev rule

# cat /etc/udev/rules.d/99-custom.rules
SUBSYSTEMS=="input", ATTRS{name}=="USB Reader USB Reader", MODE="0660", GROUP="root", TAG=""

И перезагрузился.

Теперь событий от считывателя в иксах не получаю.

При этом могу сделать cat /dev/input/event3 и увидеть что там передаётся.
Не удобно, теперь нет нормальной возможности понять какой event был назначен устройству.

Приспособил python скрипт отсюда, смог увидеть что мне там передаётся в привычном виде.

Не могу донастроить udev чтобы он создавал привычный /dev/input/by-id/...

Flotsky ★★
() автор топика
Ответ на: комментарий от usi_svobodi

Может и поможет, но всё что я пытался перебрать не работает.

SUBSYSTEMS=="input", ATTRS{name}=="USB Reader USB Reader", SYMLINK+="input/ffff_0035_USB_Reader"

KERNEL=="event*", ATTRS{idVendor}=="ffff", ATTRS{idProduct}=="0035", SYMLINK+="input/ffff_0035_USB_Reader"

Оба приводят к segfault вместо результата.

Flotsky ★★
() автор топика
Ответ на: комментарий от usi_svobodi

из
udevadm info --attribute-walk --path=$(udevadm info --query=path --name=/dev/input/event3)

Правило выше, где я TAG="" работает и использует атрибуты родительских устройств, поэтому я пытаюсь их же использовать.

Думаю мне всё-же нужно KERNEL=="event*", ATTRS{idVendor}=="ffff", ATTRS{idProduct}=="0035", SYMLINK+="input/ffff_0035_USB_Reader" т.к. этот блок я стащил и немного подправил из /usr/lib/udev/rules.d/60-persistent-input.rule
Но в виде как у меня это правило приводит к segfault при перезагрузке правил или просто не работает без segfault если сделать reboot

# udevadm info --attribute-walk --path=$(udevadm info --query=path --name=/dev/input/event3)

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:05.1/usb3/3-1/3-1:1.0/0003:FFFF:0035.0002/input/input4/event3':
    KERNEL=="event3"
    SUBSYSTEM=="input"
    DRIVER==""
    ATTR{power/control}=="auto"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:05.1/usb3/3-1/3-1:1.0/0003:FFFF:0035.0002/input/input4':
    KERNELS=="input4"
    SUBSYSTEMS=="input"
    DRIVERS==""
    ATTRS{capabilities/abs}=="0"
    ATTRS{capabilities/ev}=="120013"
    ATTRS{capabilities/ff}=="0"
    ATTRS{capabilities/key}=="1000000000007 ff980000000007ff febeffdfffefffff fffffffffffffffe"
    ATTRS{capabilities/led}=="1f"
    ATTRS{capabilities/msc}=="10"
    ATTRS{capabilities/rel}=="0"
    ATTRS{capabilities/snd}=="0"
    ATTRS{capabilities/sw}=="0"
    ATTRS{id/bustype}=="0003"
    ATTRS{id/product}=="0035"
    ATTRS{id/vendor}=="ffff"
    ATTRS{id/version}=="0110"
    ATTRS{inhibited}=="0"
    ATTRS{name}=="USB Reader USB Reader"
    ATTRS{phys}=="usb-0000:00:05.1-1/input0"
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_time}=="0"
    ATTRS{power/runtime_status}=="unsupported"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{properties}=="0"
    ATTRS{uniq}=="SN201706VER1"

  looking at parent device '/devices/pci0000:00/0000:00:05.1/usb3/3-1/3-1:1.0/0003:FFFF:0035.0002':
    KERNELS=="0003:FFFF:0035.0002"
    SUBSYSTEMS=="hid"
    DRIVERS=="hid-generic"
    ATTRS{country}=="00"
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_time}=="0"
    ATTRS{power/runtime_status}=="unsupported"
    ATTRS{power/runtime_suspended_time}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:05.1/usb3/3-1/3-1:1.0':
    KERNELS=="3-1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbhid"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="01"
    ATTRS{bInterfaceSubClass}=="01"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{interface}=="USB Keyboard"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:05.1/usb3/3-1':
    KERNELS=="3-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="200mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 2"
    ATTRS{bcdDevice}=="0001"
    ATTRS{bmAttributes}=="80"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="2"
    ATTRS{devpath}=="1"
    ATTRS{idProduct}=="0035"
    ATTRS{idVendor}=="ffff"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="USB Reader"
    ATTRS{maxchild}=="0"
    ATTRS{power/active_duration}=="1490660"
    ATTRS{power/autosuspend}=="2"
    ATTRS{power/autosuspend_delay_ms}=="2000"
    ATTRS{power/connected_duration}=="1490660"
    ATTRS{power/control}=="on"
    ATTRS{power/level}=="on"
    ATTRS{power/persist}=="1"
    ATTRS{power/runtime_active_time}=="1490266"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{product}=="USB Reader"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{remove}=="(not readable)"
    ATTRS{rx_lanes}=="1"
    ATTRS{serial}=="SN201706VER1"
    ATTRS{speed}=="12"
    ATTRS{tx_lanes}=="1"
    ATTRS{urbnum}=="17"
    ATTRS{version}==" 1.10"

... дальше обрезал (сообщение не влезает, там уже usb контроллер)

Flotsky ★★
() автор топика
Последнее исправление: Flotsky (всего исправлений: 1)

Вообще вопрос крайне интересный, в более общем плане. А именно, как заставить систему (хоть иксы, хоть нет) перестать считать клавиатурой всё подряд, что о себе так заявило, а доверять только заранее указанному порту в этом плане.

firkax ★★★★★
()
Ответ на: комментарий от Pinkbyte

Если иксы - могу только предложить добавить данный девайс(по VID/PID) в исключение в конфиг иксов(гуглить в сторону секций Match* и опции Ignore).

А уже потом какой-нибудь консольной тулзой цепляться к этому HID-устройству и забирать выхлоп с него.

Первое действие — абсолютно лишнее, надо сразу открывать /dev/input/... с grab’ом.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Я правильно Вас понял?

Откатываю свои udev правила, делаю cat /dev/input/evdev5(потом заменить на что-то способное работать с этим форматом)

И события нажатия клавиш от этого устройства не падают в иксы?

Flotsky ★★
() автор топика
Ответ на: комментарий от t184256

evtest --grab

О, спасибо за наводку. Получилось простым python кодом

from evdev import InputDevice, categorize, ecodes
dev = InputDevice('/dev/input/by-id/usb-USB_Reader_USB_Reader_SN201706VER1-event-kbd')
dev.grab()

И далее код из последнего комментария

И теперь оно работает как хочется. Далее мне только доработать python код.

Flotsky ★★
() автор топика
20 октября 2022 г.
Ответ на: комментарий от banox

Программа для проверки чего? Тут речь шла скорее о перехвате нажатий, не о проверке чего-либо.

передать

Нечего передавать, не уверен что вам необходимо. Но, если вы вчитаетесь в последние две ссылки из комментариев выше, то возможно найдёте что-то почти готовое.
Ну или в job

Flotsky ★★
() автор топика