Saltar al contenido

¿Cómo puedo obtener una cadena de un dispositivo HID en Python con evdev?

Nuestro team de trabajo ha estado horas buscando para darle solución a tu duda, te dejamos la soluciones y nuestro deseo es serte de mucha ayuda.

Hay un paso de conversión que te falta aquí. Tu salida ya está en un formato bonito, así que te ayudaré a desglosarla un poco más:

             Timestamp        , scancode, keycode, keystate
key event at 1383327570.147000, 2         (KEY_1), down
key event at 1383327570.147990, 2         (KEY_1), up

Para que esto tenga algún sentido útil, debe hacer un par de cosas:

  1. Solo escuche eventos de tipo key_down por filtro solo para el estado clave de un tipo específico (Abajo = 1, Arriba = 0)
  2. Convierta el código de escaneo en un código ASCII, que puede variar según el dispositivo y según la forma en que se asigna al sistema.

Sin embargo, hay una forma sencilla de mapearlos. Genere un código de barras conocido con todos los caracteres utilizables utilizando un servicio en línea, luego escanee ese código de barras y asigne cada código de escaneo generado a la letra / número correcto para su escáner. Puede utilizar el siguiente fragmento de código ligeramente modificado para tener un mejor control de la salida:

import evdev
from evdev import InputDevice, categorize  # import * is evil :)
dev = InputDevice('/dev/input/event1')

# Provided as an example taken from my own keyboard attached to a Centos 6 box:
scancodes = 
    # Scancode: ASCIICode
    0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 9: u'8',
    10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R',
    20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'[', 27: u']', 28: u'CRLF', 29: u'LCTRL',
    30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u';',
    40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\', 44: u'Z', 45: u'X', 46: u'C', 47: u'V', 48: u'B', 49: u'N',
    50: u'M', 51: u',', 52: u'.', 53: u'/', 54: u'RSHFT', 56: u'LALT', 100: u'RALT'

for event in dev.read_loop():
    if event.type == evdev.ecodes.EV_KEY:
        data = evdev.categorize(event)  # Save the event temporarily to introspect it
        if data.keystate == 1:  # Down events only
            key_lookup = scancodes.get(data.scancode) or u'UNKNOWN:'.format(data.scancode)  # Lookup or return UNKNOWN:XX
            print u'You Pressed the  key!'.format(key_lookup)  # Print it all out!

Aquí hay una salida de muestra de este script para mí

You Pressed the A key!
You Pressed the B key!
You Pressed the C key!
You Pressed the UNKNOWN:99 key!

Una vez que genere algunos códigos de barras en línea, ¡sabrá qué código de escaneo se asigna a qué valor! ¡Construye tu propia mesa y benefíciate!

HTH

El código de VooDooNOFX fue de gran ayuda y me dio una patada en la dirección correcta. Quería responder mi propia pregunta para agregar claridad para cualquier otra persona que intente conectar un Honeywell MS7580 o un escáner óptico similar con emulación de teclado con Python en Linux.

Este proyecto se realizó usando un BeagleBone Black donde solo tenía acceso a la línea de comandos y, por lo tanto, no podía usar el escáner como un teclado normal. Para procesar los cambios correctamente, tuve que agregar un segundo grupo de códigos de escaneo para cuando se presionó el botón de cambio. Aquí está mi código final para leer un string desde un código QR:

import evdev
from evdev import InputDevice, categorize, ecodes  
dev = InputDevice('/dev/input/event1')

# Provided as an example taken from my own keyboard attached to a Centos 6 box:
scancodes = 
    # Scancode: ASCIICode
    0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 9: u'8',
    10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'q', 17: u'w', 18: u'e', 19: u'r',
    20: u't', 21: u'y', 22: u'u', 23: u'i', 24: u'o', 25: u'p', 26: u'[', 27: u']', 28: u'CRLF', 29: u'LCTRL',
    30: u'a', 31: u's', 32: u'd', 33: u'f', 34: u'g', 35: u'h', 36: u'j', 37: u'k', 38: u'l', 39: u';',
    40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\', 44: u'z', 45: u'x', 46: u'c', 47: u'v', 48: u'b', 49: u'n',
    50: u'm', 51: u',', 52: u'.', 53: u'/', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'


capscodes = 
    0: None, 1: u'ESC', 2: u'!', 3: u'@', 4: u'#', 5: u'$', 6: u'%', 7: u'^', 8: u'&', 9: u'*',
    10: u'(', 11: u')', 12: u'_', 13: u'+', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R',
    20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'', 27: u'', 28: u'CRLF', 29: u'LCTRL',
    30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u':',
    40: u''', 41: u'~', 42: u'LSHFT', 43: u'
#setup vars
x = ''
caps = False

#grab provides exclusive access to the device
dev.grab()

#loop
for event in dev.read_loop():
    if event.type == ecodes.EV_KEY:
        data = categorize(event)  # Save the event temporarily to introspect it
        if data.scancode == 42:
            if data.keystate == 1:
                caps = True
            if data.keystate == 0:
                caps = False
        if data.keystate == 1:  # Down events only
            if caps:
                key_lookup = u''.format(capscodes.get(data.scancode)) or u'UNKNOWN:[]'.format(data.scancode)  # Lookup or return UNKNOWN:XX
            else:
                key_lookup = u''.format(scancodes.get(data.scancode)) or u'UNKNOWN:[]'.format(data.scancode)  # Lookup or return UNKNOWN:XX
            if (data.scancode != 42) and (data.scancode != 28):
                x += key_lookup  
            if(data.scancode == 28):
                print x          # Print it all out!
                x = ''

Muchas gracias a VooDoo por señalarme en la dirección correcta con evdev.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *