Sistema de Gerência de Controle de Acesso

UFSC/CTC/EEL, semestre 2012/2

Prof. Eduardo Bezerra

Desenvolvimento de aplicações em C++ para sistemas embarcados

Descrição Geral do Problema

Este trabalho consiste em modelar e implementar um sistema de gerência de controle de acesso na web. Basicamente, existe uma leitora de cartões na entrada de um recinto. Ao passar um cartão pela leitora, o código contido no cartão é lido por um sistema microprocessado onde a leitora está conectada, e esse código é utilizado para consultar uma base de dados MySQL remota. Essa base possui, além do código, informações tais como nome, nr. da sala, permissão de acesso a essa sala, hora inicial e hora final do intervalo em que a pessoa possui acesso ao recinto em questão. Caso a pessoa possua permissão para acesso a sala, e caso esteja no horário permitido, então o programa em C++ envia um sinal para liberar a tranca eletro-magnética da porta. Todos os eventos de leitura de um cartão com código de barras irão gerar uma entrada em um arquivo de log no computador local.

O funcionamento do sistema é bastante direto:

  1. usuário fornece sua identificação com o cartão (ex. número de matrícula);
  2. programa realiza acesso remoto (banco de dados MySQL), de forma a recuperar os dados do usuário;
  3. se o usuário estiver cadastrado, e com autorização para entrar no recinto em questão, e no horário atual, então alguns dados são apresentados na tela do computador, e o acesso é liberado (ou não, caso o usuário não tenha acesso ao ponto em questão, em determinado horário, …);
  4. além de liberar o acesso, é gerado um arquivo de log local (o banco de dados remoto é apenas para leitura);
  5. caso o usuário não esteja cadastrado, ou não possua acesso por alguma razão, então o sistema informa o acesso negado, e registra a informação no arquivo de log local;

O sistema deverá possibilitar a geração de relatórios gerenciais, por exemplo:

  • todos os acessos
  • apenas acessos negados
  • apenas acessos permitidos
  • listagem por data/hora (período) de acessos permitidos e negados;
  • estatística de acessos
  • listagem dos usuários cadastrados no banco de dados remoto;

entre outros.

Aspectos Técnicos

Serão necessárias diversas classes no sistema. Por exemplo:

  • classe Usuário;
  • classe DataHora;
  • classe Acesso;
  • classes para relatórios;

entre outras.

É importante dividir o sistema em módulos, de forma a facilitar o desenvolvimento e teste de cada componente. Utilizar as facilidades existentes no C++ para encapsulamento e ocultação, de forma a desenvolver classes responsáveis por todas as atividades de um determinado módulo. Por exemplo, a classe Usuário deverá possuir tudo o que se refere aos usuários (ex. atributos nome, código, …, funções para manipulação dos atributos do usuário, …).

O sistema deverá permanecer em execução, apresentando um menu de opções, onde o usuário poderá informar se deseja simular a leitura de um cartão, obter um relatório, entre outros.

Leitura dos cartões

Pode ser criada uma classe para leitura de cartão, que se encarrega das atividades de ler o cartão. Por exemplo, usar um cout << “Passe o cartao”; seguido por um cin >> cartao. Ou seja, no lugar de receber o dado do cartão via
uma interface de entrada e saída do computador (ex. USB ou RS-232C), simula-se
a leitura desse dado usando o dispositivo padrão de entrada (teclado).

Deverá existir alguma forma dessa classe disponibilizar para o restante do sistema
o valor lido do cartão do usuário.

Dica para plataforma RenesasSe a opção de leitura dos cartões for pela utilização do microcontrolador da Renesas (kit QSK26A) conectado a uma leitora de código de barras, então uma sugestão de código em C seria: ser_poll_demo.cApós realizada a leitura do cartão, o matrícula pode ser enviada para um microcomputador conectado a leitora via porta serial RS-232C. Para isso, será necessário que o programa em C++ em execução no microcomputador possua uma rotina de leitura da porta serial, conforme o exemplo disponível em Robot.c.

Acesso a base de dados MySQL

É interessante usar o conceito de encapsulamento no projeto da classe que irá acessar a base de dados MySQL. Isso facilitará a etapa de testes pois, caso o computador nao esteja conectado na Internet no momento do teste, poderá ser utilizada uma outra classe que utilize, por exemplo, um arquivo local contendo informações semelhantes as existentes na base de dados.

Após receber um novo código de um cartão, obtido pela classe de “leitura de código”, é necessário usar esse código para acessar a base de dados MySQL. Utilizar as seguintes informações:

  • Servidor: sirius.eel.ufsc.br
  • base de dados: cpp
  • tabela: acesso
  • usuario: cpp
  • senha: cppacesso

Campos existentes na tabela:

  • matricula: string
  • nome: string
  • sala: string
  • hora_inicio: int
  • minuto_inicio: int
  • hora_fim: int
  • minuto_fim: int

Exemplo de uso:

mysqlpp::Connection conn(false);

if (conn.connect(“cpp”, “sirius.eel.ufsc.br”, “cpp”, “cppacesso”))

mysqlpp::Query query = conn.query(“select matricula from acesso”);

res = query.store();

A penúltima linha realiza uma consulta na tabela “acesso”, da base de dados “cpp”. Essa consulta retorna todas as matrículas armazenadas na tabela (todas as linhas da tabela). A última linha armazena todas as matrículas lidas na variável “res”.

Obs. Para facilitar as etapas de desenvolvimento do trabalho, no lugar da conexão mysql (biblioteca mysql++) poderá ser criada uma classe que realiza todo o acesso a uma base de dados local. Siga esse link para exemplo de base de dados local (arquivo texto), e código em C++ para acesso a esse arquivo. Para exemplo de arquivo com números de matrículas, usar: arquivo texto com matrículas.

Validação da informação

Após obtido o registro da tabela contendo as informações referentes a uma determinada matrícula, deve-se utilizar uma classe para validar essa informação, e informar ao restante do sistema que atitudes tomar.
As seguintes situações poderão ocorrer:

  • Não existe uma matrícula na tabela equivalente ao código (matrícula) enviado (resultado da query é um conjunto vazio);
  • A matrícula existe, mas o cartão foi lido fora do horário previsto na tabela;
  • A matrícula existe, e está dentro do horário.

Obs. Dica para obter a data/hora do sistema, e usar no programa em C++: usar a função system(“date > datahora.txt”);. Após a execução dessa função, será criado um arquivo texto no diretório onde o programa está sendo executado contendo apenas uma linha com um conteúdo semelhante a: Qua Out 3 17:10:02 BRT 2012. Basta ler esse arquivo, copiar o conteúdo para uma string, e manipular a string de forma a extrair a informação desejada de data e hora do sistema. Outra opção seria utilizar as funções disponíveis nas bibliotecas da linguagem C.
Siga esse link para um exemplo. Ao utilizar a hora de um sistema unix (POSIX), tomar cuidado com o problema do ano 2038.

Liberação do acesso

Caso o acesso seja liberado ao usuário, entao deve-se apresentar uma mensagem com essa informação. Isso deve ser realizado também por uma classe, de forma a facilitar uma possível substituição dessa classe, por uma outra que escreve em um outro tipo de dispositivo de saída (LCD, touch screen, …), ou que aciona uma tranca eletro-magnética, por exemplo.

Arquivo de log local

Todos os eventos relacionados a leitura de cartões devem ser armazenados em um arquivo de log local. Esse arquivo deverá possuir exatamente uma linha para cada evento. Nessa linha deve ser informado, pelo menos, o código lido, a data e hora, e se o usuário foi autorizado ou não a entrar no recinto. Utilizar um arquivo no formato texto.

Relatórios gerenciais

Um outro módulo do sistema é responsável pela emissão de relatórios gerenciais. Esses relatórios possibilitam ao administrador do sistema obter informações, tais como:

  • total de acessos permitidos em um determinado dia
  • total de acessos negados em um determinado dia
  • total de acessos permitidos em um determinado período
  • total de acessos negados em um determinado período
  • matrícula com maior número de acessos em um determinado dia
  • matrícula com maior número de acessos em um determinado período

entre outros.

Arquivos exemplo

A seguir estão listados alguns exemplos de programas que podem ser utilizados como base para o desenvolvimento do trabalho:

  • Leitura de dados pela serial, acionamento de fechadura na paralela, e acesso a base de dados MySQL: portariagsed.c
  • Acesso a serial em C++: Robot.cpp
  • Acesso a serial e MySQL com interface gráfica no Linux: ctrl_frequencia.zip

Avaliação

Conforme colocado anteriormente, devem ser criadas diversas classes, de acordo com as necessidades do sistema. Um dos objetivos deste trabalho é a modelagem adequada dos atributos e métodos dessas classes.

Isso significa que devem ser explorados os conceitos de programação orientada a
objetos, e não simplesmente criar um longo programa usando apenas a classe Acesso, por exemplo. Trabalhos que implementem a solução dessa forma, mesmo que 100% correta, sofrerão descontos na nota final.

O programa deverá ser executado no sistema operacional Linux. Não serão aceitos trabalhos que não compilem corretamente no g++, sob hipótese nenhuma.

O código-fonte deve estar adequadamente comentado (nas suas artes/algoritmos
principais, pelo menos) e no seu início deve haver um comentário com o nome dos alunos e demais dados de identificação do programa.

O trabalho poderá ser desenvolvido em grupos com no máximo 3 integrantes.

Entrega e apresentação

Todos os trabalhos deverão ser entregues até o dia 18/fev/2013 18:00, e apresentados na data marcada – não serão aceitos trabalhos entregues fora do prazo.

Deverá ser realizada apenas uma entrega por grupo. Um dos membros do grupo deverá ficar responsável por realizar o upload dos arquivos do grupo no Moodle, de acordo com as instruções a seguir.

O trabalho será apresentado no laboratório (sala de aula da disciplina), no dia 20/fev/2013 entre 14:00 e 16:00. Durante a apresentação, os alunos deverão estar aptos a responder quaisquer perguntas. Respostas insatisfatórias ou a ausência dos alunos acarretará em anulação da nota final do respectivo aluno.

No momento da apresentação, os grupos já deverão ter submetido no Moodle, todos os códigos fontes (.h e .cpp) necessários, assim como um relatório simplificado sobre o trabalho desenvolvido. Será avaliada também a escolha dos nomes dos arquivos e classes, conforme estudado em aula.

Para realizar a entrega no Moodle, compactar em um único .zip (ou rar, ou gzip) os arquivos fonte (.cpp, .c, .h) e o relatório do Projeto Final.

O nome do arquivo compactado deverá ser o nome do(s) aluno(s) sem espacos ou acentuação, e com a primeira letra de cada palavra em letra maiúscula. Por exemplo, para o aluno:

  • João Damião de Assunção Müller

o arquivo a ser entregue deverá possuir o nome:

  • JoaoMuller.zip

Para o grupo formado pelos alunos:

  • João Damião de Assunção Müller
  • Maria dos Santos João

o arquivo a ser entregue deverá possuir o nome:

  • JoaoMuller_MariaJoao.zip

TAMANHO MÁXIMO DO ARQUIVO COMPACTADO: 1MB

ATENÇÃO PARA O PRAZO FINAL DE ENTREGA! NÃO SERÃO ACEITOS TRABALHOS APÓS O PRAZO FINAL!!