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.

8 comentarios en “Pymaldi: Accediendo a los lectores Kimaldi desde Python

  1. Sinpapeles

    /*Inicio comentario friqui */
    Ta chulo, pero lo de Phyton no acabo de verlo, nunca he acabado ver Phyton cuando se sale de lo que verdaderamente es un script … ¿por qué no usar Java?, incluso montar una capa de servicios (SOAP por ejemplo que se hace «con la punta del calé») que controlen todo el cacharreo y asi abstraes todo el HW de la aplicación de gestión
    /*Fin comentario friqui */

    PD.- Sabado noche … me tienen castigao viendo «la copla» … pos a ver me diras tu que escribo …

  2. SKaRCHa Autor

    ¡¡Aaarrggghhh!! ¡Con la Iglesia has topado! :) Has pronunciado la palabra prohibida… ¡Java! :D

    Ahora en serio. Partiendo de la base de que ni David ni yo pasamos de un «Hola Mundo» en Java, está el asunto de que ni siquiera nos interesa… no nos gusta el lenguaje, así que está descartado. :-) Además, queríamos un lenguaje que sea portable de verdad… y que se pueda usar en sistemas embebidos con facilidad… haz eso con Java.

    Respecto a Python te voy a decir lo que me dirás tú a mi sobre Java: «dale una oportunidad» :-) Es un gran lenguaje que vale para «algo» más que para hacer scripts.

    Y ahora hablando de la «arquitectura», te diré que el módulo en Python que hemos hecho al final hace lo mismo que propones: abstraer el hardware, y acepta órdenes de la aplicación por un puerto TCP. Lo de hacerlo por SOAP está muy bien, pero para nuestro caso no hace montar tanto… con un protocolo simple nos valía. De todas formas, siempre se puede implementar. :-)

    Gracias por el comentario, wirinai! :)

    PD: Sábado noche y con una niña en el mundo… ¿dónde crees que voy a estar? ofufuf!

  3. Sinpapeles

    Jeje, creia que la palabra prohibida era Windows! Le daremos pues una oportunidad a Python que no Phyton (tengo la mania de escribirlo así), pero es que tengo un trauma desde chico con los lenguajes interpretados … nuca pude hacer nada grafico decente con mi MSX por culpa de su Basic interpretado …

    Pero vamos que los desarrollos hechos con el innombrable y Eclipse son faciles y de hacer y lo que es mejor facilisimos de mantener, y ya para los gurús , porque yo en esto de la programación me he quedado mas que obsoleto, entiendo que el uso de los pedazo de frameworks que hay por ahí hace que hagan aplicaciones como churros.

  4. SKaRCHa Autor

    Bueno, Windows también es una palabra prohibida… :D

    Respecto a hacer nada gráfico, pues hombre… evidentemente no te vas a poner a programar un juego tipo Quake con Python; cada cosa para lo que es. ;) De todas formas, Python pre-compila el código y lo ejecuta una máquina virtual. ¿No te recuerda al innombrable? :-)

    Con el innombrable se podrán desarrollar programas como churros, pero es que lo que consigues también son churros en la mayoría de los casos. Programas lentos y pesados.

  5. Alejandro

    Hola Skarcha,
    Ya tenemos 2 innombrables…
    A ver si yo consigo el Tercero. En primer lugar, agradecer tu aportación a la comunidad de soft libre. Decirte que mis conocimientos en programación de 1 a 10 deben tirar rondando el 0,1. Estoy intentando montar un pequeño programita en PHP (¿es prohibido? :P). La idea es muy similar a la tuya y siempre hemos trabajado con Kimaldi (yo me he dedicado a montar los sistemas a los clientes, pero no a la programación, así que conozco algo mejor el lado técnico). No se siquiera si PHP me va a permitir introducir el modulo para comunicarse con el lector, (lo cual sería un fastidio porque ya tengo gran parte del curro echo y me faltan solo las comunicaciones). Si no lo consigo… ¿en que lenguaje me recomiendas volver a empezar? (QUIEN ME MANDARÍA A MI METERME EN ESTAS FAENAS…).
    P.D. ánimo con tu niña en el mundo! Seguro que es muy guapa! Mi mujer ya tenía a los niños criaos cuando nos conocimos. :) Espero tu respuesta y/o email de respuesta.

  6. SKaRCHa Autor

    Hola Alejandro,

    PHP no es innombrable en este blog, también me gusta como lenguaje.. :D

    Contestando a tu pregunta, la verdad es que no veo problemas en usar PHP como lenguaje para acceder a los lectores de Kimaldi, pero claro, tampoco especificas el modelo de lector ni qué quieres hacer exactamente.

    Con PHP puedes también comunicarte con los lectores usando TCP, UDP o incluso por puerto serie, así que ya te digo que «en principio», no debes tener problemas.

    Así que nada, ¡suerte con tu proyecto! y ya contarás si te va bien… ;)

  7. Alejandro

    Gracias por responder SKaRCHa.
    Pues en principio el biomax2 de kimaldi es el que estabamos usando conectado por ethernet.
    ¿Podrías indicarme algun acceso a tutorial o similar donde ilustrarme en el tema de las comunicaciones TCP/UDP usando PHP? De lo que estoy mirando hasta ahora es donde estoy más atascado.
    De nuevo gracias por tus consejos y ánimos.
    Te iré contando los futuros progresos.
    Un saludo.
    Alejandro, un very baby programador (porque a junior ni de coña…)

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.