Archivo de la etiqueta: rfid

Pymaldi: Accediendo a los lectores Kimaldi desde Python

Mi amigo David y yo estamos desarrollando una aplicación para el control de acceso a instalaciones, y la gestión de turnos de trabajo. Básicamente se trata de que cada trabajador tenga una tarjeta RFID con sus datos y foto, y que esa tarjeta la sirva para entrar a las instalaciones abriendo las barreras, para abrir puertas, para picar el comienzo de su jornada laboral, para poder comer en el comedor, etc… En fin, muchas cosas que ya contaré en profundidad cuando la terminemos, y si es que nos proponemos venderla a otros clientes además de para el que inicialmente la estamos haciendo, que será lo más probable, ya que su diseño es totalmente abierto.

El caso es que para implementar nuestra solución optamos por usar lectores de la empresa Kimaldi, concretamente el Biomax2, que tenía muy buena pinta. El problema es que el SDK que provee la empresa es sólo para Windows, así que tuvimos que coger el manual del aparato, mirar el protocolo de comunicaciones para intentar hacernos «algo» y así poder interactuar con él desde cualquier sistema operativo, pero principalmente desde Linux, que es el que nos interesaba.

Aprovechando que había descubierto las cualidades de Python colaborando en el desarrollo del Cherokee-Admin, propuse que usásemos Python. Es un lenguaje que te da muchas facilidades para programar cualquier cosa y es muy portable. Hacer eso en C no nos daría más que dolores de cabeza y mucho más tiempo de programación.

Así que nada, puestos manos a la obra, pensamos que lo mejor sería hacer una librería que intentase emular el comportamiento del componente OCX que proporciona Kimaldi, incluyendo los mismos nombres de funciones de éste. ¿Qué conseguíamos con esto? pues que el que estuviese habituado a ese API tuviese más facilidad para programarlo, ya que nuestra idea era liberar esa librería con algún tipo de licencia de código abierto.

Después de un tiempo de desarrollo inicial y de que todo lo básico funcionase, la liberamos, y está disponible en la página del proyecto Pymaldi en Google Code. Desde entonces hemos ido añadiendo nuevos métodos y hemos mejorado algunas cosas.

La librería funciona en base a eventos, es decir, el programa que usa la librería puede enviarle comandos al lector en plan: «pon esto en el display», «activa el relé 1 durante 2 décimas de segundo», etc… pero además puede recibir eventos que se produzcan en el lector, como cuando una tarjeta se pasa por él, cuando se pulsa una tecla del teclado, cuando se reinicia el lector, etc. Todo esto de una forma muy simple, como se puede ver en el ejemplo adjunto:

from pymaldi import Pymaldi

class MyPymaldi (Pymaldi):
    def __init__(self):
        Pymaldi.__init__(self)

    def onReadCard (self, card_id):
        if card_id:
            msg = 'Card ID: %s' % (card_id)
        else:
            msg = 'Error reading card'

        rc = self.WriteDisplay(msg)
        if rc:
            print "ERROR (WriteDisplay): %d" % rc


reader = MyPymaldi()
reader.OpenPortUDP('192.168.2.22')
rc = reader.SetUpBIOMAX2()
if not rc:
    print "BIOMAX2 ready!"
else:
    print "ERROR (SetUpBIOMAX2): %d" % rc
    raise SystemExit

while True:
    try:
        reader.wait_events()
    except KeyboardInterrupt:
        raise SystemExit

Este código lo que haría es conectar con el lector que tiene la IP 192.168.2.22 y se queda a la espera de que pasen una tarjeta por él. En cuanto se pasa una tarjeta, se ejecuta una función que lo que hace es decirle al lector que ponga en el display el texto: «Card ID: » seguido del número de tarjeta. ¿A que es fácil? :-)

Si sólo queremos pintar algo en la pantalla, nada más simple que:

from pymaldi import Pymaldi

class MyPymaldi (Pymaldi):
    def __init__(self):
        Pymaldi.__init__(self)


reader = MyPymaldi()
reader.OpenPortUDP('192.168.2.22')
rc = reader.SetUpBIOMAX2()
if not rc:
    print "BIOMAX2 ready!"
else:
    print "ERROR (SetUpBIOMAX2): %d" % rc
    raise SystemExit

rc = reader.WriteDisplay("Hola SKaRCHa ;)")
if rc:
    print "ERROR (WriteDisplay): %d" % rc

raise SystemExit

Y este sería el resultado:

Biomax2 usándose con Pymaldi

¿Se puede hacer más fácil? :D

Bueno, pues termino ya, que sólo pensaba hacer un comentario para anunciar la liberación de la librería y ha salido una entrada más larga de lo esperado. Si has llegado hasta aquí es porque te interesa la programación y/o el cacharreo, si no, no te entiendo… :D

Librería Pymaldi.