Desenvolvendo aplicativo para autenticação biométrica utilizando a Libfprint

Neste tutorial vou explicar como utilizar a libfprint a seu favor, ou seja, desenvolver um software utilizando a mesma para leitura de impressões digitais no Linux.

[ Hits: 38.545 ]

Por: Rafael Wagner Souza da Silva em 20/01/2009


Desenvolvendo um aplicativo para leitura da impressão digital



Para desenvolver um aplicativo que funcionasse da maneira pedida pelos meus clientes, tive que alterar o código fonte dos dois aplicativos, a modo que a saída de erro pudesse ser capturada pela interface gráfica que eu desenvolvi. Não é nada muito complexo.

Edite o arquivo enroll.c, localizado na pasta "examples".

Nesta parte eu editei a saída para uma maneira que eu pudesse capturar os erros, os nomeando de uma forma que se adequasse as minhas necessidades.

Procure esta parte do código e altere seguindo o meu exemplo:

switch (r) {
   case FP_ENROLL_COMPLETE:
      printf("FIM-OK\n");
      break;
   case FP_ENROLL_FAIL:
      printf("FIM-FALHOU\n");
      return NULL;
   case FP_ENROLL_PASS:
      printf("PASS\n");
      break;
   case FP_ENROLL_RETRY:
      printf("FIM-NOVAMENTE\n");
      break;
   case FP_ENROLL_RETRY_TOO_SHORT:
      printf("FIM-NOVAMENTE\n");
      break;
   case FP_ENROLL_RETRY_CENTER_FINGER:
      printf("FIM-NOVAMENTE\n");
      break;
   case FP_ENROLL_RETRY_REMOVE_FINGER:
      printf("FIM-NOVAMENTE\n");
      break;

Esta parte é referente ao retorno do resultado do leitor, alterei o que o programa escrito em C retorna ao terminal.

Esta parte (fp_dev_open(ddev)) é referente a iniciar o leitor, depois que o programa testou a porta, e encontrou o mesmo. Comparando o original, você vai perceber que eu deletei uma parte do código, justamente a que pede que o usuário pressione enter para iniciar o dispositivo, nós não queremos que seja pedido que o dispositivo inicie somente após um "enter".

dev = fp_dev_open(ddev);
   fp_dscv_devs_free(discovered_devs);
   if (!dev) {
      fprintf(stderr, "O FingerFx falhou ao abrir o dispositivo.\nFIM-DISP\n");
      goto out;
   }

   printf("O FingerFx iniciou o dispositivo, vamos iniciar o cadastro.\n\n");
   data = enroll(dev);
   if (!data)
      goto out_close;

   r = fp_print_data_save(data, RIGHT_INDEX);
   if (r < 0)
      fprintf(stderr, "O FingerFx não conseguiu salvar os dados, erro: %d\n", r);

   fp_print_data_free(data);

O mesmo foi feito com o verify.c:

switch (r) {
   case FP_VERIFY_NO_MATCH:
   printf("A digital não bate com a principal\nFIM-ERRO\n");
   return 0;
      
   case FP_VERIFY_MATCH:
      printf("A sua digital foi gravada \nFIM-OK\n");
      return 0;
   case FP_VERIFY_RETRY:
      printf("Nao foi possível escanear, tente novamente.\nFIM-NOVAMENTE\n");
      break;
   case FP_VERIFY_RETRY_TOO_SHORT:
      printf("Swipe was too short, please try again.\nFIM-NOVAMENTE\n");
      break;
   case FP_VERIFY_RETRY_CENTER_FINGER:
      printf("Por favor, centralize a sua digital no sensor e tente novamente.\nFIM-NOVAMENTE\n");
      break;
   case FP_VERIFY_RETRY_REMOVE_FINGER:
      printf("Por favor, remova seu dedo do sensor e tente novamente.\nFIM-NOVAMENTE\n");
      break;
   }
} while (1);

e na sequência:

   r = fp_init();
   if (s < 0) {
      fprintf(stderr, "O FingerFX falhou ao iniciar o driver do leitor\nFIM-DISP\n");
      exit(1);
   }

   discovered_devs = fp_discover_devs();
   if (!discovered_devs) {
      fprintf(stderr, "O FingerFx não consegue encontrar o leitor \nFIM-DISP\n");
      goto out;
   }

   ddev = discover_device(discovered_devs);
   if (!ddev) {
      fprintf(stderr, "O FingerFX não encontrou nenhum leitor instalado!.\nFIM-DISP\n");
      goto out;
   }

   dev = fp_dev_open(ddev);
   fp_dscv_devs_free(discovered_devs);
   if (!dev) {
      fprintf(stderr, "O FingerFx não consegue abrir o dispositivo (leitor óptico).\nERRO-NCONECTADO\n");
      goto out;
   }

   printf("O FingerFx esta comparando a digital do dispositivo contra a digital "
      "armazenada...\n");

   s = fp_print_data_load(dev, RIGHT_INDEX, &data);
   if (s != 0) {
      fprintf(stderr, "O FingerFx falhou ao carregar a digital armazenada com o erro %d\n", r);
      fprintf(stderr, "Você realmente digitalizou seu dedo antes de executar esta "
         "etapa?\n");
      goto out_close;
   }

   printf("A digital armazenada foi carregada e esta pronta para ser testada!\n");
   do {
      char buffer[20];


      verify(dev, data);


/* AQUI EU REMOVI COM UM COMENTÁRIO!!!


      printf("Verify again? [Y/n]? ");
      fgets(buffer, sizeof(buffer), stdin);
      if (buffer[0] != '\n' && buffer[0] != 'y' && buffer[0] != 'Y')

*/
         break;

   } while (1);

Depois de todas estas alterações eu executo o sistema e ele me retorna assim:

# ./enroll.c | grep FIM

Se tudo OK com a leitura, o programa só retorna:

FIM-OK

Se der algo errado como por exemplo um erro de dispositivo ele retorna.

FIM-ERRO

ou FIM-(e o erro referente)

Você pode incluir o código dos arquivos diretamente no fonte do seu programa.

Assim você pode capturar até erros específicos utilizando estes códigos de erro personalizados!

Comparação da digital:

A Libfprint ainda não compara várias digitais, no caso - não tenho certeza, estou deduzindo - o leitor compara via hardware uma digital salva com o comando enroll e retorna o resultado, pois eu já li toda a documentação da libfprint e em momento algum é mencionado alguma herança ou objeto do cabeçalho que exerça tal função.

O arquivo binário contendo os dados da digital para comparação é salvo dentro da pasta /.fprint/prints/0002/00000000 do diretório do usuário que executou o comando. O arquivo com a imagem da digital é salvo na pasta home do usuário. Se você quiser alterar o nome do arquivo que é gerado, pode mudar no fonte do enroll e verify.

Nós da Linuxfx estamos desenvolvendo um aplicativo livre que pode comparar via software os binários salvos pela libfprint e retornar um boolean. Mas por enquanto ainda está em testes.

Eu gravei um vídeo demonstrando nosso sistema para automação de portaria utilizando a biometria digital, o FingerFX:
Espero que este artigo ajude os programadores que estão tendo dor de cabeça para entender/utilizar a biblioteca libfprint no Linux.

Caso aja algum erro no documento ou algo que eu esqueci de mencionar, me mande um e-mail que eu corrijo.

Rafael Wagner - Programador e mantedor do Linuxfx.

Página anterior    

Páginas do artigo
   1. Entendendo, compilando e executando
   2. Desenvolvendo um aplicativo para leitura da impressão digital
Outros artigos deste autor

Biometria digital - Sistemas AFIS em Gnu/Linux

Leitura recomendada

Tutorial SFML

A poderosa nuvem: Intel® DevCloud com GPU Iris Xe Max!

Ponteiros - Saindo de Pesadelos

Tutorial OpenGL v3.0

lib cURL - Trabalhe com URLs em C

  
Comentários
[1] Comentário enviado por fchevitarese em 21/01/2009 - 10:53h

Opa!!!
Gostaria de saber se é possível utilizar a libfprint para desenvolver aplicativos web ...
Pois alguns clientes de nossa empresa necessitam da validação biométria na internet. Por exemplo, para verificar se o dono de um cartão é ele mesmo!

No mais, achei seu artigo simples e objetivo!

Obrigado ;)

Fred Chevitarese - GNU/Linux

[2] Comentário enviado por rafael_linuxfx em 21/01/2009 - 22:44h

Olá, existe um projeto open source que tem todas estas funções:

http://www.vivaolinux.com.br/artigo/S1-Ponto-Sistema-de-controle-de-ponto-Open-Source-para-Linux

[3] Comentário enviado por Librarian em 22/01/2009 - 15:36h

"Não garanto que funcione!"

E como tu publicas um procedimento que tu mesmo não executaste?

[4] Comentário enviado por rafael_linuxfx em 22/01/2009 - 16:34h

Não testei por que meu sistema não é Ubuntu. Só deixei disponível, para o caso de algum usuário que utilize Ubuntu queira testar.

Acho que não custa deixar uma opção a mais para facilitar a instalação para usuários de uma distro específica. :)

[5] Comentário enviado por menezes32 em 27/01/2009 - 14:35h

BOA TARDE!

ESTOU COM UM PEQUENO PROBLEMA PARA FAZER FUNCIONAR O MEU IDENTIFICADOR BIOMETRICO EM MEU NOTEBOOK.

ELE É UM ACER 6292 COM UM IDENTIFICADOR BIOMETRICO INCORPORADO. JA TENTEI INSTALAR ALGUNS PROGRAMAS MAIS NADA!

EU USO O UBUNTU 8.10.

VC TERIA ALGUMA SOLUÇÃO PARA RESOLVER DE UMA VEZ POR TODAS O MEU PROBLEMAS? EXISTE ALGUMA PROCEDIMENTO A SEGUIR DIFERENTE?

VI O SEU ARTIGO AQUI MAIS NÃO TESTEI.

FAVOR ENVIAR A RESPOSTA PARA O MEUS EMAIL SE POSSIVEL: ERICBARROSMENEZES@GMAIL.COM

GRATO PELA RESPOSTA JA ANTECIPADAMENTE!


ERIC


[6] Comentário enviado por rafael_linuxfx em 28/01/2009 - 20:42h

Olá!

Eu testei o procedimento de instalação que "Ainda não havia testado" no Ubuntu 8.10, e o leitor integrado do meu notebook não funcionou! mas não pelo método de instalação, que foi 100% correto e sim pela incompatibilidade do meu leitor com a Libfprint, tente instalar no seu e testar, pois pode ser que o seu seja compatível com a libfprint. Na mesma hora testei um USB da microsoft o fingerprint reader e funcionou de primeira.

Se puder lhe ajudar em algo mais, estou a disposição.

[7] Comentário enviado por sandroandrade26 em 05/01/2010 - 13:53h

Executei o primeiro metodo, instalei todas os pacotes necessários na instalação do ./configure, mas quando vou utilizar o make esta dando vários erros, alguem poderia me ajudar.

[8] Comentário enviado por duda10 em 05/05/2010 - 11:48h

Bom dia Rafael,

Estou fazendo meu TCC e o tema é biometria no linux, que linguagem de programação você usou para chamar a libfprint no sistema fingerfx? Se possível, me ajude. Aí vai meu e-mail para contato: tarihs.belli@gmail.com.
Obrigada!!!

[9] Comentário enviado por samuelsonbrito em 14/06/2016 - 11:50h

Como faço para usar o fprint no android. Vi alguns vídeos na internet de pessoas usando, mas não encontrei nenhum tutorial.

[10] Comentário enviado por samuelsonbrito em 14/06/2016 - 11:51h

Como faço para usar o fprint no android? Vi alguns vídeos na internet de pessoas usando, mas não encontrei nenhum tutorial.


Contribuir com comentário