Desafío: controlar acceso a través de huellas

Hace pocos días, me contacto un amigo con el que trabajé hace unos años. Aquel fue «mi primer trabajo», aun cuando fue más freelance que cualquier otra cosa.

Esta vez no fue un «sistema web», sino algo un poco especial. Teniendo 2 situaciones distintas, es necesario controlar el acceso de ciertas personas a ciertos lugares. En este caso, el problema en realidad es más cultural que informático, pero bueh…

La idea es implementar un lector de huellas digitales (tambien conocido como lector biométrico, fingerprint, etc…), que este logre identificar contra una base de datos con los socios (usuarios) y finalmente conceda o deniegue el acceso dependiendo de las condiciones en que se encuentra el socio (quien pondrá el dedo).

sadg
Lector de huellas casero

Es un desafío interesante por varias razones. Si pudiera elegir libremente, habría pensado en implementar PC’s terminales con Linux, ya que existe un api libre para programar estos aparatitos. Incluso, un compañero de la universidad logró habilitar el lector de huellas de su notebook con eso.

Pero estoy sujeto a algunas restricciones:

Problemas

Era que no

33 comentarios sobre “Desafío: controlar acceso a través de huellas”

  1. Hola,interesanete tema, eso lo trate cuando estaba en la universidad, bueno fue algo basico lo trabaje pero en MATLAB, bueno aver si desenpolvo mis archivos, y uso la PC para algo bueno aparte de jugar en linea jajaj, me interesa jeje, ademas estoy algo libre de tiempo y con internet a mi disposicion bueno algo hare 😉 (hablo como bueno ajjaja), suerte y chauu (maquivex@yahoo.com)

  2. Mmm… realmente no recuerdo la marca, pero hace un tiempo compre un lector de huellas digitales, que generaba una especie de archivo binario con los datos de la huella, que posteriormente se comparaba con otro binario y entregaba un numero entre 0 y 1, siendo 1 lo mas exacto y 0,96 lo mas aceptable para dar un resultado positivo.

    Lo bueno es que tenia una api y varias interfaces en diversos lenguajes de programacion… lo busco y te aviso.

  3. MUCHAS GRACIAS 😀

    Por el momento, el griaule briometrics esta «decente», y también hace lo mismo, permite tanto guardar la imágen, como un binario con los datos de la huella.

    Lo que me complica en este minuto, es migrar el ejemplo que trae una Base de datos en Access a otra cosa más decente.

    Y lo otro que me preocupa es comunicar mi aplicación con la que hace el control de acceso físico.

    La idea es ojala no tener que tocar esas aplicaciones, o por último, si implemento algún medio de comunicación en la mía, pedir a los desarrolladores que agreguen soporte a «eso» que haga las comunique.

    Me comentaron que sería útil usar el protocolo DDE de windows. :S

  4. mmmm eso esta facil,

    para lo de la programacion del lector de huellas se pueden bajar el sdk de griaule , trae varios ejemplos en varios lenguajes (DELPHI, JAVA, C++, ETC), y para lo del acceso al control fisico basta diseñar un dispositivo ke se conecte al puerto paralelo y listo , pueden trabajar con el puerto paralelo con la libreria inputout32.dll

  5. en cuanto a lo de migrar a otro gestor de base de datos
    no hay ningun problema

    basta con tener un campo blob para la huella
    y un id para guardar la clave de la huella

  6. Quisiera saber si lograste controlar o leer desde el scaner de huellas con c# tengo un proyecto similar pero yo estaba trabajando con otro lector pero a mi me entregaron la conexion ya realizada al lector pero para cambiar de lector necesito saber como iniciarlo y cosas asi, me seria de muxa ayuda….y con respecto a lo de los programas que necesitas que interactuen…bueno yo simplemente lo estoy haciendo por medio de la base de datos por medio de la huella en donde los diferentes programas toman ese dato y listo….no se si me entiendas Saludos

  7. He logrado cosas, pero solo tengo certeza de lo siguiente:

    El Griaule Biometrics Fingerprint Reader SDK es compatible con «su lista» de dispositivos compatibles, ya que la gracia de leer funciona a través de un driver de reemplazo que el mismo SDK incluye (FingerCap driver le llama). Así que «me atrevo» a cambiar de lector solo entre «los compatibles» de la lista.

    Lo bueno es que el Microsoft lee de lo más bien y es fácil de adquirir en cualquier tienda.

    Cualquier otro lector «profesional» DEBIEARA traer su propio SDK.

  8. Una pequeña duda: Es que me he bajado el GRfinger de Griaule, y nadamas no prende mi MS Fingerprint Reader, lo he checado con el driver que trae en el paquete que es de digital persona y este si sirve, ¿alguien podria orientarme?

  9. edgar:

    Creo qeu es necesario desinstalar el software Digital Persona Password Manager, y ya una vez desinstalado, instalar el fingercap para poder utilizar el SDK de Griaule (si es qeu ese es tu proposito).

    —–

    Respecto a lo que comentas (Gonzalo), es exactamente lo qeu quiero hacer para un proyecto escolar (este orientado a control de incidencias).

    Debido a qeu no tenia ni la mas minima idea de que iba a necesitar, baje el SDk de Griaule (en su version de prueba, claro) sin saber mucho de el… es bueno saber qeu es la opcion mejorcita jejeje.

    Tengo poco conocimiento en VS, y lo queremos desarrollar con 2008. Hemos hecho pruebas con 2005 (C#) y solo nos ha funcionado en XP… Ni hablar de 2008 que me muestra problemas al diseñar el control ActiveX.

    Saludos!

  10. Me tocó hacer de esto un servicio tcp, o sea un programa que escuche en algun puerto y que retorne ya sea las lecturas como las plantillas del lector biometrico, o si la huella se encontro o no en una base de datos (pgsql) con los datos de cada usuario, todo ello para hacer uso del servicio desde cualquier aplicacion que corra en la estacion de trabajo, desde telnet hasta el navegador (crossdomain).
    En gnu ocupé sin problemas el «one touch» de digitalpersona. Ahora tengo que hacer el mismo programa para window$ pero quiero hacerlo en delphi asi que tendre que detenerme a mirar al Griaule…
    Gracias por el post…

  11. Saludos:

    Oye tengo un proyecto algo, digo similar, es una cerradura, la cual a traves de la huella digital mande una carga electrica a una bobina y esta se energize para acer lo demas, pero en realidad, no c komo enlazar el dispositivo de huella kon algun lenguaje de programacion, komo c# o c++, mi pregunta es ¿ se puede enlazar? ¿komo ?, si me pudieras echar la mano te lo agradeceria mucho, soy estudiante de universidad de primer grado, gracias.

    ATTE: Daniel

  12. Hola, estoy desarrollando un Sistema para un cliente y tambien necesita que la auntentificacion de los clientes sea por este sistema, incluso ya tendo el dispositivo que muestras en la fotografia, lo estoy desarrollando en Delphi 7 por que es donde tengo mas experiencia, aunque se c# y Java.

    Pero aun no consigo la manera de hacer que me funcione el dispositivo con el sistema.. me podrias dar una ayudate..?

  13. HOLA…ESTOY REALIZANDO UN PROGRAMA MUY SENCILLO EN ACCESS 2003 PARA EL INGRESO Y SALIDA DEL PERSONAL EN LA EMPRESA…SI ADQUIERO EL FINGERPRINT DE MICROSOFT ES FACIL ADAPTARLO AL PROGRAMA PARA QUE LA MARCACION SE REALICE POR HUELLA…COMO DEBE SER EL CAMPO EN LA TABLA MAESTRA O COMO DEBE REALIZARLO…ESTOY NUEVO EN ACCESS…MIL GRACIAS

  14. hola, queria preguntarte como te fue con este proyecto del lector de huellas ya que estoy en algo parecido con php, java y mysql y tengo un microsoft fingerprint reader pero pero no lo puedo hacer andar con ningun sdk de los planteados, este viene con digital persona, me podrias recomendar algo que me tome este driver (el nativo del fingerprint) desde ya gracias y mucha suerte con tu proyecto

  15. @Alejandro Della Penna: El griaule biometrics tiene un SDK (Fingrprint SDK) y el driver (Fingercap). Cuando acabas de instalar el SDK te ofrece instalar el driver.

    Y por cierto, cuenta con un ejemplo en java, incluso en un applet (lo que me imagino te ayudará a coordinar el login vía web).

    Lo único malo del asunto, es que no es libre y además cobran licencia. La licencia de «developer» te da permiso de uso durante 90 días sin limitaciones.

  16. package lectorHuella;

    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.util.Calendar;
    import java.util.GregorianCalendar;

    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.SwingUtilities;

    import com.digitalpersona.onetouch.DPFPGlobal;
    import com.digitalpersona.onetouch.DPFPSample;
    import com.digitalpersona.onetouch.capture.DPFPCapture;
    import com.digitalpersona.onetouch.capture.event.DPFPDataAdapter;
    import com.digitalpersona.onetouch.capture.event.DPFPDataEvent;
    import com.digitalpersona.onetouch.capture.event.DPFPReaderStatusAdapter;
    import com.digitalpersona.onetouch.capture.event.DPFPReaderStatusEvent;
    import com.digitalpersona.onetouch.capture.event.DPFPSensorAdapter;
    import com.digitalpersona.onetouch.capture.event.DPFPSensorEvent;

    /**
    * Clase que permite probar las clases para el tratamiento de una imagen
    * obtenida con el lector de huellas, para el indexado y para el almacenamiento de las
    * características de las huellas en una base de datos.
    *
    * @author Aragón Cruz Carlos Augusto
    * @author García Santiago José Miguel
    * @author Ramírez Muñoz David Cuauhtémoc
    * @author Sánchez Velasco Oscar Ernesto
    */
    public class LectorHuella extends javax.swing.JApplet {

    private static final long serialVersionUID = 6157068737845066702L;
    private DPFPCapture capturer = DPFPGlobal.getCaptureFactory().createCapture();
    Image imagen;

    /**
    * Inicializa los componentes.
    */
    public LectorHuella() {
    initComponents();
    // this.setLocationRelativeTo(null);
    }

    @SuppressWarnings(«unchecked»)
    private void initComponents() {

    lblImagen = new javax.swing.JLabel();
    btnGuardar = new javax.swing.JButton();
    jScrollPane1 = new javax.swing.JScrollPane();
    txtStatus = new javax.swing.JTextArea();

    //setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    // setResizable(false);
    addComponentListener(new java.awt.event.ComponentAdapter() {
    public void componentHidden(java.awt.event.ComponentEvent evt) {
    formComponentHidden(evt);
    }
    public void componentShown(java.awt.event.ComponentEvent evt) {
    formComponentShown(evt);
    }
    });

    lblImagen.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    lblImagen.setBorder(javax.swing.BorderFactory.createEtchedBorder());

    btnGuardar.setText(«Guardar»);
    btnGuardar.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    btnGuardarActionPerformed(evt);
    }
    });

    txtStatus.setColumns(20);
    txtStatus.setRows(5);
    jScrollPane1.setViewportView(txtStatus);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
    .addContainerGap(283, Short.MAX_VALUE)
    .addComponent(btnGuardar))
    .addGroup(layout.createSequentialGroup()
    .addContainerGap()
    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE))
    .addGroup(layout.createSequentialGroup()
    .addGap(67, 67, 67)
    .addComponent(lblImagen, javax.swing.GroupLayout.PREFERRED_SIZE, 227, javax.swing.GroupLayout.PREFERRED_SIZE)))
    .addContainerGap())
    );
    layout.setVerticalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
    .addContainerGap()
    .addComponent(lblImagen, javax.swing.GroupLayout.PREFERRED_SIZE, 253, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 28, Short.MAX_VALUE)
    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addComponent(btnGuardar)
    .addContainerGap())
    );

    // pack();
    }

    private void formComponentHidden(java.awt.event.ComponentEvent evt) {
    capturer.stopCapture();
    }

    private void formComponentShown(java.awt.event.ComponentEvent evt) {
    configurar();
    capturer.startCapture();
    }

    private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {
    guardarImagen();
    }

    /**
    * Despliega en el cuadro de texto el estado actual del lector.
    * @param estado String que contiene el estado actual del lector.
    */
    public void imprimirEstado(String estado) {
    txtStatus.append(estado + «\n»);
    }

    /**
    * Da tratamiento a la imagen para prepararla para obtener las minucias.
    * @param sample Objeto que tiene las caracterísitcas de la huella capturada.
    */
    protected void procesar(DPFPSample sample) {
    imagen = getMapaDeBits(sample);
    dibujarImagen();

    //código de tratamiento de la imagen

    }

    /**
    * Despliega la imagen en la etiqueta principal.
    */
    public void dibujarImagen() {
    lblImagen.setIcon(new ImageIcon(
    imagen.getScaledInstance(lblImagen.getWidth(), lblImagen.getHeight(), Image.SCALE_AREA_AVERAGING)));
    }

    /**
    * Guarda la imagen obtenida por el lector en un archivo BMP. El nombre del
    * archivo es temporalmente la hora en que se creó la imagen.
    */
    private void guardarImagen() {
    try {
    Calendar calendario = new GregorianCalendar();
    int hora = calendario.get(Calendar.HOUR_OF_DAY);
    int minutos = calendario.get(Calendar.MINUTE);
    int segundos = calendario.get(Calendar.SECOND);
    ImageIO.write((BufferedImage) imagen, «BMP», new File(hora + «-» + minutos + «-» + segundos + «.bmp»));
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }

    /**
    * Obtiene una imagen a partir del objeto cuya clase es DPFPSample.
    * @param sample un objeto DPFPSample retornado por el lector de huellas.
    * @return Una imagen a partir del objeto obtenido por el lector.
    */
    protected Image getMapaDeBits(DPFPSample sample) {
    return DPFPGlobal.getSampleConversionFactory().createImage(sample);
    }

    /**
    * Agrega al objeto capturer los eventos que permiten detectar cuando el lector
    * es conectado o desconectado a la computadora, cuando una huella es colocada
    * o retirada del lector y cuando el lector ha capturado la huella.
    */
    protected void configurar() {
    capturer.addDataListener(new DPFPDataAdapter() {

    @Override
    public void dataAcquired(final DPFPDataEvent e) {
    SwingUtilities.invokeLater(new Runnable() {

    public void run() {
    imprimirEstado(«El lector ha capturado una huella.»);
    procesar(e.getSample());
    }
    });
    }
    });
    capturer.addReaderStatusListener(new DPFPReaderStatusAdapter() {

    @Override
    public void readerConnected(final DPFPReaderStatusEvent e) {
    SwingUtilities.invokeLater(new Runnable() {

    public void run() {
    imprimirEstado(«El lector fue conectado.»);
    }
    });
    }

    @Override
    public void readerDisconnected(final DPFPReaderStatusEvent e) {
    SwingUtilities.invokeLater(new Runnable() {

    public void run() {
    imprimirEstado(«El lector fue desconectado.»);
    }
    });
    }
    });
    capturer.addSensorListener(new DPFPSensorAdapter() {

    @Override
    public void fingerTouched(final DPFPSensorEvent e) {
    SwingUtilities.invokeLater(new Runnable() {

    public void run() {
    imprimirEstado(«El lector ha sido tocado.»);
    }
    });
    }

    @Override
    public void fingerGone(final DPFPSensorEvent e) {
    SwingUtilities.invokeLater(new Runnable() {

    public void run() {
    imprimirEstado(«El dedo fue retirado del lector.»);
    }
    });
    }
    });

    }

    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {

    public void run() {
    new LectorHuella().setVisible(true);
    }
    });
    }

    private javax.swing.JButton btnGuardar;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel lblImagen;
    private javax.swing.JTextArea txtStatus;
    }

  17. hola Hector, excelente reto e impecable codigo, te pido una cosilla, como puedo obtener el template de la huella o cual es la clase con la que puedo tomarla para guardarla en una db y luego compararla con una nueva captura de la huella?, muchas gracias, excelente blog.

  18. Hector lo q pasa es q no encuentro los import ar.com.nec.sol.acu.components.scanner.event.ScannerEvent;…………………….

    soy principiante en java pero quisiera poder correr un código de estos.

  19. que pena es estos import

    import com.digitalpersona.onetouch.DPFPGlobal;………..

    gracias si me pueden ayudar la verdad quiero saber como es el manejo completo de este programita (applet)

  20. Jerson; ese import corresponde a un package de NEC, este lo tienes que conseguir en NEC argentina, lo distribuyen como trial y es un tanto engorrosa la docu y es comercial.

  21. hola excelente tema……justamente me gustaria que si me pudieras ayudar con un proyecto que es implementar el control de entradas y salidas por media de huellas digitales.

    es muy importante antes de noviembre del 2011…porfavor

    SALUDOS!!!!

  22. hola excelente tema……justamente me gustaria que si me pudieras ayudar con un proyecto que es implementar el control de entradas y salidas por media de huellas digitales. utilizando el lenguaje java netbeans.

    es muy importante debo entregarlo antes de diciembre del 2011…porfavor

    corrijo, mi correo es el siguente: jacobo_kuyoc@hotmail.com

    SALUDOS!!!!

  23. Hola me gustaria saber si alguien me puede ayudar estoy realizando un programa en Matlab para reconocimiento de huellas dactilares y no se como adquirir la imagen desde el dispositivo U.are.U 4000B, si me pueden ayudar con el codigo o los comandos les estaria muy agradecido…

    Aqui les dejo mi correo gracias: ortcorp20@hotmail.com

  24. Excelente trabajo compañero, me podrias pasar el codigo al correo tirso_8122@para practicar en java, actualmente estoy empezando a realizar algo similar pero en .net

    podrias mandarme el codigo

  25. Hola. ..yo desarrolle un sistema de login por huella utilizando huelleros Digital persona y Futronic. La app se desarrollo en C# y corre como un ejecutable en el cliente conectado via web a una página Php q valida q la huella ssea original. Informes victor.valencia@gmail.com

  26. Chicos necesito de su ayuda!!!

    Saben si se puede crear un archivo de excel donde pueda controlar el acceso por medio de un lector de huella?

    Si conectó el lector y tengo el libro abierto me generará el dato binario???

    Ayuda por favor… 🙂

  27. Buen día necesito hacer un programa para lectura de huella digital con matlab espero alguien pueda colaborarme mi correo es julian.triana012@gmail.com no importa si toca pagar me escriben y cuadramos gracias.

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.