Lector Códigos de barras / Magnético / RFID con Openwrt

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.

  1. Si el valor de barcode es igual al valor de la variable administrador entonces limpiará el terminal con el comando clear.
  2. Luego mostrará en pantalla con un print el mensaje “Bienvenido Administrador“.
  3. Después imprimirá el valor recibido de la variable barcode.
  4. Ejecutará de nuevo el script lector2.py para volver a escuchar algún nuevo valor.
  5. 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

2 comentarios en “Lector Códigos de barras / Magnético / RFID con Openwrt

  1. 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.

  2. 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. 😃

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

9 + 1 =