Page 1 of 1

Lector Biométrico

Posted: Thu Feb 19, 2015 5:44 am
by Prodix
Estimados colegas,
Estoy tratando de crear una aplicación de ingreso de personas con lector biométrico U.are.U 4500 Digital Persona, estuve chequeando los posts anteriores, pero no tengo aún resultados satisfactorios, sólo llegue hasta: oWnd:cTitle(Time()+" "+Str(ret)+" "+Str(nId)+" "+Str(nIdScore)).
Si alguien pudiera extenderme una manita, please.

Re: Lector Biométrico

Posted: Thu Feb 19, 2015 11:33 am
by russimicro
Buen día...

También estoy intentando con un ejemplo publicado en este foro... pero marca error en el oFingerX:Do("Initialize") ???


IF IsActiveX("GrFingerX.GrFingerXCtrl")
DEFINE dialog oWndx TITLE "FiveWin ActiveX Support"
oFingerX = TActiveX():New( oWndx, "GrFingerX.GrFingerXCtrl.1")
oWndx:oClient = oFingerX
oFingerX:Do("Initialize")


Por ahora la solución fue adaptar un ejemplo (java escritorio) que encontré en este blog y funciona perfecto...
http://blogjarc.blogspot.com/2011/10/pr ... eader.html

Pero me interesa poder hacerlo desde fivewin + xharbour....

Saludos
JONSSON RUSSI TELLO
Colombia

Re: Lector Biométrico

Posted: Thu Feb 19, 2015 3:15 pm
by karinha

Re: Lector Biométrico

Posted: Thu Feb 19, 2015 3:19 pm
by elvira
Hola JONSSON,

¿Has conseguido adaptar el JavaScript a Harbour?.

Muy agradecida ;

Re: Lector Biométrico

Posted: Thu Feb 19, 2015 5:55 pm
by Prodix
JONSSON:
Gracias por responder, la verdad no sé nada de Java y creo se me haría muy cuesta arriba.

João Santos:
Gracias por responder, si chequee anteriormente el post, pero me he "trancado" en una parte, ni modo, tendré que dedicarle más horas para salir del atolladero, chequearé más al detalle el ejemplo de Vailton (Biometría) y la clase de Pablo Botella (ClassGriaule).

Si algún colega lo tiene resuelto, pago por sus honorarios, escríbanme a cliperiano@hotmail.com (si, tienen razón, debería tener otro correo, creo que cliperiano_novato@hotmail.com sería más atinado :) ).

Elvira:
Apenas tenga avances significativos, con gusto los compartiré en el foro.

Re: Lector Biométrico

Posted: Thu Feb 19, 2015 6:22 pm
by karinha
Creo, sea algo +- asi:

Code: Select all

#Include "FiveWin.ch"

STATIC xLib

function Main()

   Local contextId,Ret

   lChDir("C:\Arquivos de programas\Griaule\GrFinger 4.1 FREE\bin")

   xLib:=LoadLibrary("GrFingerX.dll")

   Ret:=GrInitialize()

   ? ret

   contextId:=0

   Ret:=GrCreateContext(@contextId)
   Ret:=GrFinalize()

   FreeLibrary(xLib)

RETURN nil
*****************************

DLL32 FUNCTION GrInitialize() AS _INT PASCAL LIB xLib
DLL32 FUNCTION GrFinalize() AS _INT PASCAL LIB xLib
DLL32 FUNCTION GrCreateContext(@contextId As _INT) AS _INT PASCAL LIB xLib
 
http://forums.fivetechsupport.com/viewt ... 8&start=15

http://fivetechsupport.com/forums/viewt ... =3&t=12698

http://174.129.231.1/pt-br/forum/active ... mmkpbexfkp

https://groups.google.com/forum/#!topic ... lpe96jrs5U

Saludos.

Re: Lector Biométrico

Posted: Thu Feb 19, 2015 7:09 pm
by lucasdebeltran
Hola,

Los ejemplos del foro no funcionan bien.

Esto es lo que he conseguido hasta la fecha:

Code: Select all

#include "FiveWin.ch"

STATIC oWnd ,OSAY, osay1
STATIC ttptSize
STATIC ttpt, xLib
static sensor



//====================================================================================================
FUNCTION Main()
//====================================================================================================

Local oFingerX

// Define your Sensor ID
sensor := "DPOTF456CA"

public x := 0

xLib:= LoadLibrary("GrFinger.dll")
*GrInitialize()

cStatus := Space(1000)
VAR1    := Space(100)



DEFINE WINDOW oWnd TITLE "Test de Griaulle" from 10, 10 to 400, 400 pixel

@2, 5 say oSay prompt space(200)
@5, 5 GET oSay1 VAR VAR1 MEMO SIZE 300, 200

oFingerX = TActiveX():New( oWnd, "GrFingerX.GrFingerXCtrl")
oWnd:oClient = oFingerX



oFingerX:Do("Initialize")
oFingerX:Do("CapInitialize")

oFingerX:bOnEvent = { | event, aParams, pParams | ProcessEventInfo( event, aParams, pParams, oFingerX ) }

ACTIVATE WINDOW oWnd ;
         VALID SalirHuella(oFingerX)  ;
         CENTERED

RETURN NIL
//====================================================================================================



//====================================================================================================
FUNCTION SalirHuella(oFingerX)
//====================================================================================================

oFingerX:Do( "CapStopCapture",sensor )
oFingerX:Do( "CapFinalize" )
oFingerX:Do( "Finalize" )

*     GrFinalize()
FreeLibrary(xLib)

RETURN ( .T. )
//====================================================================================================



//====================================================================================================
FUNCTION ProcessEventInfo( event, aParams, pParams, oFingerX )
//====================================================================================================

Local cEvent

  cEvent := cValToChar( event )

  OSAY1:varput( alltrim(OSAY1:VARGET()) + CRLF + cEvent + CRLF + valtoprg(aParams) + CRLF+CRLF  )
  OSAY1:refresh()

  alert(event)

  IF cEvent == "SensorPlug" .and. aParams[1] != "File"
     public sensor:=aParams[1]
     oFingerX:Do("CapStartCapture",sensor)
     OSAY:SETTEXT( "Sensor: " + sensor )
  ENDIF


  IF cEvent == "SensorUnplug"
     oFingerX:Do("CapStopCapture",sensor)
  ENDIF


  IF cEvent == "ImageAcquired"
     ttptSize = 10000
     ttpt = SPACE(10000)

     ret:= GrExtract( aParams[ 4], aParams[ 2], aParams[ 3], aParams[ 5], @ttpt, @ttptSize, 0 )

     // Save result
     ttpt := aParams[ 4]
     hb_memowrit( "dig.bmp", ttpt )
     //msginfo(ttpt, "dados")


   if (x==0)
    public cAntes:=ttpt
    public x:=1
   else

    nIdScore:= 0
    nId:= GrVerify( ttpt , cAntes, @nIdScore , 0 )
    public cAntes:=ttpt

    oWnd:cTitle(Time()+" "+Str(ret)+" "+Str(nId)+" "+Str(nIdScore))

   endif
  ENDIF

RETURN NIL
//====================================================================================================


DLL32 FUNCTION GrInitialize() AS LONG PASCAL FROM "_GrInitialize@0" LIB xLib
DLL32 FUNCTION GrFinalize()  AS LONG PASCAL FROM "_GrFinalize@0" LIB xLib
DLL32 FUNCTION GrExtract( rawImage AS LONG, width AS LONG, height AS LONG, res AS LONG, ttpt AS LPSTR, @ttptSize AS LONG , context AS LONG ) AS LONG PASCAL FROM "_GrExtract@28" LIB xLib
DLL32 FUNCTION GrIdentifyPrepare( ttpt AS LPSTR, context AS LONG ) AS LONG PASCAL FROM "_GrIdentifyPrepare@8" LIB xLib
DLL32 FUNCTION GrIdentify( ttpt AS LPSTR, @Idscore AS LONG, context AS LONG ) AS LONG PASCAL FROM "_GrIdentify@12" LIB xLib
DLL32 FUNCTION GrVerify( ttpt AS LPSTR, qtpt AS LPSTR, @Idscore AS LONG, context AS LONG ) AS LONG PASCAL FROM "_GrVerify@16" LIB xLib
 

Re: Lector Biométrico

Posted: Thu Feb 26, 2015 12:38 am
by Prodix
Por favor, díganme que no es verdad, Fingerprint SDK single computer $US 250.00 ??
http://www.griaulebiometrics.com/en-us/ ... rprint_sdk

Re: Lector Biométrico

Posted: Sat Feb 28, 2015 5:32 pm
by albeiroval

Re: Lector Biométrico

Posted: Sat Feb 28, 2015 9:36 pm
by russimicro
Tratando de resumir...

Parece que no existe un ejemplo que funcione con la librería(sdk) nativa de digitalpersona ?

Tendremos que buscar la solución fuera de (x)harbour ?

Saludos

Johnson Russi

Re: Lector Biométrico

Posted: Sun Mar 01, 2015 3:09 pm
by elvira
Yo no he encontrado un ejemplo que haga todo el proceso de capturar, salvar y comparar las huellas, pero creo que alguien lo debe de tener.

Y la clase del amigo Pablo Botella tampoco funciona... :oops:

Re: Lector Biométrico

Posted: Sat Mar 28, 2015 5:51 pm
by Prodix
Queridos colegas, llegué a terminar la aplicación de control de ingreso-salida de personal, pero mediante la librería GrFinger.dll (no me funcionó lo de Pablo Botella), el problema es que ocurre aleatoriamente un GPF, lo cual está mortificando al cliente, alguien ha podido solucionar aquello?

apenas tenga tiempo prepararé un ejemplo autónomo completo como guía para los novatos como yo :)

saludos

Re: Lector Biométrico

Posted: Mon Mar 30, 2015 7:29 am
by lucasdebeltran
Hola,

Si colocas aquí el ejemplo o me envías un email a mi Nick @gmail.com te podré echar un cable.

Un saludo

Re: Lector Biométrico

Posted: Tue Mar 31, 2015 3:00 pm
by elvira
Amigo Prodix,

¿Serías tan amable de compartir por favor tus avances?.

Muy agradecida :D

Re: Lector Biométrico

Posted: Sat Apr 04, 2015 4:53 pm
by Prodix
Elvira,

Aquí está el código para leer, guardar y comparar una huella dactilar.
Utilizo el lector biométrico Digital Persona U.are.U 4500.
Persiste el problema del GPF aleatorio; en cuanto tenga tiempo libre intentaré con el SDK propio de Digital Persona.

[img]
https://www.facebook.com/prodixperu/pho ... =1&theater
[/img]

Code: Select all

#include "FiveWin.ch"
#include "saytimer.ch"
#include "TSButton.ch"

//////////////////////
FUNCTION Main()    ///
//////////////////////
LOCAL oWndE , oFont
LOCAL oCODCLI, cCodCli
LOCAL oNom  , cNom
LOCAL oNoc  , cNoc
LOCAL oImage, cHuella:=""
LOCAL lProcesandoHuella:= .F. , oBmp , oSay
LOCAL ttpt , ttptSize , oFingerX , sensor
LOCAL oIng , nIng:=1     // 1: Ingreso    // 2: Salida
LOCAL cArch1:=".\Data\Tabla23.DAT"
LOCAL cArch2:=".\Data\Tabla24.DAT"
LOCAL nArea:=0

USE (cArch1) ALIAS Personal NEW SHARED
nArea:=Select("Personal")
IF nArea==0
      msginfo("No se pudo abrir la tabla de Personal","Atención")
      RETURN .F.
ENDIF

USE (cArch2) ALIAS IngresoP NEW SHARED
nArea:=Select("IngresoP")
IF nArea==0
      msginfo("No se pudo abrir la tabla de Ingresos de Personal","Atención")
      RETURN .F.
ENDIF

cCodCli := " "
cNom    := " "
cNoc    := " "

sysrefresh()
HB_GCAll(.t.)     // Aleatoriamente el programa produce un GPF, entonces invoco al colector para ver si se solucionaba el error, pero no.

DEFINE FONT oFont NAME "Times New Roman" BOLD SIZE 24, 24

IF IsActiveX("GrFingerX.GrFingerXCtrl")
    DEFINE WINDOW oWndE TITLE "Ingreso de Personal" from 100, 100 to 400, 700 pixel NOMAXIMIZE
        @01 , 56.0 BITMAP oBmp OF oWndE SIZE 110,160 ADJUST
//        @01 , 36 SAY oCodCli  VAR  "DNI     : " + cCodCli OF oWndE COLOR CLR_BLACK, nrgb(226,208,242)
//        @02 , 36 SAY oNom     VAR  "Nombre  : " + cNom    OF oWndE COLOR CLR_BLACK, nrgb(226,208,242)
//        @03 , 36 SAY oNoc     VAR  "N. Corto: " + cNoc    OF oWndE COLOR CLR_BLACK, nrgb(226,208,242)
        @04 , 32 RADIO oIng  VAR nIng  ITEMS "INGRESO","SALIDA" SIZE 102,22 OF oWndE ON CHANGE (iif(nIng=1,oWndE:settext("Ingreso de Personal"),oWndE:settext("Salida de Personal")))
        @16 , 220 SAYTIMER O OF oWndE FONT oFont PIXELS //TRANSPARENT NOBORDER
        // AMPM ;
        // SHORT ;
        // COLOR CLR_WHITE, CLR_HGREEN, CLR_BLUE, CLR_RED
        
        @11 , 075.0 SBUTTON oSalir  PROMPT "Salir" COLORS CLR_BLUE, nrgb(112,146,190), nrgb(0,128,255) CRYSTAL SIZE 106,46 ACTION oWndE:End()
        
        oFingerX = TActiveX():New( oWndE, "GrFingerX.GrFingerXCtrl")
        //oWndE:oClient = oFingerX
        oFingerX:Do("Initialize")
        oFingerX:Do("CapInitialize")
        oFingerX:bOnEvent = { | event,aParams,pParams | EventInfo2(event,aParams,pParams,oFingerX,oWndE,lProcesandoHuella,oBmp,@ttpt,@ttptSize,;
                                                                   oCodCli,@cCodCli,oNom,@cNom,oNoc,@cNoc,@sensor,nIng) }

    ACTIVATE WINDOW oWndE VALID SalirHuella(oFingerX,sensor)
ELSE
    msginfo("Tiene que estar instalado GRFINGER","Atención")
ENDIF

RETURN NIL



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
FUNCTION EventInfo2(event,aParams,pParams,oFingerX,oWndE,lProcesandoHuella,oBmp,ttpt,ttptSize,oCodCli,cCodCli,oNom,cNom,oNoc,cNoc,sensor,nIng)    ///
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Local cEvent , cHora:=""

sysrefresh()
HB_GCAll(.t.)    // ya expliqué de porqué invoco al colector

IF .not. lProcesandoHuella

  cEvent := cValToChar( event )

  IF cEvent == "SensorPlug" .and. aParams[1] != "File"
        sensor:=aParams[1]
  ENDIF

  IF cEvent == "SensorPlug" .or. cEvent == "1"
    IF aParams[1] != "File"
      oFingerX:Do("CapStartCapture",sensor)
    ENDIF
  ELSE
    IF cEvent == "SensorUnplug"
      oFingerX:Do("CapStopCapture",sensor)
    ELSE
      IF cEvent == "FingerDown" .or. cEvent = "4"
      ELSE
        IF cEvent == "FingerUp" .or. cEvent = "3"
        ELSE
          IF cEvent == "ImageAcquired" .or. cEvent = "5"

            lProcesandoHuella:= .T.

            xLib:= LoadLibrary("GrFinger.dll")

            GrInitialize()

            ttptSize = 10000
            ttpt = SPACE(10000)

            ret:= GrExtract( aParams[ 4], aParams[ 2], aParams[ 3], aParams[ 5], @ttpt, @ttptSize, 0 )

            GrCapSaveRawImageToFile( aParams[ 4] , aParams[ 2], aParams[ 3], ".\Lectura.bmp", 501)   // Aquí se graba la imagen
            oBmp:LoadBmp( '.\Lectura.bmp' )    // cargo la imagen guardada en la anterior línea
            oBmp:refresh()

            select("Personal")
            GO TOP
            nIdScore:= 0            
            
            WHILE !eof()
                  GrIdentifyPrepare( ttpt, 0 )
                  nId:= GrIdentify( Personal->Huella, @nIdScore , 0 )
                  
                  IF nId = 1
                        
                        cHora := ""
                        cHora := time()
                        cCodCli := Personal->DNIPER  //;  oCodCli : refresh()
                        cNom    := Personal->NOM     //;  oNom    : refresh()
                        cNoc    := Personal->NOC     //;  oNoc    : refresh()
                        //oWndE:refresh()
                        
                        select("IngresoP")
                        APPEND BLANK
                        GO Lastrec()
                        
                        IF IngresoP->(rlock())
                              REPLACE IngresoP->DNIPER WITH cCodCli
                              REPLACE IngresoP->NOM    WITH cNom
                              REPLACE IngresoP->NOC    WITH cNoc
                              REPLACE IngresoP->FING   WITH date()
                              REPLACE IngresoP->HING   WITH cHora
                              REPLACE IngresoP->TIPO   WITH nIng
                              IngresoP->(dbcommit())
                              IngresoP->(dbunlock())
                            ELSE
                              msginfo("El registro está bloqueado, intente otra vez","Atención")
                        ENDIF

                        MsgBeep()
                        MsgBeep()
                        msgwait(alltrim(Personal->Nom) + "  :  " + CRLF + ;
                                "Hora ingreso:" + cHora, "Grabado con éxito!",1)
                        EXIT
                      ELSE
                        SKIP +1
                  ENDIF
                  
                  IF eof()
                        SndPlaySound("Error.wav",1)
                        msgwait("Personal no encontrado!","Atención",1)
                  ENDIF
            ENDDO
            
            select("Personal")
            SysWait(1)
            GrFinalize()
            FreeLibrary(xLib)
            lProcesandoHuella:= .F.

          ENDIF

        ENDIF
      ENDIF
    ENDIF
  ENDIF

ENDIF

RETURN NIL



////////////////////////////////////////////
FUNCTION SalirHuella(oFingerX,sensor)    ///
////////////////////////////////////////////

IF valtype(sensor) ="U" .OR. valtype(sensor) ="u"
    ELSE
      oFingerX:Do("CapStopCapture",sensor)
      oFingerX:Do("CapFinalize")
      oFingerX:Do("Finalize")
ENDIF
      oFingerX:Do("CapFinalize")
      oFingerX:Do("Finalize")

RETURN ( .T. )

DLL32 FUNCTION GrInitialize() AS LONG PASCAL FROM "_GrInitialize@0" LIB xLib
DLL32 FUNCTION GrFinalize() AS LONG PASCAL FROM "_GrFinalize@0" LIB xLib

*DLL32 FUNCTION GrCapInitialize(status AS LPSTR) AS LONG PASCAL FROM "_GrCapInitialize@4" LIB xLib

DLL32 FUNCTION GrExtract( rawImage AS LONG, width AS LONG, height AS LONG, res AS LONG, ttpt AS LPSTR, @ttptSize AS LONG , context AS LONG ) AS LONG PASCAL FROM "_GrExtract@28" LIB xLib

DLL32 FUNCTION GrIdentifyPrepare( ttpt AS LPSTR, context AS LONG ) AS LONG PASCAL FROM "_GrIdentifyPrepare@8" LIB xLib
DLL32 FUNCTION GrIdentify( ttpt AS LPSTR, @Idscore AS LONG, context AS LONG ) AS LONG PASCAL FROM "_GrIdentify@12" LIB xLib
DLL32 FUNCTION GrCapSaveRawImageToFile( rawImage AS LONG, width AS LONG, height AS LONG, qtpt AS LPSTR, n AS LONG ) AS LONG PASCAL FROM "_GrCapSaveRawImageToFile@20" LIB xLib
DLL32 FUNCTION GrVerify( ttpt AS LPSTR, qtpt AS LPSTR, @Idscore AS LONG, context AS LONG ) AS LONG PASCAL FROM "_GrVerify@16" LIB xLib

#include 'saytimer.PRG'



/////////////////////////// Alias: "Personal"
//FUNCTION CreaT23()    ///
///////////////////////////
//LOCAL aEstruc:={}
//LOCAL cArch:=".\DATA\"+"Tabla23.DAT"

//AADD(aEstruc,{"DNIPER", "C" , 11 ,00})   // DNI Personal
//AADD(aEstruc,{"CRE"   , "L" ,  1 ,00})   // Si es sujeto de Crédito
//AADD(aEstruc,{"LCR"   , "N" , 10 ,02})   // Límite de Crédito
//AADD(aEstruc,{"SDE"   , "N" , 10 ,00})   // Saldo Deudor
//AADD(aEstruc,{"PSE"   , "N" , 10 ,00})   // Pago Diario
//AADD(aEstruc,{"NOM"   , "C" , 45 ,00})   // Nombre
//AADD(aEstruc,{"DOM"   , "C" , 45 ,00})   // Domicilio
//AADD(aEstruc,{"NOC"   , "C" , 12 ,00})   // Nombre Corto
//AADD(aEstruc,{"FO1"   , "N" , 10 ,00})   // Telefono
//AADD(aEstruc,{"CUM"   , "D" , 08 ,00})   // Cumpleaños
//AADD(aEstruc,{"MAI"   , "C" , 20 ,00})   // Mail
//AADD(aEstruc,{"WEB"   , "C" , 30 ,00})   // WEB
//AADD(aEstruc,{"CON"   , "C" , 45 ,00})   // CONTACTO
//AADD(aEstruc,{"FOTO"  , "C" , 52 ,00})   // Foto del Personal, mejor dicho la dirección de donde se encuentra en el disco duro
//AADD(aEstruc,{"CORREO", "C" , 26 ,00})   // correo electronico
//AADD(aEstruc,{"SENHA" , "C" , 16 ,00})   // contraseña
//AADD(aEstruc,{"HUELLA", "M" , 10 ,00})   // campo MEMO para guardar la huella dactilar
//DBCREATE(cArch,aEstruc)
//RETURN NIL



/////////////////////////// Alias: "IngresoP"
//FUNCTION CreaT24()    ///
///////////////////////////
//LOCAL aEstruc:={}
//LOCAL cArch:=".\DATA\"+"Tabla24.DAT"

//AADD(aEstruc,{"DNIPER", "C" , 11 ,00})   // DNI Personal
//AADD(aEstruc,{"NOM"   , "C" , 45 ,00})   // Nombre
//AADD(aEstruc,{"NOC"   , "C" , 12 ,00})   // Nombre Corto
//AADD(aEstruc,{"FING"  , "D" , 08 ,00})   // Fecha de Ingreso
//AADD(aEstruc,{"HING"  , "C" , 08 ,00})   // Hora de Ingreso
//AADD(aEstruc,{"TIPO"  , "N" , 01 ,00})   // Para saber=  1 : Ingreso    2: Salida
//DBCREATE(cArch,aEstruc)
//RETURN NIL