Explicaré como poder utilizar cualquiera de los distintos lectores en Openwrt y poder ejecutar diferentes comandos según su valor.
Podríamos utilizar este script para tener un Control de acceso y almacenar los datos en una base de datos, o incluso poder ejecutar cualquier comando en el sistema. Ya sea automatizar tareas de mantenimiento como poner en marcha una copia de seguridad de la red, un escaneo con ARP-SCAN o reiniciar el dispositivo… Los limites lo pones tú.
1. Instalación de paquetes básicos USB y comprobación
2. Instalación python y dependencias
3. Prueba de lectura de datos
4. Ampliando funcionalidades del Script Python
Instalación de paquetes básicos USB y comprobación
Primero instalaremos lo necesario para habilitar el uso de los puertos USB:
opkg update opkg install kmod-usb-hid opkg install kmod-usb2
Una vez instalado vamos a conectar en el puerto USB nuestro lector y luego ejecutaremos el siguiente comando para ver si lo ha detectado y enumerado el sistema:
dmesg
Ahora nos vamos a fijar en el directorio /dev/input/ para comprobar como está nombrado nuestro lector:
ls /dev/input/
En mi caso aparece /dev/input/event0, será por el cual recibiremos la información desde el lector.
Instalación python y dependencias
Instalaremos Python y dependencias ya que mediante este, ejecutaremos nuestro script y así poder hacer una lectura directa desde el dispositivo lector:
opkg install python opkg install python-evdev
Crearemos el archivo lector.py y le pegaremos el código Python:
#!/usr/bin/env python from evdev import InputDevice, ecodes, list_devices from select import select keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX" dev = InputDevice("/dev/input/event0") barcode = "" while True: r,w,x = select([dev], [], []) for event in dev.read(): if event.type == 1 and event.value == 1: barcode += (keys[event.code]) if (len (barcode)) > 20: break print barcode
- Si nos fijamos en la linea nº7, tengo: /dev/input/event0, tendrás que cambiarlo en el caso de que tengas otro eventX.
- La linea nº16, tenemos la max longitud de la cadena recibida 20 la cual podremos aumentarla o disminuirla y así mostrar la parte de la cadena que queramos. En mi caso la he puesto en 20, ya que quiero que me muestre la cadena completa.
Brevemente explicado el programa Python: Lo que hará es leer el valor recibido y mostrarlo con un print después de haber hecho un break y así parar el while. En resumen: Leera una sola vez el resultado y parará el script.
Prueba de lectura de datos
Para hacer la prueba he creado e impreso 3 códigos de barras generados desde la página web: https://www.barcodesinc.com/generator/index.php
Para hacer la prueba tenemos que ejecutar:
python lector.py
Y ahora escanearemos nuestro código de barras:
Y como podrás ver, me ha devuelto el valor recibido desde el lector.😃
Ampliando funcionalidades del Script Python
En este otro ejemplo le he puesto dos variables, he importado OS para así poder ejecutar comandos shell directamente desde el programa Python y agregado otra condicion (IF ELIF ELSE). Ya que dependiendo el valor recibido ejecutará un comando u otro.
Crearemos el archivo lector2.py y le pegaremos el código Python:
#!/usr/bin/env python administrador = "X6275982140004750418XX" empleado1 = "X6275982140004736094XX" import os from evdev import InputDevice, ecodes, list_devices from select import select keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX" dev = InputDevice("/dev/input/event0") barcode = "" while True: r,w,x = select([dev], [], []) for event in dev.read(): if event.type == 1 and event.value == 1: barcode += (keys[event.code]) if (len (barcode)) > 20: if barcode == administrador: os.system('clear') print "" print "Bienvenido Administrador" print barcode os.system('python lector2.py') os.system('./BackupAdministrador') elif barcode == empleado1: print "" print "Bienvenido empleado1" print barcode os.system('python lector2.py') else: print "" print "Credencial no valida, contacte con el administrador" print barcode break
Como vemos en la linea nº 3-4 , hemos creado y declarado dos variables una con el nombre administrador y otra con el nombre empleado1.
Luego a partir de la linea nº23 empiezan las condiciones que he añadido, las cuales les he puesto un valor diferente para poder ejecutar un comando que no sea igual a otro y así se entienda mejor el funcionamiento.
- Si el valor de barcode es igual al valor de la variable administrador entonces limpiará el terminal con el comando clear.
- Luego mostrará en pantalla con un print el mensaje “Bienvenido Administrador“.
- Después imprimirá el valor recibido de la variable barcode.
- Ejecutará de nuevo el script lector2.py para volver a escuchar algún nuevo valor.
- Finalizará con os.system(‘./BackupAdministrador‘) ya que ejecutará mi backup.
Ahora por supuesto, nos queda imaginar que tantas cosas podemos hacer con esto. Y recuerda, los limites los pones tú.
Fuentes:
https://stackoverflow.com/questions/21648595/python-evdev-and-bar-code-scanner/27913707#27913707
Veo que con InputDevice(“/dev/input/event0”) puedes controlar otros dispositivos con conexión usb (gamepads, teclados y otros). Me gusta. Felicidades por el post.
Gracias! Tengo en mente probar un Gamepad por usb y un juego mediante NodeJS desde el propio router. Vamos a ver que tal se va dando la idea. 😃