|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
heliorios Novato
Registrado: Terça-Feira, 31 de Julho de 2007 Mensagens: 48
|
Enviada: Qua Fev 08, 2012 3:52 pm Assunto: Biometria Fingkey Hamster - nitgen |
|
|
Estou tentando desenvolver uma rotina que capture, salve em base de dados mysql e identifique o funcionario cadastrado pela biometria.
Uso Delphi 2010 com mysql, criei no cadastro de funcionarios um campo FuDigital tipo Text para armazenar a string de comparação.
O programa esta capturando, salvando e identificando se eu utilizo sem sair do sistema, mas quando saio e entro novamente não cosegue identificar, utilizo "objIndexSearch.AddFIR(szFir,nUserID);" para colocar na memoria e " objIndexSearch.IdentifyUser(szFir, 5);" para comparar.
abaixo o fonte. Se alguem ja passou por isso e puder ajudar, agradeço muito, pois pesquisei na internet e nos exemplos, mas não consegui localizar o problema.
Código: | unit UBiometria;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Comobj, DBClient, DB, StdCtrls, EditNew, Buttons, ComCtrls, Grids,
DBGrids, Mask;
type
TFBiometria = class(TForm)
BtnCapturar: TBitBtn;
BtnIdentificacao: TBitBtn;
TextUserID: TEditN;
Label12: TLabel;
MedCpfFunc: TMaskEdit;
SpbCpf: TSpeedButton;
EdtNome: TEditN;
Label2: TLabel;
BtnNovo: TBitBtn;
procedure BtnIdentificacaoClick(Sender: TObject);
procedure BtnCapturarClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure SpbCpfClick(Sender: TObject);
procedure MedCpfFuncEnter(Sender: TObject);
procedure MedCpfFuncExit(Sender: TObject);
procedure MedCpfFuncKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure MedCpfFuncKeyPress(Sender: TObject; var Key: Char);
procedure MedCpfFuncKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure BtnNovoClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
procedure busca_Digital;
end;
const
NBioAPIERROR_NONE = 0;
NBioAPI_FIR_PURPOSE_VERIFY = 1;
//Constant for DeviceID
NBioAPI_DEVICE_ID_NONE = 0;
NBioAPI_DEVICE_ID_FDP02_0 = 1;
NBioAPI_DEVICE_ID_FDU01_0 = 2;
NBioAPI_DEVICE_ID_AUTO_DETECT = 255;
var
FBiometria: TFBiometria;
objNBioBSP : variant;
objDevice : variant;
objExtraction : variant;
objIndexSearch : variant;
implementation
{$R *.dfm}
uses UProc, UDm, USispo;
// nitgen/sdk/samples/com/delphi/indexsearchdp
procedure TFBiometria.BtnCapturarClick(Sender: TObject);
var nUserID : integer;
szFir : wideString;
begin
if Trim(MedCpfFunc.Text)='' then
Begin
Showmessage('Informe CPF funcionário');
MedCpfFunc.SetFocus;
exit;
End;
nUserID := 0;
if TextUserID.Text <> '' then
begin
nUserID := StrToInt(TextUserID.Text);
// Get FIR data
objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT) ;
if objDevice.ErrorCode <> 0 Then
ShowMessage('Falha na abertura do aparelho biometrico !');
//Get FIR data
objExtraction.Enroll(nUserID, 0);
if objExtraction.ErrorCode <> NBioAPIERROR_NONE Then
ShowMessage('Erro de leitura !');
objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);
szFir := objExtraction.TextEncodeFIR;
//Regist FIR to IndexSearch DB
objIndexSearch.AddFIR(szFir, nUserID);
if (objIndexSearch.ErrorCode = NBioAPIERROR_NONE) Then
begin
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.SQL.Clear;
Dm.SQLFuncionario.SQL.Add('Update bfuncionario');
Dm.SQLFuncionario.SQL.Add(' Set FuDigital='+QuotedStr(szFir)); // mysql FuDigital tipo Text
Dm.SQLFuncionario.SQL.Add(' where (FuCPF='+QuotedStr(trim(MedCpfFunc.Text))+')');
Dm.SQLFuncionario.ExecSQL;
end
else
ShowMessage('Falha na extração da digital !');
end
else
ShowMessage('Informar usuario');
end;
procedure TFBiometria.BtnIdentificacaoClick(Sender: TObject);
var szFir : wideString;
str : wideString;
User_id : Integer;
begin
//Get FIR data
objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT) ;
if objDevice.ErrorCode <> NBioAPIERROR_NONE then
begin
str := objDevice.ErrorDescription;
ShowMessage('Falha no aparelho biométrico !');
Exit;
end;
objExtraction.Capture(NBioAPI_FIR_PURPOSE_VERIFY);
if objExtraction.ErrorCode = NBioAPIERROR_NONE then
begin
objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);
szFir := objExtraction.TextEncodeFIR;
//Search FIR to IndexSearch DB
objIndexSearch.IdentifyUser(szFir, 5);
User_id := objIndexSearch.UserID;
showmessage(inttostr(User_id));
if objIndexSearch.ErrorCode <> NBioAPIERROR_NONE then
ShowMessage('Funcionario não identificado !')
else
showmessage('Funcionario identificado com sucesso');
end
else
ShowMessage('Falha na extração da biometria !');
objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);
end;
procedure TFBiometria.BtnNovoClick(Sender: TObject);
var i:integer;
begin
ActiveControl:=nil; // forca saida com on exit dos edit's
for i := 0 to ComponentCount -1 do
if Components[i] is TEdit then
begin
TEdit(Components[i]).Text := '';
end;
MedCpffunc.Enabled:=true;
MedCpffunc.Text:=''; MedCpffunc.EditMask:='';
TextUserID.Text := '1';
objIndexSearch.ClearDB;
Busca_Digital;
MedCpfFunc.SetFocus;
end;
procedure TFBiometria.busca_Digital;
var nUserID : integer;
szFir : wideString;
begin
//Create NBioBSP object
objNBioBSP := CreateOleObject('NBioBSPCOM.NBioBSP'); // uses Comobj
objDevice := objNBioBSP.Device;
objExtraction := objNBioBSP.Extraction;
objIndexSearch := objNBioBSP.IndexSearch;
//Check initialize object
if objIndexSearch.ErrorCode <> NBioAPIERROR_NONE then
begin
ShowMessage('Falha ao iniciar sistema de biometria!');
end
else
Begin
Caption := Caption + ' - Versão : v' + objNBioBSP.MajorVersion + '.' + objNBioBSP.MinorVersion;
objIndexSearch.ClearDB;
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.SQL.Clear;
Dm.SQLFuncionario.SQL.Add('Select * from bfuncionario');
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.Open;
while not(Dm.SQLFuncionario.Eof) do
begin
if Dm.SQLFuncionario.FieldByName('FuDigital').AsString<>'' then
Begin
nUserID:=Dm.SQLFuncionario.FieldByName('idbfuncionario').AsInteger;
szFir:=Dm.SQLFuncionario.FieldByName('FuDigital').AsString;
objIndexSearch.AddFIR(szFir,nUserID);
if objIndexSearch.ErrorCode <> NBioAPIError_None then
Showmessage('Erro ao ler dados');
End;
Dm.SQLFuncionario.Next;
end;
End;
end;
procedure TFBiometria.FormClose(Sender: TObject; var Action: TCloseAction);
begin
objNBioBSP := 0;
objDevice := 0;
objExtraction := 0;
objIndexSearch := 0;
end;
procedure TFBiometria.FormCreate(Sender: TObject);
begin
Busca_Digital;
end;
procedure TFBiometria.FormShow(Sender: TObject);
begin
BtnNovo.Click;
end;
procedure TFBiometria.MedCpfFuncEnter(Sender: TObject);
begin
MedCPFFunc.EditMask:='';
end;
procedure TFBiometria.MedCpfFuncExit(Sender: TObject);
begin
//Create NBioBSP object
objNBioBSP := CreateOleObject('NBioBSPCOM.NBioBSP');
objDevice := objNBioBSP.Device;
objExtraction := objNBioBSP.Extraction;
objIndexSearch := objNBioBSP.IndexSearch;
If trim(MedCPFFunc.Text)<>'' then
Begin
MedCpfFunc.Enabled:=false;
If length(trim(MedCPFFunc.Text))=11 then
MedCpfFunc.EditMask:='000.000.000-00;0;'
else
Begin
If length(trim(MedCPFFunc.Text))=14 then
MedCpfFunc.EditMask:='00.000.000/0000-00;0;';
end;
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.SQL.Clear;
Dm.SQLFuncionario.SQL.Add('Select * from bfuncionario');
Dm.SQLFuncionario.SQL.Add(' where FuCpf=:FuCpf');
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.ParamByName('FuCpf').AsString:=MedCpfFunc.Text;
Dm.SQLFuncionario.Open;
if Dm.SQLFuncionario.Eof then
Begin
showmessage('Funcionario não localizado');
MedCpfFunc.SetFocus;
exit;
End;
EdtNome.Text:=Dm.SQLFuncionario.fieldbyname('FuNome').AsString;
TextUserID.Text:=inttostr(Dm.SQLFuncionario.FieldByName('idbfuncionario').AsInteger);
End
else
EdtNome.Text:='';
end;
procedure TFBiometria.MedCpfFuncKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = 13 then Perform(Wm_NextDlgCtl,0,0);
end;
procedure TFBiometria.MedCpfFuncKeyPress(Sender: TObject; var Key: Char);
begin
// aceitar somente numeros de 0 a 9.
If Key<>#8 then
If not ((Key in ['0'..'9'])) then Key:=#0;
end;
procedure TFBiometria.MedCpfFuncKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If key=113 then // f2 pesquisa
SpbCpf.Click;
end;
procedure TFBiometria.SpbCpfClick(Sender: TObject);
begin
MedCpfFunc.EditMask:='';
MedCpfFunc.SetFocus;
F2Pesquisa(FBiometria,nil,3);
If trim(MedCpfFunc.Text)<>'' then
Begin
EdtNome.SetFocus;
end;
end;
end. |
|
|
Voltar ao Topo |
|
|
heliorios Novato
Registrado: Terça-Feira, 31 de Julho de 2007 Mensagens: 48
|
Enviada: Qui Fev 09, 2012 9:22 am Assunto: Biometria |
|
|
Comprei a video aula de reconhecimento de impressao digital com delphi de Eduardo Rocha, mas não estou conseguindo aplicar ao meu programa.
Não sei o que estou fazendo errado quando salvo a string digital ou na leitura. O exemplo SDK, salva em arquivo .isdb, mas gostaria de salvar em meu arquivo mysql. |
|
Voltar ao Topo |
|
|
cyberdisk Colaborador
Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Qui Fev 09, 2012 11:23 am Assunto: |
|
|
jogue a figura em um TImage e depois voce pode salvar no banco como bmp ou jpg
abraço _________________ O conhecimento abre muitas portas |
|
Voltar ao Topo |
|
|
heliorios Novato
Registrado: Terça-Feira, 31 de Julho de 2007 Mensagens: 48
|
Enviada: Sex Fev 10, 2012 8:06 am Assunto: Biometria. |
|
|
Bom dia. Agradeço a atenção, mas segundo estudei sobre o aparelho Fingkey Hamster, não é necessario salvar imagem e sim uma string criada pela DLL que acompanha o aparelho. Estou conseguindo gerar esta string e salva-la em banco de dados. O problema é que a função que captura a imagem, aparentemente esta correta, não reportando nenhuma mensagem de erro. Mas quando faço a leitura da impressão e vou comparar com a da memoria atraves tambem de função da DLL, esta não é localizada, retornando zero.
Se capturo a string e verifico sem sair do sistema, ele o faz correto, retornando o ID do funcionario. |
|
Voltar ao Topo |
|
|
heliorios Novato
Registrado: Terça-Feira, 31 de Julho de 2007 Mensagens: 48
|
Enviada: Sex Fev 10, 2012 9:07 am Assunto: Biometria. |
|
|
Apos duas semanas em função deste programa de biometria, hoje do nada consegui que funcionasse completamente como eu desejava.
E o que tive que mudar foram somente o local da criação de algumas variavel e objetos, mas eu não conseguia enxergar.
Abaixo o programa para que todos que venham necessitar trabalhar com biometria, não passem o sufoco que passei.
Código: | unit UBiometria;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Comobj, DBClient, DB, StdCtrls, EditNew, Buttons, ComCtrls, Grids,
DBGrids, Mask;
type
TFBiometria = class(TForm)
BtnCapturar: TBitBtn;
BtnIdentificacao: TBitBtn;
TextUserID: TEditN;
Label12: TLabel;
MedCpfFunc: TMaskEdit;
SpbCpf: TSpeedButton;
EdtNome: TEditN;
Label2: TLabel;
BtnNovo: TBitBtn;
DBGrid1: TDBGrid;
procedure BtnIdentificacaoClick(Sender: TObject);
procedure BtnCapturarClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure SpbCpfClick(Sender: TObject);
procedure MedCpfFuncEnter(Sender: TObject);
procedure MedCpfFuncExit(Sender: TObject);
procedure MedCpfFuncKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure MedCpfFuncKeyPress(Sender: TObject; var Key: Char);
procedure MedCpfFuncKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure BtnNovoClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure busca_Digital;
end;
const
NBioAPIERROR_NONE = 0;
NBioAPI_FIR_PURPOSE_VERIFY = 1;
NBioAPI_DEVICE_ID_NONE = 0;
NBioAPI_DEVICE_ID_FDP02_0 = 1;
NBioAPI_DEVICE_ID_FDU01_0 = 2;
NBioAPI_DEVICE_ID_AUTO_DETECT = 255;
var
FBiometria: TFBiometria;
objNBioBSP : variant;
objDevice : variant;
objExtraction : variant;
objIndexSearch : variant;
implementation
{$R *.dfm}
uses UProc, UDm, USispo;
procedure TFBiometria.BtnCapturarClick(Sender: TObject); // captura do aparelho a digital.
var nUserID : integer;
szFir : wideString;
begin
if Trim(MedCpfFunc.Text)='' then
Begin
Showmessage('Informe CPF funcionário');
MedCpfFunc.SetFocus;
exit;
End;
nUserID := 0;
if TextUserID.Text <> '' then // codigo do funcionario (ID)
begin
nUserID := StrToInt(TextUserID.Text);
objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT) ; // abre aparelho biometrico
if objDevice.ErrorCode <> 0 Then
Begin
ShowMessage('Falha na abertura do aparelho biometrico !');
close;
exit;
End;
objExtraction.Enroll(nUserID, 0); // ler impressão digital
if objExtraction.ErrorCode <> NBioAPIERROR_NONE Then
Begin
ShowMessage('Erro de leitura !');
close;
exit;
End;
objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT); // fecha aparelho biometrico
szFir := objExtraction.TextEncodeFIR; // captura string gerada pela DLL
objIndexSearch.AddFIR(szFir, nUserID);
if (objIndexSearch.ErrorCode = NBioAPIERROR_NONE) Then // salva string no banco de dados se não tiver erro.
begin
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.SQL.Clear;
Dm.SQLFuncionario.SQL.Add('Update bfuncionario');
Dm.SQLFuncionario.SQL.Add(' Set FuDigital='+QuotedStr(szFir)); // mysql FuDigital tipo Text
Dm.SQLFuncionario.SQL.Add(' where (FuCPF='+QuotedStr(trim(MedCpfFunc.Text))+')');
Dm.SQLFuncionario.ExecSQL;
end
else
ShowMessage('Falha na extração da digital !');
end
else
ShowMessage('Informar usuario');
end;
procedure TFBiometria.BtnIdentificacaoClick(Sender: TObject); // identifica usuario pela digital.
var szFir : wideString;
str : wideString;
User_id : Integer;
ListItem : TListItem ;
begin
objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT) ; // abre aparelho biometrico
if objDevice.ErrorCode <> NBioAPIERROR_NONE then
begin
str := objDevice.ErrorDescription;
ShowMessage('Falha no aparelho biométrico !');
Exit;
end;
objExtraction.Capture(NBioAPI_FIR_PURPOSE_VERIFY); // captura digital
if objExtraction.ErrorCode = NBioAPIERROR_NONE then
begin
objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);
szFir := objExtraction.TextEncodeFIR; // busca string da digital
objIndexSearch.IdentifyUser(szFir, 5); // identifica digital com o da memoria com nivel 5 de segurança
if objIndexSearch.ErrorCode <> NBioAPIERROR_NONE then
ShowMessage('Funcionario não identificado !')
else
Begin
User_id := objIndexSearch.UserID; // pega o ID
showmessage('Funcionario identificado com sucesso '+inttostr(User_id));
Dm.SQLFuncionario.Close; // busca o funcionario pela ID informada.
Dm.SQLFuncionario.SQL.Clear;
Dm.SQLFuncionario.SQL.Add('Select * from bfuncionario');
Dm.SQLFuncionario.SQL.Add(' where idbfuncionario=:idbfuncionario');
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.ParamByName('idbfuncionario').AsInteger:=User_id;
Dm.SQLFuncionario.Open;
if Dm.SQLFuncionario.Eof then
showmessage('Funcionario não localizado pelo codigo fornecido')
else
Begin
MedCpfFunc.Text:=Dm.SQLFuncionario.FieldByName('FuCpf').AsString;
EdtNome.Text:=Dm.SQLFuncionario.FieldByName('FuNome').AsString;
End;
End;
end
else
ShowMessage('Falha na extração da biometria !');
objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);
end;
procedure TFBiometria.BtnNovoClick(Sender: TObject);
var i:integer;
begin
ActiveControl:=nil; // forca saida com on exit dos edit's
for i := 0 to ComponentCount -1 do
if Components[i] is TEdit then
begin
TEdit(Components[i]).Text := '';
end;
MedCpffunc.Enabled:=true;
MedCpffunc.Text:=''; MedCpffunc.EditMask:='';
Busca_Digital;
MedCpfFunc.SetFocus;
end;
procedure TFBiometria.busca_Digital;
var nUserID : integer;
szFir : wideString;
begin
if objIndexSearch.ErrorCode <> NBioAPIERROR_NONE then
begin
ShowMessage('Falha ao iniciar sistema de biometria!');
end
else
Begin
Caption := Caption + ' - Versão : v' + objNBioBSP.MajorVersion + '.' + objNBioBSP.MinorVersion;
objIndexSearch.ClearDB;
Dm.SQLFuncionario.Close; // inicia banco de dados
Dm.SQLFuncionario.SQL.Clear;
Dm.SQLFuncionario.SQL.Add('Select * from bfuncionario');
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.Open;
Dm.SQLFuncionario.First;
while not(Dm.SQLFuncionario.Eof) do
begin
if Dm.SQLFuncionario.FieldByName('FuDigital').AsString<>'' then
Begin
nUserID:=Dm.SQLFuncionario.FieldByName('idbfuncionario').AsInteger;
szFir:=Dm.SQLFuncionario.FieldByName('FuDigital').AsString;
objIndexSearch.AddFIR(szFir,nUserID); // coloca na memoria as strings armazenadas no BD.
if objIndexSearch.ErrorCode <> NBioAPIError_None then
Showmessage('Erro ao ler dados');
End;
Dm.SQLFuncionario.Next;
end;
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.SQL.Clear;
End;
end;
procedure TFBiometria.FormClose(Sender: TObject; var Action: TCloseAction);
begin
objNBioBSP := 0;
objDevice := 0;
objExtraction := 0;
objIndexSearch := 0;
end;
procedure TFBiometria.FormCreate(Sender: TObject);
begin
//Create NBioBSP object
objNBioBSP := CreateOleObject('NBioBSPCOM.NBioBSP'); // uses Comobj
objDevice := objNBioBSP.Device;
objExtraction := objNBioBSP.Extraction;
objIndexSearch := objNBioBSP.IndexSearch;
TextUserID.Text := '1';
end;
procedure TFBiometria.FormShow(Sender: TObject);
begin
BtnNovo.Click;
end;
procedure TFBiometria.MedCpfFuncEnter(Sender: TObject);
begin
MedCPFFunc.EditMask:='';
end;
procedure TFBiometria.MedCpfFuncExit(Sender: TObject);
begin
If trim(MedCPFFunc.Text)<>'' then
Begin
MedCpfFunc.Enabled:=false;
If length(trim(MedCPFFunc.Text))=11 then
MedCpfFunc.EditMask:='000.000.000-00;0;'
else
Begin
If length(trim(MedCPFFunc.Text))=14 then
MedCpfFunc.EditMask:='00.000.000/0000-00;0;';
end;
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.SQL.Clear;
Dm.SQLFuncionario.SQL.Add('Select * from bfuncionario');
Dm.SQLFuncionario.SQL.Add(' where FuCpf=:FuCpf');
Dm.SQLFuncionario.Close;
Dm.SQLFuncionario.ParamByName('FuCpf').AsString:=MedCpfFunc.Text;
Dm.SQLFuncionario.Open;
if Dm.SQLFuncionario.Eof then
Begin
showmessage('Funcionario não localizado');
MedCpfFunc.SetFocus;
exit;
End;
EdtNome.Text:=Dm.SQLFuncionario.fieldbyname('FuNome').AsString;
TextUserID.Text:=inttostr(Dm.SQLFuncionario.FieldByName('idbfuncionario').AsInteger);
End
else
EdtNome.Text:='';
end;
procedure TFBiometria.MedCpfFuncKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = 13 then Perform(Wm_NextDlgCtl,0,0);
end;
procedure TFBiometria.MedCpfFuncKeyPress(Sender: TObject; var Key: Char);
begin
// aceitar somente numeros de 0 a 9.
If Key<>#8 then
If not ((Key in ['0'..'9'])) then Key:=#0;
end;
procedure TFBiometria.MedCpfFuncKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If key=113 then // f2 pesquisa
SpbCpf.Click;
end;
procedure TFBiometria.SpbCpfClick(Sender: TObject);
begin
MedCpfFunc.EditMask:='';
MedCpfFunc.SetFocus;
F2Pesquisa(FBiometria,nil,3);
If trim(MedCpfFunc.Text)<>'' then
Begin
EdtNome.SetFocus;
end;
end;
end. |
Aparelho biometrico Fingkey Hamster da Nitgen.
Obrigado a todos e espero que ajude. |
|
Voltar ao Topo |
|
|
alexbandeira Mestre
Registrado: Terça-Feira, 27 de Julho de 2004 Mensagens: 812 Localização: Paulista - PE
|
Enviada: Sex Fev 10, 2012 8:46 pm Assunto: |
|
|
Amigo:
Sua atitude é fundamental para a evolução da nossa ferramenta de trabalho. _________________ Conhecemos um grande homem pelas pequenas atitudes. |
|
Voltar ao Topo |
|
|
joemil Moderador
Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9098 Localização: Sinop-MT
|
Enviada: Sex Ago 02, 2013 8:49 am Assunto: |
|
|
to tentando usar a unit postada, mas recebo a mensagem:
Citação: | Cadeia de caracteres de classe inválida. |
qdo cria o obj no OnCreate do Form. alg pode dar uma forca?
to usando D7 / Hamster III
Código: | unit UBiometria;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Comobj, DBClient, DB, StdCtrls, Buttons, ComCtrls, Grids,
DBGrids, Mask;
type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure BtnIdentificacaoClick(Sender: TObject);
procedure BtnCapturarClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure busca_Digital;
end;
const
NBioAPIERROR_NONE = 0;
NBioAPI_FIR_PURPOSE_VERIFY = 1;
NBioAPI_DEVICE_ID_NONE = 0;
NBioAPI_DEVICE_ID_FDP02_0 = 1;
NBioAPI_DEVICE_ID_FDU01_0 = 2;
NBioAPI_DEVICE_ID_AUTO_DETECT = 255;
var
Form2: TForm2;
objNBioBSP: variant;
objDevice: variant;
objExtraction: variant;
objIndexSearch: variant;
implementation
{$R *.dfm}
procedure TForm2.BtnCapturarClick(Sender: TObject); // captura do aparelho a digital.
var nUserID: integer;
szFir: wideString;
begin
objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT); // abre aparelho biometrico
if objDevice.ErrorCode <> 0 then
begin
ShowMessage('Falha na abertura do aparelho biometrico !');
close;
exit;
end;
objExtraction.Enroll(nUserID, 0); // ler impressão digital
if objExtraction.ErrorCode <> NBioAPIERROR_NONE then
begin
ShowMessage('Erro de leitura !');
close;
exit;
end;
objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT); // fecha aparelho biometrico
szFir := objExtraction.TextEncodeFIR; // captura string gerada pela DLL
objIndexSearch.AddFIR(szFir, nUserID);
if (objIndexSearch.ErrorCode = NBioAPIERROR_NONE) then // salva string no banco de dados se não tiver erro.
begin
Memo1.Lines.Text := szFir;
ShowMessage('Digital Capturada.');
end
else
ShowMessage('Falha na extração da digital !');
end;
procedure TForm2.BtnIdentificacaoClick(Sender: TObject); // identifica usuario pela digital.
var szFir: wideString;
str: wideString;
User_id: Integer;
ListItem: TListItem;
begin
objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT); // abre aparelho biometrico
if objDevice.ErrorCode <> NBioAPIERROR_NONE then
begin
str := objDevice.ErrorDescription;
ShowMessage('Falha no aparelho biométrico !');
Exit;
end;
objExtraction.Capture(NBioAPI_FIR_PURPOSE_VERIFY); // captura digital
if objExtraction.ErrorCode = NBioAPIERROR_NONE then
begin
objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);
szFir := objExtraction.TextEncodeFIR; // busca string da digital
objIndexSearch.IdentifyUser(szFir, 5); // identifica digital com o da memoria com nivel 5 de segurança
if objIndexSearch.ErrorCode <> NBioAPIERROR_NONE then
ShowMessage('Funcionario não identificado !')
else
begin
showmessage('Funcionario identificado com sucesso ' + inttostr(User_id));
end;
end
else
ShowMessage('Falha na extração da biometria !');
objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);
end;
procedure TForm2.busca_Digital;
var nUserID: integer;
szFir: wideString;
begin
if objIndexSearch.ErrorCode <> NBioAPIERROR_NONE then
begin
ShowMessage('Falha ao iniciar sistema de biometria!');
end
else
begin
Caption := Caption + ' - Versão : v' + objNBioBSP.MajorVersion + '.' + objNBioBSP.MinorVersion;
objIndexSearch.ClearDB;
end;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
objNBioBSP := 0;
objDevice := 0;
objExtraction := 0;
objIndexSearch := 0;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
objNBioBSP := CreateOleObject('NBioBSPCOM.NBioBSP'); // uses Comobj
objDevice := objNBioBSP.Device;
objExtraction := objNBioBSP.Extraction;
objIndexSearch := objNBioBSP.IndexSearch;
end;
end.
|
_________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
|
mg.vasconcelos Novato
Registrado: Sábado, 31 de Julho de 2010 Mensagens: 7
|
Enviada: Sex Ago 02, 2013 5:17 pm Assunto: |
|
|
Apenas para ajudar, vou colocar a forma que eu fiz.
O meu form possui um TPanel onde eu uso o Handle para exibir a digital e um timer para verificar a cada 900ms se existe alguma digital sendo lida.
Segue o código.
Essa é a função que faz a leitura e checagem da FIR
Código: |
function TdmPonto.verificafir: integer; //retorna um inteiro com o ID do funcionário
var
szFir: widestring;
begin
objExtraction.WindowStyle := NBioAPI_WINDOW_STYLE_INVISIBLE;
objExtraction.FingerWnd := frmMarcPonto.pnImgDigital.Handle; //gera a imagem da digital (TPanel)
objDevice.Open(255); //abre o dispositivo no modo Default
if objDevice.CheckFinger <> 0 then //verifica se existe o que ler
begin
objExtraction.DefaultTimeout := 1500; //tempo limite
objExtraction.Capture(NBioAPI_FIR_PURPOSE_VERIFY);
szFir := objExtraction.TextEncodeFIR;
objIndexSearch.IdentifyUser(szFir, 9); //aqui você gera a precisão do leitura
if objIndexSearch.ErrorCode = NBioAPIERROR_None then
begin
Result := objIndexSearch.UserID; //retorna o ID do funcionário
objDevice.Close(255); //fecha o dispositivo
end
else
objDevice.Close(255); //fecha o dispositivo
end;
end;
|
esse procedure carrega as FIRs no dispositivo (Eu utilizo uma base off do fire)
Código: |
procedure TdmPonto.recarregar;
var
id: integer;
fir: widestring;
begin
objIndexSearch.ClearDB; //apaga todas FIRs registradas
if not idsCadFuncionario.Active then //verifica se está ativo ou não a ClientDataset se sim ele dá um refresh se não ele ativa
idsCadFuncionario.Active := true
else
idsCadFuncionario.Refresh;
idsCadFuncionario.First; // vai para o primeiro registro
while not idsCadFuncionario.Eof do //navega pelo dataset colocando os ids e firs no dispositivo.
begin
id := idsCadFuncionarioIDFUNCIONARIO.AsInteger;
fir := idsCadFuncionarioFIR.AsWideString;
objIndexSearch.AddFIR(fir, id);
idsCadFuncionario.Next;
end;
end;
|
|
|
Voltar ao Topo |
|
|
mg.vasconcelos Novato
Registrado: Sábado, 31 de Julho de 2010 Mensagens: 7
|
Enviada: Sex Ago 02, 2013 5:18 pm Assunto: |
|
|
esse código é colocado no Show do form para inicializar tudo.
Código: |
if not dmPonto.selecionaponto then
raise Exception.Create('LEITOR NÃO CONECTADO')
else
dmPonto.recarregar;
a function selecionaponto é essa e serve para ativar o Leitor.
function TdmPonto.selecionaponto: boolean;
begin
Result := true;
objNBioBSP := 0;
objDevice := 0;
objExtraction := 0;
objMatching := 0;
objIndexSearch := 0;
try
objNBioBSP := CreateOleObject('NBioBSPCOM.NBioBSP');
objDevice := objNBioBSP.Device;
objExtraction := objNBioBSP.Extraction;
objMatching := objNBioBSP.Matching;
objIndexSearch := objNBioBSP.NSearch;
objExtraction.WindowStyle := NBioAPI_WINDOW_STYLE_INVISIBLE;
Except
Result := false;
end;
end;
|
Essa parte é quem faz o trabalho, esse é um timer com 900ms e ele fica checando se há alguma digital no leitor e se houver ele dispara o restante do código.
Código: |
procedure TfrmMarcPonto.captFIRTimer(Sender: TObject);
var
idfunc, resultado: integer;
vardatahora: datahora;
begin
captFIR.Enabled := false; //ele para assim evita um novo disparo.
idfunc := 0;
if true then //essa função eu devia ter retirado, mas era caso não houvesse leitor ele deixaria o usuário digitar.
idfunc := dmPonto.verificafir //dispara a function verificafir
else if edtIDFunc.Text <> '' then //não funciona para mais nada tenho que retirar mas servia para ler a entrada manual do id do funcionário.
begin
idfunc := strtoint(edtIDFunc.Text);
edtIDFunc.Text := '';
end;
if idfunc <> 0 then //se a func verificafir retornar algo diferente de 0 então é que captou uma digital regitrada
begin
vardatahora := dataehora; //só para entendere isso pode ser substituido para Now, é que eu uso um horario de um servidor na internet e por isso existe essa function.
resultado := dmPonto.preenchermarcacao(idfunc, vardatahora.Thora,
vardatahora.Tdata);
case resultado of
0:
begin
messagedlg('SUA ULTIMA MARCAÇÃO FOI A MENOS' + #13 + 'DOIS MINUTOS',
mtError, [mbOk], 0);
end;
1:
begin
frmMarcPonto.Color := clGreen;
end;
2:
begin
frmMarcPonto.Color := clMaroon;
end;
3:
begin
messagedlg('MUITAS MARCAÇÕES', mtError, [mbOk], 0);
end;
end;
if (resultado <> 0) or (resultado <> 3) then
begin
with dmPonto do
begin
idsPesFuncionario.Close;
idsPesFuncionario.ParamByName('IDFUNCIONARIO').AsInteger := idfunc;
idsPesFuncionario.Open;
lblNome.Caption := idsPesFuncionarioNOME.AsString;
lblHoraMarcacao.Caption := Datetostr(vardatahora.Tdata) + ' ' +
Timetostr(vardatahora.Thora);
end;
liberar.Enabled := true;
end;
end
else if not parar then
captFIR.Enabled := true;
end;
|
|
|
Voltar ao Topo |
|
|
joemil Moderador
Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9098 Localização: Sinop-MT
|
Enviada: Seg Ago 05, 2013 8:48 am Assunto: |
|
|
consegui instalar o leitor (tava faltando o SDK), e to usando essa procedure pra fazer a leitura:
Código: | var nUserID: integer;
szFir: wideString;
begin
InicializaLeitor;
nUserID := 0;
objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT); // abre aparelho biometrico
if objDevice.ErrorCode <> 0 then
begin
ShowMessage('Falha na abertura do aparelho biometrico !');
close;
exit;
end;
objExtraction.Enroll(nUserID, 0); // ler impressão digital
if objExtraction.ErrorCode <> NBioAPIERROR_NONE then
begin
ShowMessage('Erro de leitura !');
close;
exit;
end;
objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT); // fecha aparelho biometrico
szFir := objExtraction.TextEncodeFIR; // captura string gerada pela DLL
//objIndexSearch.AddFIR(szFir, nUserID);
if (objIndexSearch.ErrorCode = NBioAPIERROR_NONE) then // salva string no banco de dados se não tiver erro.
begin
Memo1.Lines.Text := szFir;
ShowMessage('Digital Capturada.');
end
else
ShowMessage('Falha na extração da digital !');
FechaLeitor;
|
esta funcao faz a leitura da digital e coloca no memo1, depois fiz outra igual q joga no memo2. ao comparar as 2 leituras, diz q nao sao iguais.
note q a linha abaixo com comentario.
//objIndexSearch.AddFIR(szFir, nUserID);
ela faz alguma diferenca? qtas digitais posso adicionar ao objIndexSearch?
outra coisa: qdo inicio a captura, é mostrada algumas janelas, e uma delas é para selecionar o dedo q sera lido:
tem como pular essas partes?
poderia colocar um passo a passo de como proceder pra fazer a leitura?
eu estou usando assim:
1. faz a leitura da digita (aquelas telas q quero pular)
2. grava o texto lido no BD (var szFir)
3. faz a leitura da digital novamente
4. compara com a digital q esta no BD
devo fazer uso do objeto objIndexSearch.AddFIR para funcionar?
Código: | //objIndexSearch.IdentifyUser(szFir, 5); // identifica digital com o da memoria com nivel 5 de segurança
|
_________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
|
joemil Moderador
Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9098 Localização: Sinop-MT
|
Enviada: Seg Ago 05, 2013 5:53 pm Assunto: |
|
|
agor aja ta funcionando.
so uma duvida: toda vez q eu abrir o sistema de biometria, devo alimentar o objeto com as biometrias lidas anteriormente? nao posso simplesmente ler do banco de direto? e qual o limite? se eu tiver 20.000 leituras, demora mto pra iniciar _________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
|
julioaze Novato
Registrado: Quarta-Feira, 14 de Janeiro de 2015 Mensagens: 2
|
Enviada: Qua Jan 14, 2015 4:59 pm Assunto: |
|
|
Estou desenvolvendo a leitura do Nitgen em um sistema Delphi que já possui suporte para o ZK 7000 da ZK Software.
O BD está configurado para gravar 03 amostras de digital (do mesmo dedo) em campos do tipo binário.
Minha dúvida é como fazer isso para o Nitgen.
Vejo que normalmente o pessoal grava os dados em formato string e não achei nada a respeito de gravar como binário.
Se alguém puder ajudar, desde já agradeço. |
|
Voltar ao Topo |
|
|
julioaze Novato
Registrado: Quarta-Feira, 14 de Janeiro de 2015 Mensagens: 2
|
Enviada: Seg Jan 19, 2015 9:01 am Assunto: |
|
|
joemil escreveu: | agor aja ta funcionando.
so uma duvida: toda vez q eu abrir o sistema de biometria, devo alimentar o objeto com as biometrias lidas anteriormente? nao posso simplesmente ler do banco de direto? e qual o limite? se eu tiver 20.000 leituras, demora mto pra iniciar |
Ressuscitando o tópico: como você fez para pular as telas padrão do Nitgen? |
|
Voltar ao Topo |
|
|
MarceloJR Aprendiz
Registrado: Domingo, 7 de Agosto de 2005 Mensagens: 163
|
|
Voltar ao Topo |
|
|
joemil Moderador
Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9098 Localização: Sinop-MT
|
Enviada: Seg Jul 27, 2015 4:04 pm Assunto: |
|
|
ressuscitando o topico.
estou fazendo um novo sistema de biometria pra um cliente (o anterior nem usava mais hehehe)
a leitura ja ta funcionando normalmente, mas agora preciso q varios computadores facam a leitura, entao preciso criar algo do tipo Client/server. alg tem um link, exemplo, dica???
e tb vou precisar de algum equipamento q possa fazer a leitura biometrica de forma movel. alg conhec algum equipamento wi-fi com leitura? _________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|