HID vonalkódolvasó kimenet szűrése

Fórumok

Sziasztok!

Van egy HID alapú ostoba* vonalkódolvasóm amivel termékeken lévő QR kódokban lévő szériaszámokat kellene becsippantani különböző főleg webes alkalmazásokba (köztük Excel online).

A dologgal két probléma van: egyrészt a szériaszámon kívül egyéb adatokat is tartalmaz a vonalkód, másrészt a szériaszámok formátuma változó. Ezekre már kiszoptam egy zsák regexpet, ami random QR kódot szériaszámmá alakít.

Arra keresek megoldást Linux alá, hogy egy adott HID billentyűzet kimenetét hogyan lehetne "elétéríteni" úgy, hogy a bejövő billentyűeseményeket globálisan csak egy programnak továbbítsa. (Billentyűleütéseket meg majd tudok szimulálni a programomból.)

 

*Nyilván ha át lehetne lőni CDC-re a fejem sem fájna, de nem lehet.

Hozzászólások

Üdv a klubban... épp itt van előttem két eszköz (Unitech EA510 és EA630), épp a cigimet szívom az asztalnál (elektromos) és agyalok, hogy az egyik a böngészőben küld keyboard.PASTE event-et, míg a másik csak KEYDOWN-t, amit "mérni" kell, hogy ha 50ms-on belül jött új adat, akkor az nem humán gomblenyomás...

Eddig az körvonalazódik, hogy az xinput float <id> paranccsal le lehet választani az olvasót, aztán már csak ki kellene találni, hogy hogyan lehet valami userspace apit taknyolni ami ettől még elkapja az eventeket.

floated olvasó esetén a /dev/input/event<x>-en jönnek fel az eventek, ezt lehet szépen parsolni, bár nyilván a kisbetűket shifttel küldik meg ilyenek...

Következőne egy udevszabályt kell kokeszolni, ami csak az USB-s olvasóra cuppan rá.

KERNEL=="event*", SUBSYSTEM=="input",  ENV{ID_VENDOR_ID}=="060e", ENV{ID_MODEL_ID}=="16c1", RUN+="/usr/bin/setfacl -m u:mm:rw ENV{DEVNAME}" 

Az udevszabály ami ad az mm usernek jogot. (Eddig minden USB-s cuccnál ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374d" módon jártam el, na itt így nem kell)
 

Na megvan a dupla event oka: key press és release eventeket küld.

A hijack részével meg is vagyok, most az XLib-el küzdök, hogy tudjak billentyű leütéseket szimulálni.

A karakterekből->keycode konverziót a XKeysymToKeycode-al sikeresen megoldottam viszont így csak kisbetűk jönnek vissza (illetve a speckó karakterek helyett a modifier nélküliek).

Próbáltam az XkbKeysymToModifiers-t is, viszont az csak 0-kat ad vissza a nagybetűs keysymekre is.

Jelentem pont most lett megbaszatva!

Az input hijack mint írtam egész egyszerű volt, de az X11 API-val szoptam most egy csomót.

A lényeg, hogy kifelé csak keycode-ot lehet küldeni ami kvázi billentyűnek felel meg.

Az XGetKeyboardMapping megmondja, hogy egy adott keycode-hoz milyen keysymek felelnek meg (keysim == amiket egy adott layouton egy billentyűvel le tudsz ütni)

Ez visszaad egy tömböt ami ez alapján: https://lists.x.org/archives/xorg/2005-November/010867.html sorban van megadva a nincs modifier, shift, altg, és altgr+shift-re.

Na innentől már csak be ki kell küldeni a gombnyomás szimulálása előtt a megfelelő módosító billentyűt és kész is vagyunk.

Ebből most egy system trayre kiülő app lett aminél egy checkboxxal lehet kapcsolni a szériaszámra szűrés és raw mód között, de lehet átkokeszolom úgy, hogy lehessen "filtereket" definiálni az UI-on keresztül egy marék regexppel és így lehessen a trayen váltani. Ez még lehet nekem is jól jön majd ha egyszer partnumbereket kell csipogni vagy bármi mást.