You are on page 1of 33

Programacin de un lector de huella

digital en Java. Parte 1.

Como ya lo he mencionado anteriormente, en la actualidad la seguridad en las transacciones


electrnicas se ha vuelto una parte indispensable para los programadores de sistemas, la
identificacin para el acceso a los registros y dems cuestiones relacionadas deben de ser
tomadas en cuenta para poder validar que alguna persona est accediendo realmente a lo que
debe acceder, es esencial hacer que (en medida de lo posible) nadie pueda hacerse pasar por
alguien que no es al momento de identificarse en un sistema. Aqu es donde la biometra
juega un papel sumamente interesante (ms informacin sobre la biometra en ste artculo)
as que dedicar una serie de artculos a tratar de explicar cmo programar un lector de huella
digital en Java utilizando algunas herramientas y API's que nos permitirn realizar todos los
procedimientos

sin

ningn

problema.

Primeramente hablar de lo que necesitamos para poder empezar a programar un sistema


completo de registro y verificacin de identidades por medio de la huella digital:

El JRE (Java Runtime Environment) ms reciente, al momento de la publicacin de


este artculo es la 1.6.7.

IDE de programacin NetBeans en su versin ms reciente, al momento de publicar


este artculo es la 6.1. Cabe mencionar que el vnculo que indico contiene varias
versiones, se puede descargar cualquiera que cuente con el Base IDE y Java SE.

Un lector de huella digital de cualquiera de estos modelos.

El API de programacin de lectores de huella digital de Griaule para Java.

Un servidor de bases de datos en MySQL.

Una vez que tenemos todo lo anterior procedemos con la instalacin del API de programacin
de Griaule (asumo que el NetBeans y el servidor MySQL ya estn instalados y funcionando sin
problemas). Instalacin del API de programacin de Griaule:: Una vez que hemos
descargado el API tendremos un archivo llamado Fingerprint_SDK_Java_2007_Installer.jar,
para comenzar la instalacin se realiza lo siguiente:
1. Doble clic sobre el archivo, aparecer una ventana que nos pide elegir el idioma,
selecciona el que desees.
2. Posteriormente aparece la pantalla de bienvenida y si se da clic en Siguiente aparecen
los trminos de la licencia, los cuales se debe aceptar para poder continuar.
3. Una vez hecho lo anterior se selecciona la ruta donde se instalar, aqu se dejan los
valores por defecto.
4. Despus de la ruta de instalacin se debe elegir los elementos que se instalarn, de
igual manera se deja todo marcado y se da clic en Siguiente.

5. Posteriormente se instalan los elementos seleccionados, dejando al final la instalacin


del controlador. NOTA: Es de suma importancia tomar en cuenta que antes de la
instalacin del lector de huella digital, este se debe de tener desconectado y de
preferencia desinstalar el software y controladores que venan con l de fbrica para
evitar conflictos durante la actual instalacin.
6. Ahora aparece una pantalla para seleccionar el idioma de la instalacin del
controlador, de igual manera se elige el que ms convenga.
7. Despus aparece la pantalla de bienvenida...

... aqu se da clic en Siguiente o Next.


8. Se aceptan los trminos de la licencia y se da clic en Siguiente un par de veces.
9. Posteriormente presionamos el botn de Instalar o Install para que se realice la
instalacin de los controladores del lector.
10. Al terminar el proceso se da clic en el botn de Siguiente y posteriormente en Finalizar
para terminar la instalacin del controlador.
11. Una vez hecho esto se sigue con la pantalla del proceso de instalacin general...

... y se da clic en Siguiente o Next.


12. Al final se da clic en el botn Done para culminar.
Una vez terminada la instalacin del API se puede conectar el lector para terminar su
instalacin. Conectar el lector de huella digital:: Ahora continuemos con lo siguiente:
1. Se conecta el lector de huella digital.
2. Aparece el Asistente para Nuevo Hardware de Windows.
3. Se selecciona No por el momento y se da clic en Siguiente.
4. Despus se elige Instalar automticamente el software recomendado y se da clic en
siguiente.
5. Se espera a que termine la instalacin, el asistente debe de reconocerlo e instalar los
controladores que previamente hemos agregado junto con el API.

6. Se da clic en Finalizar para terminar la instalacin.

Preparacin de las libreras y archivos necesarios:: Una vez que se tiene todo lo anterior
correctamente instalado y configurado se deben de preparar las libreras y los archivos
colocndolos en los directorios que deben de estar, para ello se realiza lo siguiente:
1. Se abre la carpeta de las libreras del API, si se ha dejado por defecto aparecer
enC:\Archivos de programa\Griaule\Fingerprint SDK Java 2007\bin
2. Se copia el archivo grfingerjava.jar hacia las carpetas C:\Archivos de programa\Java\
jdk*\jre\lib\ext (donde jdk* es la versin que tienes instalada, si tienes varias se puede
colocar en todas) y en la carpeta C:\Archivos de programa\Java\ jre*\lib\ext (donde jre*
es la versin ms reciente).
3. Se seleccionan y se copian todos los archivos .dll que se encuentran en la carpeta de
las libreras del API y se pegan en C:\Windows\System32
Preparacin de la base de datos:: Ya realizados los pasos anteriores nicamente nos falta
crear una base de datos que almacene los registros de las huellas, en este caso prepararemos
dentro de dicha base una tabla sencilla que contenga nicamente 3 datos, un ID, el nombre de
la persona y la huella registrada. Para efectos de este ejemplo usaremos una base de datos
de nombre huellas y una tabla dentro de dicha base de nombre somhueque contendr los
datos descritos a continuacin:
1. Nombre de campo: ID , tipo: INT (autoincrement)
2. Nombre de campo: huenombre , tipo: VARCHAR(100)
3. Nombre de campo: huehuella , tipo: BLOB
Ya tenemos todo para comenzar a programar nuestra aplicacin de reconocimiento de huella
digital pero eso lo dejaremos para la siguiente parte. Alguna duda o algo qu decir? Deja tu
comentario.

Programacin de un lector de huella


digital en Java. Parte 2.
Continuando con la programacin de un lector de huella digital en Java procederemos en este
caso ya directamente con el cdigo, la entrega anterior se refiri meramente a la preparacin
del entorno para el desarrollo, si no la has ledo te recomiendo verificarla, entenderla y
realizarla primero antes de proceder con esto ya que de lo contrario no funcionar la
aplicacin.
Comenzando
1.

con

Creamos

un

las

indicaciones,

proyecto

en NetBeans con

haremos
el

lo

siguiente:

nombre EjemploLectorHuellas.

2. Dentro del proyecto crear un paquete de nombre procedimientos y otro de nombreinterfaz.


3.

Dentro

de

4.

En

definicin

la

procedimientos

IImageEventListener,

de

la

crear
clase

una
util

IFingerEventListener y

clase

(Java

agregar implements
sus

Class)

llamada Util.

IStatusEventListener,

correspondientes

imports...

import

com.griaule.grfingerjava.FingerprintImage;

import

com.griaule.grfingerjava.IFingerEventListener;

import

com.griaule.grfingerjava.IImageEventListener;

import

com.griaule.grfingerjava.IStatusEventListener;

public

class

IImageEventListener,

Util

implements

IStatusEventListener,
IFingerEventListener{

.
.

5. Al implementar dichas interfaces nos pedirn implementar todos sus mtodos abstractos, lo

hacemos dando un clic en el foco que aparece del lado izquierdo y seleccionando "Implement
all abstract methods" lo cual generar la implementacin de 5 mtodos (modifica el nombre de
los

argumentos

para

mejor

referencia)

public void onSensorPlug(String idSensor) // evento que se genera al


conectar

el

lector

de

huella

public void onSensorUnplug(String idSensor) // evento que se genera al


desconectar

public

void

el

lector

onImageAcquired(String

de

idSensor,

huella

FingerprintImage

huellaDigital) // evento que se genera al obtener una imagen de la


huella

public void onFingerDown(String idSensor) // evento que se genera al


colocar

un

dedo

en

public void onFingerUp(String idSensor)


levantar

el

el

lector

// evento que se genera al

dedo

del

lector

Cabe mencionar que no utilizaremos todos los eventos en este ejemplo pero se deben de
implementar para que el compilador no marque errores ya que provienen de una interface.
6. Modificamos los mtodos onSensorPlug y onSensorUnplug para que queden de la
siguiente

manera:

public

void

onSensorPlug(String

idSensor)

try

GrFingerJava.startCapture(idSensor,
}

catch

this,

(GrFingerJavaException

this);
e)

e.printStackTrace();
}
}

public

void

onSensorUnplug(String

idSensor)

try

{
{

GrFingerJava.stopCapture(idSensor);
}

catch

(GrFingerJavaException

e)

e.printStackTrace();
}
}
Lo anterior es para evitar problemas en la captura al momento de conectar y desconectar el
lector,

para

que

el

compilador

no

marque

errores

debemos

importar

las

clases GrFingerJavay GrFingerJavaException...

import

com.griaule.grfingerjava.GrFingerJava;

import

com.griaule.grfingerjava.GrFingerJavaException;

Los dems mtodos que se implementaron deben de quedar vacos (por el momento).
7. Ahora creamos un mtodo esttico que nos permita establecer el directorio de las libreras
del SDK

/**
* Establece el directorio donde se ubican las libreras nativas
del

SDK
*/
public

directorio)

static

void

setFingerprintSDKNativeDirectory(String
{

File

directory

new

File(directorio);

try

GrFingerJava.setNativeLibrariesDirectory(directory);
GrFingerJava.setLicenseDirectory(directory);
}

catch

(GrFingerJavaException

e)

e.printStackTrace();
}
}
y

el

import

de la

clase

File correspondiente:

import

java.io.File;

8. Posteriormente agregamos los siguientes objetos y variables inmediatamente despus de la


definicin

de

la

clase:

/**Contexto utilizado para la captura, extraccin y coincidencia de


huellas

digitales

private

*/

MatchingContext

fingerprintSDK;

/**Interfaz de usuario donde se muestra la imagen de la huella*/


private

/**

Indica

PantallaPrincipal

si

la

plantilla

ui;

template

debe

ser

extrada

automticamente*/
private

/**

Contiene

boolean

localmente

private

/**Contiene
private

autoExtract

los

datos

de

la

huella

ByteArrayInputStream

la

longitud
int

del

true;

capturada

*/

fingerprintData;

dato

de

la

huella*/

fingerprintDataLength;

/**

La

imagen

de

private

/**

ltima

huella

digital

capturada.

FingerprintImage

La

plantilla

de

public
...

la

la

ltima

fingerprint;

imagen

de

huella

capturada

Template
con

sus

*/

*/

template;

correspondientes

imports

...

import

com.griaule.grfingerjava.MatchingContext;

import

interfaz.PantallaPrincipal;

import

java.io.ByteArrayInputStream;

Nota: se debe agregar 'import interfaz.PantallaPrincipal;' an cuando no existe actualmente ya


que

se

crear

en

los

pasos

siguientes.

9. Ahora crearemos la interfaz de usuario, para ello damos clic derecho en el paquete interfaz
y seleccionamos New -> JFrame Form, le damos por nombre 'PantallaPrincipal'.
10. Agregamos dos paneles (Huella Digital y Acciones, como se muestra en la imagen) y 4
botones (Verificar, Identificar, Guardar y Salir) de manera que queden parecido a lo siguiente:

11. Nombramos los botones tal cual su etiqueta pero anteponiendo las letras btn, es
decirbtnVerificar, btnIdentificar y as sucesivamente, el panel de Huella Digital lo
nombramos

'panelContenedor'.

12. Establecemos el panelContenedor con un BorderLayout dando un clic derecho sobre l


->

Set

Layout

->

Border

Layout

12. Ya que tenemos lo anterior nos vamos a la vista de cdigo y agregamos los siguientes
objetos...

//objeto usado para realizar todas las operaciones relacionadas al


Fingerprint-SDK
private

//Panel
private

//Imagen
private

para

Util

mostrar

JPanel

de
BufferedImage

procedimientosSDK;

la

huella

fingerprintViewPanel

la

digital
=

huella
fingerprintImage

null;

actual
=

null;

...

con

sus

correspondientes

imports

...

import

java.awt.image.BufferedImage;

import

javax.swing.JPanel;

import

procedimientos.Util;

...

los

objetos

deben

ir

dentro

de

la

clase

pero

fuera

de

cualquier

mtodo.

13. Nuevamente modificamos la clase Util agregando un constructor sobrecargado que reciba
un

objeto

de

public

tipo PantallaPrincipal de

la

siguiente

Util(PantallaPrincipal
this.ui

manera:

ui)

ui;
}

14. Por ltimo en la clase Util (por el momento) agregamos un mtodo que nos permita
inicializar

la

captura

de

las

huellas,

deber

de

quedar

as:

/**
* Inicializa el Fingerprint SDK y habilita la captura de huellas.
*/
public

void

inicializarCaptura()
try

fingerprintSDK
//Inicializa

la

{
{

new

MatchingContext();

captura

de

huella

digital.

GrFingerJava.initializeCapture(this);
}
//Si

catch
ocurre

un

(Exception
error

se

e)

cierra

la

aplicacin.

e.printStackTrace();
System.exit(1);
}
}

15. Ahora trabajaremos con la clase PantallaPrincipal, lo que haremos es crear un mtodo
para inicializar la forma, estableciendo el estilo visual y creando una instancia de la clase Util.
Deber

quedar

de

la

siguiente

manera:

/**
* Se establece el estilo visual de la aplicacin y se realiza la
inicializacin
*

de
que

la

contiene

los

clase

procedimientos

principales.
**/

public

void

inicializar()

try

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}

catch

(Exception

e)

System.err.println("No se pudo aplicar el estilo visual");


}

//Crea

una

instancia

this.procedimientosSDK

new

de

Util

Util(this);
}

...

su

import

import

correspondiente:

javax.swing.UIManager;

16. Agregamos una llamada al mtodo inicializar() dentro del constructor de la clase y antes
del

/*

mtodo initComponents() de

Crea

una

nueva

public

tal

forma

manera

de

que

quede

PantallaPrincipal

PantallaPrincipal()

as:

*/
{

inicializar();

initComponents();
}

17. Ahora hacemos un mtodo para crear el contenedor de la imagen de la huella digital, en
los

comentarios

se

va

explicando

las

funciones

de

cada

lnea...

/**
* Crea el panel que contendr la imagen de la huella digital
*/
private
//Crea

JComponent

un

panel

crearPanelHuella()

nuevo

para

fingerprintViewPanel

//Se

mostrar

sobreescribe

el

la

new

mtodo

{
huella
JPanel(){

paintComponent

//para habilitar la muestra de la imagen de la huella


public

void

paintComponent(Graphics

g)

super.paintComponent(g);

//Si

hay

una

if

imagen

para

ser

mostrada

(fingerprintImage!=null)

//Calcula el tamao y posicin de la imagen para


ser

pintada
//el tamao es ajustado para que ocupe todo el

tamao

del
Insets
int
int
int width

panel
insets

transX
transY
= getWidth()

=
=
=

getInsets();
insets.left;
insets.top;

- getInsets().right

getInsets().left;
int height = getHeight() - getInsets().bottom getInsets().top;

//Se

dibuja

la

g.drawImage(fingerprintImage,
width,

imagen

transX,

transY,

height,

null);
}

};

//Se

agrega

un

borde

alrededor

fingerprintViewPanel.setBorder(new
new
new

del

panel

CompoundBorder

EmptyBorder

(2,2,2,2),

BevelBorder(BevelBorder.LOWERED)));

//si no hay existe el panel de la huella no devuelve nada...


if(fingerprintViewPanel==null)
{
return
}else{ //

de

lo

contrario

null;
devuelve

return

el

panel

mismo

fingerprintViewPanel;
}

}
...

se

agregan

los

imports

correspondientes

para

evitar

errores

...

import

java.awt.Graphics;

import

java.awt.Insets;

import

javax.swing.JComponent;

import

javax.swing.border.BevelBorder;

import

javax.swing.border.CompoundBorder;

import

javax.swing.border.EmptyBorder;

18. Una vez hecho esto nos vamos a la vista de diseo de la clase PantallaPrincipal, sin
seleccionar ningn elemento damos clic derecho sobre el JFrame y posteriormente
seleccionamos Events

...

lo

cual

nos

->

llevar

Window

la

vista

de

WindowActivated ...

->

cdigo

de

la

clase,

dentro

del

mtodoformWindowActivated, ah agregamos el cdigo de manera que quede de la


siguiente

private

forma:

void

formWindowActivated(java.awt.event.WindowEvent

evt)

this.panelContenedor.add(crearPanelHuella());
}
19. Ahora creamos el mtodo showImage que nos permitir mostrar la imagen capturada por
el lector en el panel correspondiente. El mtodo debe quedar de la siguiente manera:

/**

Mtodo

utilizado

en

para

mostrar

el

la

imagen

panel

de

la

huella

correspondiente.
*/

public

void

showImage(BufferedImage

image)

//Utiliza el imageProducer para crear una imagen de la huella


digital
fingerprintImage
//Se

dibuja

la

image;

nueva

imagen

repaint();
}
20. Una vez hecho esto vamos a la clase Util y agregamos el cdigo correspondiente al
mtodo onImageAcquired que se ha creado al implementar las interfaces, el mtodo debe
quedar

as:

/**
* Este mtodo es llamado cada vez que la imagen de una huella ha
sido

capturada.
*/
public

void

onImageAcquired(String

idSensor,

FingerprintImage

huellaDigital)
//Almacena

{
la

imagen

de

la

huella

this.fingerprint=huellaDigital;

//Muestra

la

imagen

obtenida

ui.showImage(huellaDigital);

}
21. Ahora en el constructor de la clase PantallaPrincipal agregamos las siguientes 3 lneas:

/*Inicializa

la

captura

de

huellas*/

procedimientosSDK.inicializarCaptura();

/*centra

la

ventana

en

la

pantalla*/

setLocationRelativeTo(null);

/*hace

visible

la

ventana*/
setVisible(true);

22. Agregamos el evento ActionPerformed del botn 'Salir' dando clic derecho sobre l en
vista de diseo y seleccionando Events -> Action -> ActionPerformed y dentro del cdigo
generado

agregamos

el

mtodo dispose();

23. Para que nuestro programa pueda ejecutarse necesitamos mandarlo llamar desde la clase
main, en este caso adems de llamar a la ventana se necesita establecer el directorio de las
libreras,

public

en

conjunto,

el

static

mtodo

main

de

void

String

la

clase

main

main(String[]

grFingerNativeDirectory

debe

quedar

as:

args)
=

{
new

File(".").getAbsolutePath();

Util.setFingerprintSDKNativeDirectory(grFingerNativeDirectory);

PantallaPrincipal

new

PantallaPrincipal();
}

Una vez hecho esto podemos correr la aplicacin con F6 y verificar que realmente funcione, si
has realizado los pasos tal cual podrs, hasta este momento, activar el lector de huellas y
obtener la lectura de la huella que se ha colocado en el lector, an nos falta especificar cmo
verificar, identificar y guardar las huellas pero eso lo dejaremos para la prxima entrega.

Programacin de un lector de huella


digital en Java. Parte 3.

Siguiendo con el tutorial para la programacin de un lector de huellas en Java (si no has
ledo la parte 1 y parte 2 te recomiendo hacerlo antes de proceder) en este caso explicar
cmo almacenar los registros de las huellas en una base de datos en MySQL, anteriormente
en la parte 1 hemos creado la base de datos con 3 columnas (el id, los datos de la huella y el
nombre de la persona que la registr) ahora pasemos al cdigo.
Recapitulando...
Se
tienen
nicamente
3
clases
en
el
proyecto:
la
clase ejemplolectorhuellas.Main, interfaz.PantallaPrincipal y procedimientos.
Util, donde Main es a travs de la cual se arranca el programa, PantallaPrincipal es
la interfaz y Util es la clase que contiene los procedimientos.
Al realizar todos los procedimientos de la parte 2 del tutorial y ejecutar el programa
se debe de enceder el lector de huellas, al colocar el dedo sobre el lector debe de
aparecer la imagen de la huella capturada.

Hasta aqu todo bien? Si tu respuesta es afirmativa contina con los siguientes pasos, de lo
contrario regresa a las partes anteriores y verifca que no tengas errores en la codificacin.
Agregar

los

objetos

para

las

consultas

en

procedimientos.Util::

Abrimos la clase procedimientos.Util y agregamos al inicio de la misma los siguientes


objetos:
/**Conexin a la base de datos*/
private Connection dbConnection;
/**Consultas preparadas**/
private PreparedStatement guardarStmt;
private PreparedStatement identificarStmt;
private PreparedStatement verificarStmt;
Los objetos anteriores se utilizarn para crear la conexin a la base de datos y realizar
consultas en la misma, para poder realizar lo anterior debemos de crear un par de mtodos
como se muestran a continuacin:
/**
* Inicializa la conexin a la base de datos y prepara las
operaciones para insertar,
* eliminar y modificar los datos
*/
private void initDB() {
try {

//Carga el driver ODBC


Class.forName("com.mysql.jdbc.Driver");
//Se conecta a la bd
dbConnection
=
DriverManager.getConnection("jdbc:mysql://servidor:3306/huell
as","usuario", "contrasena");
Statement stm = dbConnection.createStatement();
//Prepara

las

consultas/sentencias

que

se

utilizarn
guardarStmt
=
dbConnection.prepareStatement("INSERT
INTO
somhue(id,
huenombre, huehuella) values(?,?,?)");
identificarStmt
=
dbConnection.prepareStatement("SELECT
huehuella
FROM
somhue");
verificarStmt
=
dbConnection.prepareStatement("SELECT huehuella FROM somhue
WHERE huenombre=?");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Cierra la conexin a la base de datos y libera los
recursos empleados.
*/
private void destroyDB() {
try {
//Se cierran todas las sentencias
guardarStmt.close();
identificarStmt.close();
//Cierra la conexin a la base
dbConnection.close();
} catch (Exception e) {
e.printStackTrace();
}
}

Las partes en rojo deben ser remplazadas por aquellas que correspondan a tu configuracin
del servidor MySQL. Una vez que tenemos la conexin a la base de datos debemos hacer
que el programa se conecte al inicializar la clase procedimientos.Util, para ello debemos
de agregar una llamada al mtodo initDB() dentro del constructor de la misma para que al
final quede de la siguiente manera:
public Util(PantallaPrincipal ui) {
this.ui = ui;
//Inicializa la conexin a la BD.
initDB();
}
Antes de poder guardar la huella (o la informacin de la huella) en la base de datos
debemos de extraer el llamado Template o plantilla de la huella que es una representacin
matemtica de un mapa de la huella, es importante aclarar que no vamos a guardar la
imagen de la huella sino este mapa a partir del cual se pueden comparar varias huellas o
verificar a quin pertenece, existe la manera de guardar la imagen pero no se realizar dicho
proceso en este tutorial debido a las siguiente razones:
No es seguro tener la imagen de una huella capturada.
Una imagen ocupa muchsimo ms espacio en la base de datos, si se plantea utilizar
para corroborar una considerable cantidad de huellas el proceso se vuelve
inoperable.
3. No es necesario tener la imagen de la huella para compararla con otra, basta con la
plantilla que se extraer.
1.
2.

Una vez aclarado el punto anterior procedamos a extraer la plantilla de la huella capturada
agregando el mtodo extract() a la clase procedimientos.Util de la manera siguiente:
/**
* Extrae la plantilla de la imagen de la huella actual.
*/
public void extract() {
try {
//Extrae la plantilla de la imagen.
template = fingerprintSDK.extract(fingerprint);
//Muestra la plantilla en la imagen

ui.showImage(GrFingerJava.getBiometricImage(template,fingerpr
int));
} catch (GrFingerJavaException e) {
e.printStackTrace();
}
}
Ya que hemos creado el mtodo extract() basta con mandarlo llamar desde el
mtodo onImageAcquired() para que este ltimo quede de la siguiente manera:
public void onImageAcquired(String idSensor, FingerprintImage
huellaDigital) {
//Almacena la imagen de la huella
this.fingerprint=huellaDigital;
//Muestra la imagen obtenida
ui.showImage(huellaDigital);
//Muestra la plantilla en la imagen actual
extract();
}
Una vez hecho lo anterior podemos correr el programa y capturar una huella, notaremos
que se dibujan algunas lneas verdes sobre la misma, dichas lneas son la representacin de
la plantilla que hemos extrado.
Ahora viene la parte donde guardamos la plantilla de la huella en la base de datos. Lo
primero que hacemos es agregar el mtodo guardarHuella() a procedimientos.Util de tal
forma que quede de la siguiente manera:
/*
* Guarda los datos de la huella digital actual en la base
de datos
*/
public void guardarHuella(){
//Obtiene los datos del template de la huella
actual

fingerprintData
=
new
ByteArrayInputStream(template.getData());
fingerprintDataLength = template.getData().length;
//Pregunta el nombre de la persona a la cual
corresponde dicha huella
String
nombre
=
JOptionPane.showInputDialog("Nombre:");
try {
//Establece los valores para la sentencia SQL
guardarStmt.setString(1,"default");
guardarStmt.setString(2,nombre);
guardarStmt.setBinaryStream(3, fingerprintData,
fingerprintDataLength);
//Ejecuta la sentencia
guardarStmt.execute();
} catch (SQLException ex) {
//Si ocurre un error lo indica en la consola
System.err.println("Error al guardar los datos de
la huella.");
ex.printStackTrace();
}
}
Tras realizar lo anterior debemos de realizar import correspondiente a la clase
JOptionPane: import javax.swing.JOptionPane
Lo nico que resta por hacer es mandar llamar el mtodo guardarHuella() por medio del
botn Guardar que aparece en la pantalla principal, para ello nos situamos en la pantalla
principal y damos doble clic sobre el botn Guardar lo cual automticamente nos crea el
mtodo que se efecta al presionar el botn, ahora solo basta mandar llamar el mtodo de la
siguiente manera:
private
void
btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {
procedimientosSDK.guardarHuella();
}

Tras realizar lo anterior, al ejecutar el programa, capturar una huella y presionar el botn
Guardar podremos almacenar los datos de la huella digital en la base de datos y,
posteriormente, podremos realizar operaciones de comparacin y verificacin de
identidades, pero esto lo dejaremos para la siguiente entrega.

Programacin de un lector de huella


digital en Java. Parte 4.

Anteriormente hemos visto cmo capturar y guardar huellas digitales en una base de
datos en MySQL (si no sabes a lo que me refiero lee las partes Uno, Dos y Tres de
este tutorial) ahora toca el turno a la verificacin de una identidad por medio de la
huella e identificacin de una persona.
Antes de continuar cabe aclarar(y
con verificacin e identificacin:

diferenciar)

lo

que

me

refiero

Verificacin: Es el corroborar la identidad de una persona por medio de un


dato previamente dado (como el nombre, una credencial, CURP, etc) y su
huella digital, por ejemplo: yo digo que soy Juan Prez y lo confirmo con mi
huella digital.
Identificacin: Es el corroborar la identidad de una persona utilizando
solamente su huella digital, por ejemplo: coloco mi huella digital y el sistema
automticamente sabe que soy Juan Prez.
Una vez aclarado lo anterior, procedamos pues a analizarlo en base al cdigo que
hemos agregado para las consultas en la parte 3 del tutorial.
Anteriormente agregamos un mtodo de nombre initDB() que es por medio del cual se
inicializa la conexin y se preparan las consultas a la base de datos, dicho mtodo
tiene, entre otras cosas, las siguientes lneas:
identificarStmt
= dbConnection.prepareStatement("SELECT *
FROM somhue");
verificarStmt
= dbConnection.prepareStatement("SELECT
huehuella FROM somhue WHERE huenombre=?");
Nota: anteriormente en la sentencia identificarStmt se tena huehuella en lugar de *,
para fines de esta aplicacin debemos de cambiarlo para que quede tal cual se muestra
en las lneas anteriores.
Aqu diferenciamos claramente que al momento de identificar una huella seleccionamos
todas las huellas de la base de datos (que posteriormente compararemos una por una
con la que tenemos actualmente para identificar a quin pertenece dicha huella), pero
al momento de verificar solamente tomamos un registro de huella filtrando con el
nombre de la persona a quien pertenece.
Todo perfectamente claro? Ok. Sigamos con el cdigo que va a realizar la primer
funcin: Verificar.
/**
* Verifica la huella digital actual contra otra en la base de datos

*/
public void verify(String nom) {
try {
//Obtiene la plantilla correspondiente a la persona indicada
verificarStmt.setString(1,nom);
ResultSet rs = verificarStmt.executeQuery();
//Si se encuentra el nombre en la base de datos
if (rs.next()){
//Lee la plantilla de la base de datos
byte templateBuffer[] = rs.getBytes("huehuella");
//Crea una nueva plantilla
Template referenceTemplate = new Template(templateBuffer);
//compara las plantilas (actual vs bd)
boolean
fingerprintSDK.verify(template,referenceTemplate);

coinciden

//Si corresponden, dibuja el mapa de correspondencia y lo


indica con un mensaje
if (coinciden){
ui.showImage(GrFingerJava.getBiometricImage(template,
fingerprint, fingerprintSDK));
JOptionPane.showMessageDialog(ui, "Las huellas s
coinciden");
} else {
//De no ser as lo indica con un mensaje
JOptionPane.showMessageDialog(ui, "No corresponde la
huella con "+nom, "Error", JOptionPane.ERROR_MESSAGE);
}
//Si no encuentra alguna huella correspondiente
//al nombre lo indica con un mensaje
} else {
JOptionPane.showMessageDialog(ui, "No existe el registro
de "+nom, "Error", JOptionPane.ERROR_MESSAGE);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (GrFingerJavaException e) {
e.printStackTrace();
}
}
Al realizar lo anterior es posible que necesites importar
como java.sql.ResultSet para que todo funcione correctamente.

algunas

clases

Ahora solo se debe de agregar una llamada al mtodo verificar() desde el botn
de Verificar en la clase interfaz.PantallaPrincipal, para realizarlo correctamente se
debe dar doble clic sobre el botn y posteriormente agregar el cdigo dentro del
mtodo creado de tal manera que quede as...
private void btnVerificarActionPerformed(java.awt.event.ActionEvent evt)
{
String nombre = JOptionPane.showInputDialog("Nombre a verificar:");

procedimientosSDK.verify(nombre);
}
Si corremos la aplicacin tras realizar lo anterior podremos verificar la huella capturada
actualmente contra otra en la base de datos y el sistema nos indicar si la huella
coincide o no...
Hasta aqu le dejamos en esta parte, si le has entendido correctamente a la lgica del
cdigo no te ser difcil crear el mtodo de identificar(), si lo deseas, puedes esperar a
la prxima entrega en la cual lo explicar paso a paso.

Programacin de un lector de huella


digital en Java. Parte 5.
Despus de una larga espera seguimos con el tutorial en su quinta parte (si no has ledo las
partes uno, dos, tres y cuatro te recomiendo que lo hagas antes de continuar). En este caso
toca el turno a la identificacin de personas por medio de su huella digital. Hasta el momento
ya tenemos resueltas las funciones para guardar y verificar as que falta poco para culminar
con

las

Recordemos

que

todos

los

funciones
procedimientos

los

estamos

bsicas.
realizando

en

la

clase

procedimientos.Util as que vayamos a dicha clase y creamos un mtodo de nombre


identificarPersona() que no recibe argumentos de ningn tipo, en un principo quedar de la
siguiente

manera:

/**
* Identifica a una persona registrada por medio de su huella digital
*/
public void identificarPersona(){

Ya que tenemos la definicin del mtodo debemos de brindarle un comportamiento pero para
decirle qu hacer primero debemos entenderlo. Para identificar una persona se necesita tomar
una muestra de la huella digital y posteriormente compararla con todas aquellas entre las
cuales se encuentra la persona, en este caso, entre todas las huellas registradas, si
encontramos un registro que coincida entonces tenemos a la persona que buscamos.

En

cdigo

Primero

se

obtenemos

traduce

todas

las

huellas

lo

de

la

base

siguiente:
de

datos...

ResultSet rsIdentificar = identificarStmt.executeQuery();

...posteriormente

iteramos

travs

de

todos

los

resultados...

huella

almacenada...

while(rsIdentificar.next()){

...en

cada

iteracin

obtenemos

la

plantilla

de

la

byte templateBuffer[] = rsIdentificar.getBytes("huehuella");

...y

la

creamos

para

posteriormente

utilizarla...

Template referenceTemplate = new Template(templateBuffer);

...ya que tenemos la plantilla de la base de datos la comparamos con la actual almacenando el
resultado

de

la

comparacin

en

una

variable...

boolean coinciden = fingerprintSDK.verify(template,referenceTemplate);

...si coinciden hacemos lo pertinente y rompemos el ciclo de iteracin y lo cerramos...

if (coinciden){
ui.showImage(GrFingerJava.getBiometricImage(template,

fingerprint,

fingerprintSDK));
JOptionPane.showMessageDialog(ui,

"La

huella

es

de

"+rsIdentificar.getString("huenombre"));
return;
}

...si hemos buscado en todas las huellas y no se encuentra se lo indicamos al usuario...

JOptionPane.showMessageDialog(ui,

"No

existe

ningn

registro

que

coincida con la huella.");

...y

listo!

Al finalizar debemos de encerrar el cdigo entre algunos try-catch para evitar errores al
momento

de

compilar,

el

mtodo

completo

queda

as:

/**
* verifica la huella digital actual contra otra en la base de datos
*/
public void identificarPersona() {
try {
//Obtiene todas las huellas de la bd
ResultSet rsIdentificar = identificarStmt.executeQuery();

//Si se encuentra el nombre en la base de datos


while(rsIdentificar.next()){
//Lee la plantilla de la base de datos
byte

templateBuffer[]

rsIdentificar.getBytes("huehuella");
//Crea una nueva plantilla
Template referenceTemplate = new Template(templateBuffer);

//compara las plantilas (actual vs bd)


boolean

coinciden

fingerprintSDK.verify(template,referenceTemplate);

//Si encuentra correspondencia dibuja el mapa


//e indica el nombre de la persona que coincidi.
if (coinciden){
ui.showImage(GrFingerJava.getBiometricImage(template,
fingerprint, fingerprintSDK));
JOptionPane.showMessageDialog(ui, "La huella es de
"+rsIdentificar.getString("huenombre"));

return;
}

//Si no encuentra alguna huella que coincida lo indica con un


mensaje
JOptionPane.showMessageDialog(ui, "No existe ningn registro
que coincida con la huella.");

} catch (SQLException e) {
e.printStackTrace();
} catch (GrFingerJavaException e) {
e.printStackTrace();
}
}

Posteriormente lo nico que debemos hacer es mandarlo llamar desde el botn de 'Identificar'
y listo! hemos terminado con las 3 funciones principales de un sistema de identificacin de
huellas digitales, solo necesitas adaptar estos mtodos a tu aplicacin y tendrs funcionalidad
total.
El plan no es terminar con esta serie de tutoriales con este artculo sino ahondar en
procedimientos un tanto ms especializados como comparaciones realizadas directamente por
el servidor (en aplicaciones cliente-servidor) para quitar trfico a la red por medio de un
servidor de aplicaciones, sin embargo, espero sus comentarios y opiniones al respecto, y si
tienen alguna consulta dejen su correo para hacerles llegar mi respuesta lo antes posible ya
que

no

he

podido

contestar

los

comentarios

aqu

directamente...

:::Actualizacin:::
A peticin de algunos de ustedes, aqu les dejo una liga para descargar el proyecto en formato
comprimido:

gaso / SingletonJDBC.java
Created on 29 Apr 2013

Code

Revisions1

Embed URL
<script src=

HTTPS clone URL


https://gist.gith

You can clone with HTTPS orSSH.

Download Gist
SingletonJDBC.java

Raw
123456789101112131415161718192021222324252627282930313
233343536373839404142434445464748495051525354555657585
960616263646566676869707172737475767778798081828384858
68788899091929394

import
java.sql.Connection;
import
java.sql.DriverManager;
import
java.sql.PreparedStatem
ent;
import
java.sql.SQLException;
import
javax.naming.Context;
import
javax.naming.InitialCont
ext;
import
javax.sql.DataSource;
import
javax.swing.JOptionPane
;
/**
*

* @author PCGASO
*/
public class bd {
//Instancia estatica de
la conexion, sino uno
llega a existir
private static
Connection connection
= null;
/**
*
* @return Devuelve
la instancia unica de
Conexion
*/
public static
Connection
getConexion() {
//Si la instancia no
ha sido creado aun, se
crea
if (bd.connection
== null) {
contruyendoConexion();
}
return
bd.connection;
}
//Obtener las
instancias de Conexion
JDBC
private static void
contruyendoConexion()
{
try {
Class.forName("org.post
gresql.Driver");
String url =
"jdbc:postgresql://localh
ost:5432/bd?
allowEncodingChanges=
true";
String usuario =
"postgres";
String clave =
"gidsoft";
bd.connection =
DriverManager.getConn
ection(url, usuario,
clave);
} catch
(ClassNotFoundExceptio
n e) {

System.out.println("Clas
sNotFoundException(co
ntruyendoConexion) : "
+ e.getMessage());
System.gc();
} catch
(SQLException e) {
System.out.println("SQL
Exception(contruyendoC
onexion) : " +
e.getMessage());
System.gc();
JOptionPane.showMessa
geDialog(null,
e.getMessage(), "No fue
Posible Conectar con la
Base de Datos",
JOptionPane.ERROR_ME
SSAGE);
System.exit(0);
} catch (Exception
e) {
System.out.println("
Exception General
(contruyendoConexion)
: " + e.getMessage());
System.gc();
}
}
public static void
liberarConexionS(Conne
ction conex) {
try {
conex.close();
} catch
(SQLException ex) {
System.out.println(esta
dosSQL.getM(ex.getSQL
State(),
ex.getMessage()));
}
}
/**
* Cierra la conexion.
Al provenir de
BasicDataSource, en
realidad no se
* esta cerrando. La
llamada a close() le
indica al
BasicDataSource que
* hemos terminado

con dicha conexion y


que puede asignarsela a
otro que la
* pida.
*
* @param conexion
*/
//esto es un pool de
conexiones, pero no se
esta usando
public static void
liberaConexion(Connecti
on conexion) {
try {
if (null !=
conexion) {
// En realidad
no cierra, solo libera la
conexion.
conexion.close();
}
} catch
(SQLException e) {
e.printStackTrace();
}
}
public static void
liberarStatement(Prepar
edStatement p){
try{
if(null != p){
p.close();
}
} catch
(SQLException e) {
e.printStackTrace();
}
}
}

You might also like