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.
Por: Rafael Wagner Souza da Silva
Entendendo, compilando e executando
Utilizando leitor biométrico de impressão digital no Linux e desenvolvendo softwares à partir da LibFprint.
Neste tutorial vou ensinar pela própria experiência, o caminho percorrido para ativar e instalar um leitor biométrico de impressão digital no sistema, além de capturar e gerenciar os erros possivelmente gerados pela má leitura do leitor biométrico da digital.
Libfprint v0.0.6
A libfprint é uma biblioteca livre para desenvolvimento de softwares - SDK - que interage com o leitor biométrico de digital através da porta USB. A maior vantagem desta biblioteca é que ela suporta vários modelos de leitores, além de ser livre, claro. No Windows uma biblioteca com o mesmo fim é paga e é cara!
Instalando a Libfprint
Existe vários modos de instalar a Libfprint no seu sistema, vou listar aqui o método que utilizei para instalar no Linuxfx Burntux, que é baseado no Debian Testing/Ubuntu.
Baixar os fontes no site do projeto: Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... (fontes da biblioteca)
Compilando o fonte:
$ su - vai pedir a senha do administrador
# tar -jxvf libfprint-0.0.6.tar.bz2
# cd libfprint-0.0.6
# ./configure
Aqui é que o bicho começa a pegar (Ubuntu, Linuxfx, Debian testing e outros: Dependências!).
A cada "./configure" o sistema vai informar a dependência que ele necessita para efetuar a compilação com sucesso. Não vou listar as minhas, pois o seu sistema pode ser diferente.
A solução mais correta neste caso é abrir o Synaptic e instalar manualmente os pacotes procurando e instalando a versão de desenvolvimento, estes pacotes são seguidos de "- dev". Um exemplo bem simples é, se o ./configure reclamar a falta da biblioteca imagemagick, você vai procurar no Synaptic imagemagick e vai encontrar:
* libmagic++9-dev
* C++ API to the ImageMagick library - development files
* Magick++ supports an object model which is inspired by PerlMagick
Você deve instalar esta biblioteca e executar mais uma vez o ./configure até resolver todos os problemas de dependências.
Com os problemas de dependência resolvidos, execute o comando "make" para efetuar a compilação na íntegra, a seguir transforme-se em super-usuário para efetuar a instalação da bibliotecas através do comando "make install" seguido do "ldconfig", conforme as instruções abaixo.
# make
# make install
# ldconfig
Para finalizar este pacote, entre na pasta "example" e execute o comando "make" para compilar os códigos exemplos.
# cd examples/
# make
Aqui você já instalou e configurou a libfprint. Para testar:
# ./enroll
# ./verify
Outro modo, não testado por mim
Para fazer o fingerprint reader funcionar, você precisará de um repositório que contenha o FPrint. Adicionando o repositório ao seu sources.list:
# echo -e "# Fingerprint reader support (fprint)\ndeb Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... hardy main restricted universe multiverse" | tee -a /etc/apt/sources.list
Em seguida instale os pacotes necessários:
# apt-get update
# apt-get install fprint-demo libfprint-dev libfprint0 libpam-fprint
Você precisará estar no grupo de usuários "plugdev" para utilizar o leitor de impressões digitais (FingerPrint Reader):
# usermod -a -G plugdev $USER
# groups | grep plugdev
# sudo chgrp -R plugdev /dev/bus/usb/
Agora você está pronto para testá-lo. Execute "fprint-demo" para fazer o teste.
Não garanto que funcione!
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:
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".
O mesmo foi feito com o verify.c:
e na sequência:
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:
* Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... (feito em formato livre OGG)
* Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... (plugin OGG para os usuários que ainda utilizam Windows)
Espero que este artigo ajude os programadores que estão tendo dor de cabeça para entender/utilizar a biblioteca libfprint no Linux.
Fonte: vivaoLinux
Postado Por: RedDeviL
Por: Rafael Wagner Souza da Silva
Entendendo, compilando e executando
Utilizando leitor biométrico de impressão digital no Linux e desenvolvendo softwares à partir da LibFprint.
Neste tutorial vou ensinar pela própria experiência, o caminho percorrido para ativar e instalar um leitor biométrico de impressão digital no sistema, além de capturar e gerenciar os erros possivelmente gerados pela má leitura do leitor biométrico da digital.
Libfprint v0.0.6
A libfprint é uma biblioteca livre para desenvolvimento de softwares - SDK - que interage com o leitor biométrico de digital através da porta USB. A maior vantagem desta biblioteca é que ela suporta vários modelos de leitores, além de ser livre, claro. No Windows uma biblioteca com o mesmo fim é paga e é cara!
Instalando a Libfprint
Existe vários modos de instalar a Libfprint no seu sistema, vou listar aqui o método que utilizei para instalar no Linuxfx Burntux, que é baseado no Debian Testing/Ubuntu.
Baixar os fontes no site do projeto: Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... (fontes da biblioteca)
Compilando o fonte:
$ su - vai pedir a senha do administrador
# tar -jxvf libfprint-0.0.6.tar.bz2
# cd libfprint-0.0.6
# ./configure
Aqui é que o bicho começa a pegar (Ubuntu, Linuxfx, Debian testing e outros: Dependências!).
A cada "./configure" o sistema vai informar a dependência que ele necessita para efetuar a compilação com sucesso. Não vou listar as minhas, pois o seu sistema pode ser diferente.
A solução mais correta neste caso é abrir o Synaptic e instalar manualmente os pacotes procurando e instalando a versão de desenvolvimento, estes pacotes são seguidos de "- dev". Um exemplo bem simples é, se o ./configure reclamar a falta da biblioteca imagemagick, você vai procurar no Synaptic imagemagick e vai encontrar:
* libmagic++9-dev
* C++ API to the ImageMagick library - development files
* Magick++ supports an object model which is inspired by PerlMagick
Você deve instalar esta biblioteca e executar mais uma vez o ./configure até resolver todos os problemas de dependências.
Com os problemas de dependência resolvidos, execute o comando "make" para efetuar a compilação na íntegra, a seguir transforme-se em super-usuário para efetuar a instalação da bibliotecas através do comando "make install" seguido do "ldconfig", conforme as instruções abaixo.
# make
# make install
# ldconfig
Para finalizar este pacote, entre na pasta "example" e execute o comando "make" para compilar os códigos exemplos.
# cd examples/
# make
Aqui você já instalou e configurou a libfprint. Para testar:
# ./enroll
# ./verify
Outro modo, não testado por mim
Para fazer o fingerprint reader funcionar, você precisará de um repositório que contenha o FPrint. Adicionando o repositório ao seu sources.list:
# echo -e "# Fingerprint reader support (fprint)\ndeb Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... hardy main restricted universe multiverse" | tee -a /etc/apt/sources.list
Em seguida instale os pacotes necessários:
# apt-get update
# apt-get install fprint-demo libfprint-dev libfprint0 libpam-fprint
Você precisará estar no grupo de usuários "plugdev" para utilizar o leitor de impressões digitais (FingerPrint Reader):
# usermod -a -G plugdev $USER
# groups | grep plugdev
# sudo chgrp -R plugdev /dev/bus/usb/
Agora você está pronto para testá-lo. Execute "fprint-demo" para fazer o teste.
Não garanto que funcione!
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:
Código:
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 (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".
Código:
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);
Código:
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);
Código:
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);
# ./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:
* Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... (feito em formato livre OGG)
* Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... (plugin OGG para os usuários que ainda utilizam Windows)
Espero que este artigo ajude os programadores que estão tendo dor de cabeça para entender/utilizar a biblioteca libfprint no Linux.
Fonte: vivaoLinux
Postado Por: RedDeviL
Comment