PROGRAMACION DE 4500 FINGERPRINT READER DIGITAL PERSONA EN JAVA CON WINDOWS 7-PARTE3
FINAL
Para todos aquellos que con tanta paciencia estuvieron pendientes del blog y de esta entrada, espero culminar el año entregándoles la parte final de la programación del lector digital persona 4500, es por ello que en esta ultima parte, centraremos la atención de programar las huellas capturada desde el lector hacia o dirigida a una base de datos; como base proyecto que en los que necesitemos estos métodos de guardar, verificar y verificar.
Por otra parte recordamos que en la parte 2, habíamos quedado hasta como mostrar en el en el panel de JFrame la huella dactilar capturada por el lector, como además una área de texto que nos permitía visualizar los distintos eventos que habíamos declarado para el lector, y también la cantidad de huellas dactilares necesarias para construir un template de una huella con el fin de que en esta parte, podamos guardarla, verificarla e identificarla.
Continuando con esta última parte lo que realizaremos será;
1. Crearemos un nuevo paquete, que llamaremos BD, y dentro de este creamos una clase llamada ConexionBD.
2. Luego en la clase creada declararemos lo siguiente:
• Los imports necesarios para establecer la conexión respectiva con la BD, que hemos creado en MySQL, en la primera parte de este tutorial.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.swing.JOptionPane;
No importa que marque que los import aun no esten usados, ya que esto lógico porque aun no hemos declarado ninguna sentecia o varible que use estos imports.
• Declaremos estas variables después de la clase principal, que nos permitaran contener los valores de la conexión de la BD, el servidor, user, password, etc.
Hay que recordar que los valores de estas variables pueden cambiar según la lógica de programación de cada uno, y además de cómo tengan configurado Mysql en su equipo. Por defecto estos son los valores con lo que la mayoría intalan mysql como además el nombre de la BD que habíamos creado en la primera parte.
Hay que recordar que los valores de estas variables pueden cambiar según la lógica de programación de cada uno, y además de cómo tengan configurado Mysql en su equipo. Por defecto estos son los valores con lo que la mayoría intalan mysql como además el nombre de la BD que habíamos creado en la primera parte.
public String puerto="3306";
public String nomservidor="localhost";
public String db="huellas";
public String user="root";
public String pass="root";
Connection conn=null;
public String nomservidor="localhost";
public String db="huellas";
public String user="root";
public String pass="root";
Connection conn=null;
• Crearemos una función o método llamado conectar y otro desconectar, el cual contendrá los parámetros de conexión y desconexión con la BD, como además un try catch que permitirá capturar las excepciones que puedan presentar a la hora de intentar conectar con la BD.
public Connection conectar(){
try{
String ruta="jdbc:mysql://";
String servidor=nomservidor+":"+puerto+"/";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(ruta+servidor+db,user,pass);
if (conn!=null){
System.out.println("Conección a base de datos listo...");
}
else if (conn==null)
{
throw new SQLException();
}
}catch(SQLException e){
JOptionPane.showMessageDialog(null, e.getMessage());
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "Se produjo el siguiente error: "+e.getMessage());
}catch (NullPointerException e){
JOptionPane.showMessageDialog(null, "Se produjo el siguiente error: "+e.getMessage());
}finally{
return conn;
}
}
public void desconectar(){
conn = null;
System.out.println("Desconexion a base de datos listo...");
}
try{
String ruta="jdbc:mysql://";
String servidor=nomservidor+":"+puerto+"/";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(ruta+servidor+db,user,pass);
if (conn!=null){
System.out.println("Conección a base de datos listo...");
}
else if (conn==null)
{
throw new SQLException();
}
}catch(SQLException e){
JOptionPane.showMessageDialog(null, e.getMessage());
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "Se produjo el siguiente error: "+e.getMessage());
}catch (NullPointerException e){
JOptionPane.showMessageDialog(null, "Se produjo el siguiente error: "+e.getMessage());
}finally{
return conn;
}
}
public void desconectar(){
conn = null;
System.out.println("Desconexion a base de datos listo...");
}
También declaramos un constructor que me permitirá llamar una nueva intancia de la clase ConexionBD.
4. Ahora nos centraremos en crear cada método, para guardar, verificar e identificar la huella dactilar capturada.
• Así que empezamos creando el método de guardarHuella.
/*
* 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
ByteArrayInputStream datosHuella = new ByteArrayInputStream(template.serialize());
Integer tamañoHuella=template.serialize().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
Connection c=con.conectar();
PreparedStatement guardarStmt = c.prepareStatement("INSERT INTO somhue(huenombre, huehuella) values(?,?)");
guardarStmt.setString(1,nombre);
guardarStmt.setBinaryStream(2, datosHuella,tamañoHuella);
//Ejecuta la sentencia
guardarStmt.execute();
guardarStmt.close();
JOptionPane.showMessageDialog(null,"Huella Guardada Correctamente");
con.desconectar();
btnGuardar.setEnabled(false);
btnVerificar.grabFocus();
} catch (SQLException ex) {
//Si ocurre un error lo indica en la consola
System.err.println("Error al guardar los datos de la huella.");
}finally{
con.desconectar();
}
}
/*
* 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
ByteArrayInputStream datosHuella = new ByteArrayInputStream(template.serialize());
Integer tamañoHuella=template.serialize().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
Connection c=con.conectar();
PreparedStatement guardarStmt = c.prepareStatement("INSERT INTO somhue(huenombre, huehuella) values(?,?)");
guardarStmt.setString(1,nombre);
guardarStmt.setBinaryStream(2, datosHuella,tamañoHuella);
//Ejecuta la sentencia
guardarStmt.execute();
guardarStmt.close();
JOptionPane.showMessageDialog(null,"Huella Guardada Correctamente");
con.desconectar();
btnGuardar.setEnabled(false);
btnVerificar.grabFocus();
} catch (SQLException ex) {
//Si ocurre un error lo indica en la consola
System.err.println("Error al guardar los datos de la huella.");
}finally{
con.desconectar();
}
}
Luego de haber declarado este método se marcaran 4 errores sobre algunas líneas de código, y esto es porque no se han importado los imports necesarios para cada línea así que lo que haremos es con la ayuda de Netbeans, posicionamos el cursor sobre cada símbolo que marca error, y presionamos clic izquierdo, y le daremos añadir import… así;
• Seguimos creando el método de verificarHuella.
Luego declararemos el método de verificarHuella, la cual funciona con la ayuda del usuario, es decir este método se basa en que el usuario le pasa un parámetro especifico al sistema de la BD, para que este filtre según este parámetro, que para este caso sería el nombre con que se guardo la huella dactilar, pero cabe resaltar que puede ser usado con cualquier otro tipo de parámetro con que se halla guardado la huella, puede ser con el ID, si sabe y si también hay un campo en la tabla de CC o ID de usuario, en fin, la lógica con que se use es variada.
/**
* Verifica la huella digital actual contra otra en la base de datos
*/
public void verificarHuella(String nom) {
try {
//Establece los valores para la sentencia SQL
Connection c=con.conectar();
//Obtiene la plantilla correspondiente a la persona indicada
PreparedStatement verificarStmt = c.prepareStatement("SELECT huehuella FROM somhue WHERE huenombre=?");
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 a partir de la guardada en la base de datos
DPFPTemplate referenceTemplate = DPFPGlobal.getTemplateFactory().createTemplate(templateBuffer);
//Envia la plantilla creada al objeto contendor de Template del componente de huella digital
setTemplate(referenceTemplate);
// Compara las caracteriticas de la huella recientemente capturda con la
// plantilla guardada al usuario especifico en la base de datos
DPFPVerificationResult result = Verificador.verify(featuresverificacion, getTemplate());
//compara las plantilas (actual vs bd)
if (result.isVerified())
JOptionPane.showMessageDialog(null, "Las huella capturada coinciden con la de "+nom,"Verificacion de Huella", JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(null, "No corresponde la huella con "+nom, "Verificacion de Huella", JOptionPane.ERROR_MESSAGE);
//Si no encuentra alguna huella correspondiente al nombre lo indica con un mensaje
} else {
JOptionPane.showMessageDialog(null, "No existe un registro de huella para "+nom, "Verificacion de Huella", JOptionPane.ERROR_MESSAGE);
}
} catch (SQLException e) {
//Si ocurre un error lo indica en la consola
System.err.println("Error al verificar los datos de la huella.");
}finally{
con.desconectar();
}
}
/**
* Verifica la huella digital actual contra otra en la base de datos
*/
public void verificarHuella(String nom) {
try {
//Establece los valores para la sentencia SQL
Connection c=con.conectar();
//Obtiene la plantilla correspondiente a la persona indicada
PreparedStatement verificarStmt = c.prepareStatement("SELECT huehuella FROM somhue WHERE huenombre=?");
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 a partir de la guardada en la base de datos
DPFPTemplate referenceTemplate = DPFPGlobal.getTemplateFactory().createTemplate(templateBuffer);
//Envia la plantilla creada al objeto contendor de Template del componente de huella digital
setTemplate(referenceTemplate);
// Compara las caracteriticas de la huella recientemente capturda con la
// plantilla guardada al usuario especifico en la base de datos
DPFPVerificationResult result = Verificador.verify(featuresverificacion, getTemplate());
//compara las plantilas (actual vs bd)
if (result.isVerified())
JOptionPane.showMessageDialog(null, "Las huella capturada coinciden con la de "+nom,"Verificacion de Huella", JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(null, "No corresponde la huella con "+nom, "Verificacion de Huella", JOptionPane.ERROR_MESSAGE);
//Si no encuentra alguna huella correspondiente al nombre lo indica con un mensaje
} else {
JOptionPane.showMessageDialog(null, "No existe un registro de huella para "+nom, "Verificacion de Huella", JOptionPane.ERROR_MESSAGE);
}
} catch (SQLException e) {
//Si ocurre un error lo indica en la consola
System.err.println("Error al verificar los datos de la huella.");
}finally{
con.desconectar();
}
}
Cuando se crea este método también veremos algunos errores, por lo que al igual que en el método anterior, importaremos los imports necesarios para corregir estos errores.
• Finalmente creamos el método de identificarHuella.
Por ultimo declararemos el método de identificarHuella, el cual se basa en que al capturar la huella dactilar, prescionando el botón de identificar, este se encarga de comparar cada huella dactilar guardada en la BD con la capturada y decir a quien pertenece esta huella.
/**
* Identifica a una persona registrada por medio de su huella digital
*/
public void identificarHuella() throws IOException{
try {
//Establece los valores para la sentencia SQL
Connection c=con.conectar();
//Obtiene todas las huellas de la bd
PreparedStatement identificarStmt = c.prepareStatement("SELECT huenombre,huehuella FROM somhue");
ResultSet rs = identificarStmt.executeQuery();
//Si se encuentra el nombre en la base de datos
while(rs.next()){
//Lee la plantilla de la base de datos
byte templateBuffer[] = rs.getBytes("huehuella");
String nombre=rs.getString("huenombre");
//Crea una nueva plantilla a partir de la guardada en la base de datos
DPFPTemplate referenceTemplate = DPFPGlobal.getTemplateFactory().createTemplate(templateBuffer);
//Envia la plantilla creada al objeto contendor de Template del componente de huella digital
setTemplate(referenceTemplate);
// Compara las caracteriticas de la huella recientemente capturda con la
// alguna plantilla guardada en la base de datos que coincide con ese tipo
DPFPVerificationResult result = Verificador.verify(featuresverificacion, getTemplate());
//compara las plantilas (actual vs bd)
//Si encuentra correspondencia dibuja el mapa
//e indica el nombre de la persona que coincidió.
if (result.isVerified()){
//crea la imagen de los datos guardado de las huellas guardadas en la base de datos
JOptionPane.showMessageDialog(null, "Las huella capturada es de "+nombre,"Verificacion de Huella", JOptionPane.INFORMATION_MESSAGE);
return;
}
}
//Si no encuentra alguna huella correspondiente al nombre lo indica con un mensaje
JOptionPane.showMessageDialog(null, "No existe ningún registro que coincida con la huella", "Verificacion de Huella", JOptionPane.ERROR_MESSAGE);
setTemplate(null);
} catch (SQLException e) {
//Si ocurre un error lo indica en la consola
System.err.println("Error al identificar huella dactilar."+e.getMessage());
}finally{
con.desconectar();
}
}
/**
* Identifica a una persona registrada por medio de su huella digital
*/
public void identificarHuella() throws IOException{
try {
//Establece los valores para la sentencia SQL
Connection c=con.conectar();
//Obtiene todas las huellas de la bd
PreparedStatement identificarStmt = c.prepareStatement("SELECT huenombre,huehuella FROM somhue");
ResultSet rs = identificarStmt.executeQuery();
//Si se encuentra el nombre en la base de datos
while(rs.next()){
//Lee la plantilla de la base de datos
byte templateBuffer[] = rs.getBytes("huehuella");
String nombre=rs.getString("huenombre");
//Crea una nueva plantilla a partir de la guardada en la base de datos
DPFPTemplate referenceTemplate = DPFPGlobal.getTemplateFactory().createTemplate(templateBuffer);
//Envia la plantilla creada al objeto contendor de Template del componente de huella digital
setTemplate(referenceTemplate);
// Compara las caracteriticas de la huella recientemente capturda con la
// alguna plantilla guardada en la base de datos que coincide con ese tipo
DPFPVerificationResult result = Verificador.verify(featuresverificacion, getTemplate());
//compara las plantilas (actual vs bd)
//Si encuentra correspondencia dibuja el mapa
//e indica el nombre de la persona que coincidió.
if (result.isVerified()){
//crea la imagen de los datos guardado de las huellas guardadas en la base de datos
JOptionPane.showMessageDialog(null, "Las huella capturada es de "+nombre,"Verificacion de Huella", JOptionPane.INFORMATION_MESSAGE);
return;
}
}
//Si no encuentra alguna huella correspondiente al nombre lo indica con un mensaje
JOptionPane.showMessageDialog(null, "No existe ningún registro que coincida con la huella", "Verificacion de Huella", JOptionPane.ERROR_MESSAGE);
setTemplate(null);
} catch (SQLException e) {
//Si ocurre un error lo indica en la consola
System.err.println("Error al identificar huella dactilar."+e.getMessage());
}finally{
con.desconectar();
}
}
Cuando se crea este método también veremos algunos errores, por lo que al igual que en los método anteriores, importaremos los imports necesarios para corregir estos errores.
5. Finalmente, después de haber creado todo esto métodos, solo resta llamar los respectivos métodos en los eventos cuando se presionen cada botón.
• Empezamos con el botón de Guardar.
guardarHuella();
Reclutador.clear();
lblImagenHuella.setIcon(null);
start();
guardarHuella();
Reclutador.clear();
lblImagenHuella.setIcon(null);
start();
• Seguimos con el botón de Verificar.
String nombre = JOptionPane.showInputDialog("Nombre a verificar:");
verificarHuella(nombre);
Reclutador.clear();
• Por último el botón Identificar.
try {
identificarHuella();
Reclutador.clear();
} catch (IOException ex) {
Logger.getLogger(CapturaHuella.class.getName()).log(Level.SEVERE, null, ex);
}
En este punto también, importaremos los import necesario que permitan corregir los errores presentado.
try {
identificarHuella();
Reclutador.clear();
} catch (IOException ex) {
Logger.getLogger(CapturaHuella.class.getName()).log(Level.SEVERE, null, ex);
}
En este punto también, importaremos los import necesario que permitan corregir los errores presentado.
-------------------------------------------------------------------------------------------------------------
Eso es todo, espero le sirva y no olviden en comentar, nos vemos después cuando surja una inquietud y podamos resolverla… SALUDOS JARC..!
QUE DIOS BENDIGA A TODOS LOS QUE ESTUVIERON PENDIENTES DE ESTA ENTRADA Y LE HALLA SERVIDO DE ALGO, QUE PASEN UNA FELIZ NAVIDAD Y UN PROSPERO AÑO NUEVO.
QUE DIOS BENDIGA A TODOS LOS QUE ESTUVIERON PENDIENTES DE ESTA ENTRADA Y LE HALLA SERVIDO DE ALGO, QUE PASEN UNA FELIZ NAVIDAD Y UN PROSPERO AÑO NUEVO.
Tambien les dejos un documento pdf con el desarrollo de esta ultima parte del Tutorial. Aqui
Y lo que todos esperan, el codigo fuente, pues aqui se los dejo y espero por lo menos comenten si de algo le ha servido. Aqui
DEDICADO A TODOS AQUELLOS QUE CON PACIENCIA ESPERARON AL DESARROLLO DE ESTE TUTORIAL Y OJALA HALLAMOS ENTENDIDO EL TEMA, ESPERO ESTA ULTIMA PARTE SEA EL REGALO QUE MUCHOS NECESISTABAN, SALUDOS...
Y lo que todos esperan, el codigo fuente, pues aqui se los dejo y espero por lo menos comenten si de algo le ha servido. Aqui
DEDICADO A TODOS AQUELLOS QUE CON PACIENCIA ESPERARON AL DESARROLLO DE ESTE TUTORIAL Y OJALA HALLAMOS ENTENDIDO EL TEMA, ESPERO ESTA ULTIMA PARTE SEA EL REGALO QUE MUCHOS NECESISTABAN, SALUDOS...
!EL CONOCIMIENTO AUMENTA CUANDO SE COMPARTE¡
¡feliz navidad a todas las familias de colombia y en especial aquellas que han sido asotadas por estos desastres naturales, que recuerden que Dios nunca nos olvida.!