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: 37.445 ]

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

Projeto Icecream (parte 1)

Tutorial SFML

Android NDK: Desmistificando o acesso a códigos nativos em C

SDL e C - Uma dupla sensacional

Estudando recursividade direta e indireta

  
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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts