Desarrollo de un sistema de Huella Digital con Java y mySQL

Hola amigos, hace aproximadamente un mes publique un articulo, donde les enseñaba a desarrollar un sistema de autenticacion por huella digital utilizando como lenguaje de programación JAVA y como motor de bases de datos mySQL Server 5.1.

El día de hoy traigo el sistema completamente actualizado y modificado, de tal forma que les sirva a todos este pequeño tutorial, y lo puedan implementar en su lugar de trabajo.

El primero artículo fue publicado exactamente el 20 de Febrero de 2012, en este mismo blog y su URL es la siguiente: http://napster2011.wordpress.com/2012/02/20/lector-de-huella-digital-en-java/

Después de publicar esta nueva entrega de la programación de un lector de huella digital con JAV y mySQL, haré una tercera entrega donde presentare el mismo sistema pero utilizando como motor de bases de datos, Oracle 11g.

Sin más preámbulos, procedo a explicar el proceso:

Para el desarrollo del proyecto, utilicé el IDE para programar en Java de Oracle, llamado NetBeans 7.1

 

Como pueden observar, nuestro proyecto se llama LectorHuellas y consta de tres clases, y cada una de éstas (las clases) tiene su respectiva función dentro del proyecto:

Clase Interfaz

Esta clase contiene el archivo PantallaPrincipal.java y es quien se encarga de diseñar la interfaz principal de nuestro sistema de autenticación por huella digital.

Diseño de la pantalla principal de nuestro sistema

El contenido del archivo PantallaPrincipal.java es el siguiente:

/**
* @package: interfaz
* @class: PantallaPrincipal
* @author: Ricardo Rosero
* @version: 1.0
*/
package interfaz;

/**
* @librerias importadas
* @author: Ricardo Rosero
*/
import com.griaule.grfingerjava.GrFingerJavaException;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.BevelBorder;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import procedimientos.Util;

public class PantallaPrincipal extends javax.swing.JFrame {
/**
* @atributos
* @author: Ricardo Rosero
* @access: private
*/
//objecto usado para realizar todas las operaciones relacionadas al Fingerprint-SDK
private Util procedimientosSDK;
//Panel para mostrar la huella digital
private JPanel fingerprintViewPanel = null;
//Imagen de la huella actual
private BufferedImage fingerprintImage = null;

/**
* @function: PantallaPrincipal
* @author: Ricardo Rosero
* @access: public
* @return
*/
public PantallaPrincipal() {
inicializar();
initComponents();
procedimientosSDK.inicializarCaptura();
setLocationRelativeTo(null);
setVisible(true);
}

/**
* @function: inicializar
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void inicializar() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) {
System.err.println(“No se pudo aplicar el estilo visual”);
}
//Crea una instancia de Util
this.procedimientosSDK = new Util(this);
}

/**
* @function: crearPanelHuella
* @author: Ricardo Rosero
* @access: private
* @return
*/
private JComponent crearPanelHuella() {
//Crea un panel nuevo para mostrar la huella
fingerprintViewPanel = new JPanel(){
//Se sobreescribe el método paintComponent para habilitar la muestra de la imagen de la huella
public void paintComponent(Graphics g) {
super.paintComponent(g);
//Si hay una imagen para ser mostrada
if (fingerprintImage!=null) {
//Calcula el tamaño y posición de la imagen para ser pintada el tamaño es ajustado para que ocupe todo el tamaño del panel
Insets insets = getInsets();
int transX = insets.left;
int transY = insets.top;
int width = getWidth() – getInsets().right – getInsets().left;
int height = getHeight() – getInsets().bottom – getInsets().top;
//Se dibuja la imagen
g.drawImage(fingerprintImage, transX, transY, width, height, null);
}
}
};
//Se agrega un border alrededor del panel
fingerprintViewPanel.setBorder(new CompoundBorder (
new EmptyBorder (2,2,2,2),
new BevelBorder(BevelBorder.LOWERED)));
fingerprintViewPanel.setToolTipText(“Imagen de la última huella capturada.”);
if(fingerprintViewPanel==null){
System.exit(1);
return null;
}
else{
return fingerprintViewPanel;
}
}

/**
* @function: showImage
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void showImage(BufferedImage image) {
//Utiliza el imageProducer para crear una imagen de la huella digital
fingerprintImage = image;
//Se dibuja la nueva imagen
repaint();
}

/**
* @function: initComponents
* @author: Ricardo Rosero
* @access: private
* @return
*/
@SuppressWarnings(“unchecked”)
// <editor-fold defaultstate=”collapsed” desc=”Generated Code”>
private void initComponents() {

jPanel2 = new javax.swing.JPanel();
btnIdentificar = new javax.swing.JButton();
btnGuardar = new javax.swing.JButton();
btnSalir = new javax.swing.JButton();
PanelContenedor = new javax.swing.JPanel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowActivated(java.awt.event.WindowEvent evt) {
formWindowActivated(evt);
}
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});

jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED), “Acciones”, javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION));

btnIdentificar.setText(“Identificar”);
btnIdentificar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnIdentificarActionPerformed(evt);
}
});

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

btnSalir.setText(“Salir”);
btnSalir.setAlignmentY(0.0F);
btnSalir.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSalirActionPerformed(evt);
}
});

javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(btnIdentificar, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnGuardar, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(btnSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(100, 100, 100))))
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnGuardar, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnIdentificar, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(btnSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);

PanelContenedor.setBorder(javax.swing.BorderFactory.createTitledBorder(null, “Huella Digital”, javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION));
PanelContenedor.setLayout(new java.awt.BorderLayout());

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(PanelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, 364, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(PanelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, 353, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);

PanelContenedor.getAccessibleContext().setAccessibleParent(jPanel2);

pack();
}// </editor-fold>

/**
* @function: btnGuardarActionPerformed
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {
try {
//procedimientosSDK.guardarHuella();
//procedimientosSDK.guardarHuellaBackup();
procedimientosSDK.guardar();
} catch (GrFingerJavaException ex) {
Logger.getLogger(PantallaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* @function: btnSalirActionPerformed
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) {

dispose();
}
/**
* @function: formWindowActivated
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void formWindowActivated(java.awt.event.WindowEvent evt) {
this.PanelContenedor.add(this.crearPanelHuella());
}
/**
* @function: formWindowClosing
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void formWindowClosing(java.awt.event.WindowEvent evt) {

}
/**
* @function: btnIdentificarActionPerformed
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void btnIdentificarActionPerformed(java.awt.event.ActionEvent evt) {
try {
procedimientosSDK.identificarPersona();
} catch (GrFingerJavaException ex) {
Logger.getLogger(PantallaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* @atributos
* @author: Ricardo Rosero
* @access: private
*/
// Variables declaration – do not modify
private javax.swing.JPanel PanelContenedor;
private javax.swing.JButton btnGuardar;
private javax.swing.JButton btnIdentificar;
private javax.swing.JButton btnSalir;
private javax.swing.JPanel jPanel2;
// End of variables declaration
}

Clase Procedimientos

Esta clase contiene el archivo Util.java y su estructura es la siguiente:

/**
* @package: procedimientos
* @class: Util
* @author: Ricardo Rosero
* @version: 1.0
*/
package procedimientos;

/**
* @librerias importadas
* @author: Ricardo Rosero
*/
import com.griaule.grfingerjava.FingerprintImage;
import com.griaule.grfingerjava.GrFingerJava;
import com.griaule.grfingerjava.GrFingerJavaException;
import com.griaule.grfingerjava.IFingerEventListener;
import com.griaule.grfingerjava.IImageEventListener;
import com.griaule.grfingerjava.IStatusEventListener;
import com.griaule.grfingerjava.MatchingContext;
import com.griaule.grfingerjava.Template;
import com.mysql.jdbc.Blob;
import interfaz.PantallaPrincipal;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;
import java.io.InputStream;

public class Util implements IStatusEventListener, IImageEventListener, IFingerEventListener{
/**
* @atributos
* @author: Ricardo Rosero
* @access: public y private
*/
/**Contexto utilizado para la captura, extracción y coincidencia de huellas digitales */
private MatchingContext fingerprintSDK;
/**Interfaz de usuario donde se muestra la imagena de la huella*/
private PantallaPrincipal ui;
/** Indica si la plantilla o template debe ser extraída automáticamente*/
private boolean autoExtract = true;
/** Arreglo que contiene localmente los datos de las huellas capturadas */
private ByteArrayInputStream fingerprintData, fingerprintData2;
/**Arreglo que contiene la longitud del dato de la huella*/
private int fingerprintDataLength, fingerprintDataLenght2;
/** La imagen de la última huella digital capturada. */
private FingerprintImage fingerprint, fingerprint2;
/** La plantilla de la última imagen de huella capturada */
public com.griaule.grfingerjava.Template template, template2;
/** La conexion con la base de datos */
private Connection dbConnection;
/** Consultas SQL */
private PreparedStatement guardarStmt, guardar2;
private PreparedStatement identificarStmt;
private PreparedStatement verificarStmt;
private PreparedStatement verificarDatosUsuario;
private PreparedStatement verificaCedulaUsuario;
private PreparedStatement verificaCedulaHuellaUsuario;
private PreparedStatement verficaHuellaUsuario;

/**
* @function: Util
* @author: Ricardo Rosero
* @access: public
* @return
*/
public Util(PantallaPrincipal ui) {
this.ui = ui;
//Inicializa la conexión a la BD.
initDB();
}

/**
* @function: inicializarCaptura
* @author: Ricardo Rosero
* @access: public
* @return:
*/
public void inicializarCaptura() {
try {
fingerprintSDK = new MatchingContext();
//Inicializa la captura de huella digital.
GrFingerJava.initializeCapture(this);
}
catch (Exception e) {
//Si ocurre un error durante la inicialización se indica con un mensaje y se cierra la aplicación.
e.printStackTrace();
System.exit(1);
}
}

/**
* @function: initDB
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void initDB() {
try {
//Carga el driver ODBC
Class.forName(“com.mysql.jdbc.Driver”);
//Se conecta a la bd
dbConnection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/huellas”,”root”, “rrosero1980″);
Statement stm = dbConnection.createStatement();
//Prepara las consultas/sentencias que se utilizarán
guardarStmt = dbConnection.prepareStatement(“INSERT INTO huella(identificacion_usuario, nombres_usuario, huella1_usuario, huella2_usuario) values(?,?,?,”)”);
guardar2 = dbConnection.prepareStatement(“update huella set huella2_usuario=? where (identificacion_usuario=?)”);
identificarStmt = dbConnection.prepareStatement(“SELECT nombres_usuario, huella1_usuario, huella2_usuario FROM huella”);
verificarStmt = dbConnection.prepareStatement(“SELECT huella1 FROM huella WHERE nombres_usuario=?”);
verificarDatosUsuario = dbConnection.prepareStatement(“select * from huella where identificacion_usuario=?”);
verificaCedulaUsuario = dbConnection.prepareStatement(“select identificacion_usuario from huella where (identificacion_usuario=?)”);
verificaCedulaHuellaUsuario = dbConnection.prepareStatement(“select identificacion_usuario, huella1_usuario from huella where (identificacion_usuario=?)”);
verficaHuellaUsuario = dbConnection.prepareStatement(“selec * from huella where (huella1_usuario=?)”);
}
catch (Exception e) {
e.printStackTrace();
}
}

/**
* @function: destroyDB
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void destroyDB() {
try {
//Se cierran todas las sentencias
guardarStmt.close();
identificarStmt.close();
//Cierra la conexión a la base
dbConnection.close();
}
catch (Exception e) {
e.printStackTrace();
}
}

/**
* @function: setFingerprintSDKNativeDirectory
* @author: Ricardo Rosero
* @access: public
* @return
*/
public static void setFingerprintSDKNativeDirectory(String directorio) {
File directory = new File(directorio);
try {
GrFingerJava.setNativeLibrariesDirectory(directory);
GrFingerJava.setLicenseDirectory(directory);
}
catch (GrFingerJavaException e) {
e.printStackTrace();
}
}

/**
* @function: onSensorPlug
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void onSensorPlug(String idSensor) {
try {
//Comienza la captura con el lector conectado.
GrFingerJava.startCapture(idSensor, this, this);
}
catch (GrFingerJavaException e) {
//Indica si ha ocurrido un error con el lector.
e.printStackTrace();
}
}

/**
* @function: onSensorUnPlug
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void onSensorUnplug(String idSensor) {
try {
GrFingerJava.stopCapture(idSensor);
}
catch (GrFingerJavaException e) {
//Indica si ha ocurrido un error con el lector.
e.printStackTrace();
}
}

/**
* @function: onImageAcquired
* @author: Ricardo Rosero
* @access: public
* @return
*/
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();
}

/**
* @function: extrac
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void extract() {
try {
//Extracts a template from the current fingerprint image.
template = fingerprintSDK.extract(fingerprint);
//display minutiae/segments/directions into image
ui.showImage(GrFingerJava.getBiometricImage(template,fingerprint));
}
catch (GrFingerJavaException e) {
e.printStackTrace();
}
}

/**
* @function: guardar
* @author: Ricardo Rosero
* @access: public
* @return
* @throws: GrFingerJavaException
*/
public void guardar() throws GrFingerJavaException{
fingerprintData = new ByteArrayInputStream(template.getData());
fingerprintDataLength = template.getData().length;
String cedula = JOptionPane.showInputDialog(“No. Identificacion:”);
boolean coinciden = false;
try{
verificaCedulaHuellaUsuario.setInt(1, Integer.parseInt(cedula));
ResultSet rs = verificaCedulaHuellaUsuario.executeQuery();
//ResultSet rs2 = verficaHuellaUsuario.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(2); //.getBytes(2);
//Crea una nueva plantilla
Template referenceTemplate = new Template(templateBuffer);
//compara las plantilas (actual vs bd)
coinciden = fingerprintSDK.verify(template,referenceTemplate);
if(coinciden){
JOptionPane.showMessageDialog(null, “La huella ya existe, coloque un dedo diferente”);
}
else{
guardar2.setBinaryStream(1, fingerprintData, fingerprintDataLength);
guardar2.setInt(2, Integer.parseInt(cedula));
guardar2.execute();
JOptionPane.showMessageDialog(null, “Ha guarado la huella de backup”);
}
}
else if(!rs.next()){
String nombre = JOptionPane.showInputDialog(“Nombre y Apellido:”);
guardarStmt.setInt(1,Integer.parseInt(cedula));
guardarStmt.setString(2,nombre);
guardarStmt.setBinaryStream(3, fingerprintData, fingerprintDataLength);
guardarStmt.execute();
JOptionPane.showMessageDialog(null, “La huella ha sido guardada con exito”);
}
}
catch(SQLException sqlEx){
sqlEx.printStackTrace();
System.out.println(“Se produjo el siguiente error: “+sqlEx.getMessage());
}
}

/**
* @function: onFingerDown
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void onFingerDown(String idSensor) {
}

/**
* @function: onFingerUp
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void onFingerUp(String arg0) {
}

/**
* @function: onFingerUp
* @author: Ricardo Rosero
* @access: public
* @return
* @throws: GrFingerJavaException
*/
public void identificarPersona() throws GrFingerJavaException{
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()){
byte templateBuffer[] = rsIdentificar.getBytes(“huella1_usuario”);
Template referenceTemplate = new Template(templateBuffer);
if(referenceTemplate!=null){
//Lee la plantilla de la base de datos
boolean coinciden = fingerprintSDK.verify(template,referenceTemplate);
//Si encuentra correspondencia dibuja el mapa e indica el nombre de la persona que coincidió.
if (coinciden){
JOptionPane.showMessageDialog(null, “Bienvenido “+rsIdentificar.getString(“nombres_usuario”));
return;
}
}
}
//Si no encuentra alguna huella que coincida lo indica con un mensaje
JOptionPane.showMessageDialog(null, “No existe ningún registro que coincida con la huella.”);
}
catch (SQLException e) {
System.out.println(“Se produjo el siguiente error: “+e.getMessage());
e.printStackTrace();
}
catch(GrFingerJavaException gr){
System.out.println(“Error con el scanner: “+gr.getMessage());
gr.printStackTrace();
}
}
}

Cabe recordar que esta clase es la más importante de todas, debido a que en esta clase procedemos a conectar nuestro sistema de autenticacion con el motor de bases de datos mySQL.

Clase LectorHuella

Esta clase es la más sencilla de todas, y contiene el archivo Main.java , la función de esta clase es simple, se encarga de ejecutar nuestro programa, y su estructura es la siguiente:

/**
* @package: lectorhuellas
* @class: Main
* @author: Ricardo Rosero
* @version: 1.0
*/
package lectorhuellas;

/**
* @librerias importadas
* @author: Ricardo Rosero
*/
import interfaz.PantallaPrincipal;
import java.io.File;
import procedimientos.Util;

public class Main {
/**
* @function: main
* @author: Ricardo Rosero
* @access: public
* @param: args argumentos de la funcion
* @return
*/
public static void main(String[] args) {
String grFingerNativeDirectory = new File(“.”).getAbsolutePath();
Util.setFingerprintSDKNativeDirectory(grFingerNativeDirectory);
PantallaPrincipal p = new PantallaPrincipal();
}
}

Como pueden observar en cada una de las clases importamos la librería com.griaule.grfingerjava.*; , este paquete es pago, y hace parte del FingerprintSDK2009 de la empresa Griaule Biometrics. Actualmente es el mejor SDK para la compilación de sistemas de autenticacion basados en huella digital, este paquete tiene la capacidad de comparar 35 mil huellas por segundo.

La estructura de nuestra base de datos en mySQL es la siguiente:

– ——————————————————–
– Host: 127.0.0.1
– Server version: 5.1.36-community – MySQL Community Server (GPL)
– Server OS: Win32
– HeidiSQL version: 7.0.0.4053
– Date/time: 2012-03-29 13:47:53
– ——————————————————–

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET FOREIGN_KEY_CHECKS=0 */;

– Dumping database structure for huellas
DROP DATABASE IF EXISTS `huellas`;
CREATE DATABASE IF NOT EXISTS `huellas` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `huellas`;
– Dumping structure for table huellas.huella
DROP TABLE IF EXISTS `huella`;
CREATE TABLE IF NOT EXISTS `huella` (
`identificacion_usuario` bigint(20) unsigned NOT NULL,
`nombres_usuario` varchar(250) NOT NULL,
`huella1_usuario` blob NOT NULL,
`huella2_usuario` blob NOT NULL,
PRIMARY KEY (`identificacion_usuario`),
KEY `cedula` (`identificacion_usuario`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

– Data exporting was unselected.
/*!40014 SET FOREIGN_KEY_CHECKS=1 */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

Espero amigos que este pequeño tutotrial de la implementación de un sistema de autenticación basado en huella digital, utilizando JAVA y mySQL les haya servido para sus vidas y puedan implementarlo en sus lugares de trabajo.

NAPSTER2011

About these ads

53 thoughts on “Desarrollo de un sistema de Huella Digital con Java y mySQL

  1. disculpa napster2011 he descargado el SDK de DigitalPersona pero me marca un error al igual que en unos archivos, podrias ayudarme o tienes algun otro link de descarga

  2. Caarajp no puedo terminar el proyecto, no se como usar la tal com.griaule.grfingerjava, podrias hacer un video mejor, hay videos en vivo donde se sube almismo tiempo que grabas con Google+ Hangouts, es facil y mientras lo grabas puede ser privado ya despues puedes ponerlo publico y puedes grabar todo el tiempo que quieras ….. siii

  3. Para esta aplicacion es necesario tener un lector de huellas conectado a la pc, ya que lo que yo deseo es detectar las huellas con el lector de huellas q se encuentra en mi laptop y cuando hago correr el programa no me detecta la huella, por eso mi pregunta es si tengo que necesariamente tener conectado un lector de huellas de digitalpersonal por favor si podrian ayudarme o como podria modificarlo

  4. Hola, primero que nada agradecerte porque he estado buscando este código en específico y nada que lo conseguía…. Acá estamos desarrollando un sistema y la persona que tomo esto no te nombro en ningún lado del código queriéndose llevar el crédito, pero ni los nombres a las variables o métodos fue capaz de hacer, así que una vez mas GRACIAS POR EL APORTE!!!!!!

    Ahora mi duda, el sistema actualmente se cuelga al procesar unas 3 o 4 huellas, ¿porque crees que pueda ser?… Saludos!!!

  5. Buen dia Amigo soy miguel estoy desarrollando un proyecto de entradas y salidas para mi escuela y ando trabajando en netbeans y Mysql cre que me podrias alludar a conectar mi lector con mi proyecto aun tengo un error a la ora de correr el main saludos y que tengas un buen dia :)

    1. mira este es el error espero que me puedan ayudar …… :(

      com.griaule.grfingerjava.GrFingerJavaException: License not found or read error
      at com.griaule.grfingerjava.MatchingContext.createContext(MatchingContext.java:95)
      at com.griaule.grfingerjava.MatchingContext.createContext(MatchingContext.java:95)
      at com.griaule.grfingerjava.MatchingContext.(MatchingContext.java:138)
      at procedimientos.Util.inicializarCaptura(Util.java:93)
      at interfaz.PantallaPrincipal.(PantallaPrincipal.java:39)
      at ejemplolectorhuellas.EjemploLectorHuellas.main(EjemploLectorHuellas.java:26)

  6. Hola tengo un lector de huella de zkteco el ma 300 me gustaria que me ayudes con un metodo para poder extraer los registros que se guardan el equipo de manera automatica cada cierto tiempo para luego poder guardarlas en una base de datos

  7. Ola como vas mi nombre es Diana, casualmente estoy trabajando en un proyecto encargado del control y entrada de una empresa pero hasta ahora estamos trabajando con netbeans en iniciar sesión, registro… etc lo básico porque no tenemos muchas bases en java me gustaria saber que es lo que debo hacer para que me funcione el lector de huella con mi proyecto. :D gracias me serviría de gran ayuda ;)

  8. yo hice un applet, la duda es que no veo qel evento “capta huella no conectado” no se como saber, si lo desconecto puedo capturar ese evente en fingerprint unplugged, pero si inicio la aplicacion sin captahuella, el sdk no me da esa respuesta

  9. Buenos dias amigo queria saber como haces con la clase pantalla principal cuando uno creo con netbeas una clase frame hay un codio que no deja editar ni borrar y no puedo remmplazar el codigo si es de tu alcanse ayudarme en esto te lo agradeceria mcuhas gracias

  10. disculpa amigo que lector debo comprar para que funcione con ese proyecto? soy algo nuevo en esto pero estoy desarrollando un sistema en java netbeans7.1 y acces 2007, y me gustaria implementar el registro de personal por medio de el lector de huellas digitales, me podrias dar alguna orientacion sobre el tema? de antemano muchas gracias

  11. Hola ya lo puse a funcionar pero como hago para insertar la hora de entrada en otra tabla, esto con el fin de controlar la llegada del personal. Esto seria bueno que lo haga cuando identifica y encuentra la huella ahi donde dice bien venido+Nombre. Es que en java no tengo ni idea de guardar datos en una tabla, yo lo hago en PHP

  12. Hola yo trabajo con PHP, ya hice todo el proyecto, como lo ejecuto? lo hice con NetBeans tal como esta en el instructivo.
    Dentro de la carpeta de mi servidor que do asi c:\wamp\www\lector, aqui quedaron todos los directorios con sus respectivos archivos.java.
    Otra inquietud porque los archivos.java, no se supone que deberian ser .js?.
    La pregunta exacta es como lo integro a mi pagina HTML

  13. Hola..como estas? estoy desarrollando un software control de acceso, con java y mysql..pero tengo a mi disposicion el lector de Microsoft..este tutorial me servira para guiarme? me puedes recomendar un sdk para este lector? Muchisimas gracias de ante mano.

      1. Hola amigos, para los que usen el sistema o traen de desarrollar algo
        o cuento con el Fingerprint FULL , con crack para utilizarlo sin tener que comprar la licencia y jamas se vencera…
        ya tengo un año con el y no a vencido
        interezados envien mensaje a mi coreo angel_solano@outlook.com

  14. Hola cuando ejecuto el codigo me sale lo siguiente:
    Exception in thread “main” java.lang.UnsatisfiedLinkError: no grfingerjava in java.library.path
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at com.griaule.grfingerjava.GrFingerJavaNative.loadLibrary(GrFingerJavaNative.java:52)
    at com.griaule.grfingerjava.GrFingerJavaNative.(GrFingerJavaNative.java:34)
    at com.griaule.grfingerjava.GrFingerJava.setLicenseDirectory(GrFingerJava.java:96)
    at procedimientos.Util.setFingerprintSDKNativeDirectory(Util.java:82)
    at lectorhuellas.LectorHuella.main(LectorHuella.java:27)

    y ya exporte el jar de grfinderjava, me podrias colaborar

    1. Hola Dany, dices que ya te funciono me podiras indicar como lo hiciste. Es que estoy un poco confundido ya que yo trabajo es con PHP y no se como adjuntar este proyecto a una pagina HTML

      1. Dany lo que pasa es que mi lector es un Microsoft Fingerprint, lo puse hacer funcionar con el SDK de Griaule, pero resulta que me saca un error de licencia, mas excatamente este: com.griaule.grfingerjava.GrFingerJavaException: Invalid license. Yo se que hay que comprar esta licencia pero yo necesito poner a correr el proyecto para poder pedir la plata para comprarlo, quisiera siquiera una licencia de prueba que una vez terminado el proyecto yo compro la licencia Date: Fri, 24 May 2013 01:39:36 +0000 To: tecnodatacompu@hotmail.com

      1. Hola Ernesto, Todavia tienes el proyecto? Estoy trabajndo en un sistema captahuellas en mi trabajo, y quiero saber como hacer para qye me funcione el captahuellas. Gracias

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s