Mudanças entre as edições de "Projeto PRG- Engenharia"
Ir para navegação
Ir para pesquisar
m (moveu Controle de acesso - Programação 1 para Projeto PRG- Engenharia) |
|||
(2 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 5: | Linha 5: | ||
/*********************************************************************** | /*********************************************************************** | ||
− | + | Programa de controle de acesso | |
− | + | Disciplina de programação - Engenharia de telecomunicações | |
− | + | IFSC 2013 | |
− | + | Professor: | |
− | + | Prof. Eraldo Silveira e Silva, Dr. | |
− | + | Autoras: | |
− | + | Ana Luiza Scharf | |
− | + | Karoline da Rocha | |
− | + | Incrementos: | |
− | + | André Felippe Weber | |
− | *************************************************************************/ | + | *************************************************************************/ |
#include <stdio.h> | #include <stdio.h> | ||
#include <string.h> | #include <string.h> | ||
− | + | #include "bibprg.h" | |
#include <stdlib.h> | #include <stdlib.h> | ||
#include <time.h> | #include <time.h> | ||
#include "main.h" | #include "main.h" | ||
#include "admin.h" | #include "admin.h" | ||
− | + | #include <stdio.h> | |
+ | #include <unistd.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <string.h> | ||
+ | #include <sys/socket.h> | ||
+ | #include <bluetooth/bluetooth.h> | ||
+ | #include <bluetooth/rfcomm.h> | ||
+ | #include <errno.h> | ||
+ | #include <sys/types.h> | ||
+ | #include <netinet/in.h> | ||
+ | #include <fcntl.h> | ||
+ | #include <dirent.h> | ||
+ | #include <sys/stat.h> | ||
+ | #include <sys/select.h> | ||
struct TUsuario *head, *tail; /* ponteiros inicial e final*/ | struct TUsuario *head, *tail; /* ponteiros inicial e final*/ | ||
char userID[TAM_VET]; | char userID[TAM_VET]; | ||
+ | char *buf_bluetooth = "senha"; | ||
+ | struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 }; | ||
+ | char buf[1024] = { 0 }; | ||
+ | int s, client, bytesRead, passo; | ||
+ | socklen_t opt = sizeof(rem_addr); | ||
+ | |||
+ | //----------------------------------------------------------- | ||
+ | char Blue(char *retorno) { | ||
+ | if ((client = accept(s, (struct sockaddr *) &rem_addr, &opt)) < 0) { | ||
+ | perror("accept: "); | ||
+ | exit(1); | ||
+ | } | ||
− | //------------------------------------------------------------ | + | memset(buf, 0, sizeof(buf)); |
+ | |||
+ | // read data from the client | ||
+ | if ((bytesRead = read(client, buf, sizeof(buf))) == -1) { | ||
+ | perror("Erro read"); | ||
+ | exit(1); | ||
+ | } | ||
+ | passo = client; | ||
+ | close(client); | ||
+ | strcpy(retorno, buf); | ||
+ | return; | ||
+ | |||
+ | } | ||
+ | //----------------------------------------------------------- | ||
+ | |||
+ | char Pblue(char *mensagem) { | ||
+ | |||
+ | if ((client = accept(s, (struct sockaddr *) &rem_addr, &opt)) < 0) { | ||
+ | perror("accept: "); | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | memset(buf, 0, sizeof(buf)); | ||
+ | |||
+ | //envia uma resposta | ||
+ | strcpy(buf, mensagem); | ||
+ | write(client, buf, sizeof(buf)); | ||
+ | sleep(1); | ||
+ | |||
+ | // close connection | ||
+ | close(client); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | //----------------------------------------------------------- | ||
+ | |||
+ | void mostrar_menu_entrada_usuario() { | ||
+ | |||
+ | printf("\nEntre com o seu USERID para ter acesso\n"); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
//------------------------------------------------------------ | //------------------------------------------------------------ | ||
− | /* | + | /* Função para encontrar usuários na lista ligada*/ |
− | struct TUsuario *encontrar_usuario_lista( char *userID) | + | struct TUsuario *encontrar_usuario_lista(char *userID) { |
− | { | ||
− | struct TUsuario *p; | + | struct TUsuario *p; |
− | + | p = head; | |
− | + | while (p) { /* loop para encontrar usuário*/ | |
− | + | if (strcmp(userID, p->userID) == 0) | |
− | + | return p; | |
− | + | p = p->next; | |
− | + | } | |
− | + | return NULL; | |
} | } | ||
Linha 63: | Linha 120: | ||
{ | { | ||
− | + | time_t ltime; | |
− | + | FILE *fp; | |
− | + | ||
− | + | time(<ime); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if ((fp = fopen("DATA.txt", "a")) == NULL) {/*Abre um arquivo com dados de login*/ | |
− | + | printf("Problemas na abertura do arquivo\n"); | |
− | + | return; | |
− | + | } | |
− | + | ||
− | + | if (fprintf(fp, "%s %s\n", ctime(<ime), p->userID)) {/*escreve a cadeia de caracteres e o usuário no arquivo DATA*/ | |
− | + | printf("%s", ctime(<ime)); | |
+ | fclose(fp); | ||
+ | |||
+ | } else { | ||
+ | printf("Erro na escrita do arquivo!\n"); | ||
+ | } | ||
} | } | ||
//----------------------------------------------- | //----------------------------------------------- | ||
− | int permissao(struct TUsuario *p) | + | int permissao(struct TUsuario *p) { |
− | { | + | |
− | + | time_t rawtime; | |
− | + | ||
+ | struct tm *tminfo; | ||
+ | |||
+ | time(&rawtime); | ||
+ | tminfo = localtime(&rawtime); | ||
+ | if (blue == 0) | ||
+ | printf("porta aberta: hora: %d minuto: %d segundo: %d \n", | ||
+ | tminfo->tm_hour, tminfo->tm_min, tminfo->tm_sec); | ||
+ | |||
+ | if (p->entrada.hora < tminfo->tm_hour) {/*testa se a hora real é maior que o tempo definido na entrada*/ | ||
− | + | } else { | |
− | + | if (p->entrada.hora == tminfo->tm_hour) {/* Caso a hora real for igual ao tempo de entrada, assim testa minutos e segundos*/ | |
− | |||
− | |||
− | + | if (p->entrada.minuto < tminfo->tm_min) { | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if (p->entrada.segundo < tminfo->tm_sec) { | |
− | + | } else { | |
+ | return 2;/* Caso alguma dessas comparações sejam falsas retorna 2*/ | ||
+ | } | ||
+ | } else { | ||
+ | return 2; | ||
+ | } | ||
+ | } else { | ||
+ | return 2; | ||
+ | } | ||
+ | } | ||
− | + | if (p->saida.hora > tminfo->tm_hour) {/* Quando a hora real esta no limite de entrada e saída ja sai dos if's e retorna 1*/ | |
− | + | return 1; | |
− | + | } else { | |
− | + | if (p->saida.hora == tminfo->tm_hour) {/*Caso a hora real for igual ao tempo de saída, assim testa minutos e segundos*/ | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if (p->saida.minuto > tminfo->tm_min) { | |
− | + | if (p->saida.segundo < tminfo->tm_sec) { | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | } else { | |
− | + | return 2; | |
+ | } | ||
+ | } else { | ||
+ | return 2; | ||
+ | } | ||
+ | } else { | ||
+ | return 2; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | printf("deixa passar\n");/* Se todas as comparações forem verdadeiras retorna 1*/ | ||
+ | return 1; | ||
} | } | ||
Linha 144: | Linha 200: | ||
/* Função para sorteia uma pergunta para confirmar o usuário*/ | /* Função para sorteia uma pergunta para confirmar o usuário*/ | ||
+ | char *pergunta; | ||
+ | int perguntas(struct TUsuario *p) { | ||
+ | |||
+ | int iSecret, iGuess; | ||
+ | char resp[TAM_VET], retorno[256]; | ||
− | + | srand (time(NULL) );/* inicia o randômico*/ | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | iSecret = rand() % 3 + 1; /*sorteia o número*/ | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if (iSecret == 1) { | |
− | + | if (blue == 0) { | |
− | + | printf("Digite o primeiro nome do seu pai\n"); | |
− | + | scanf("%s", resp); | |
− | + | } else { | |
− | + | Pblue("Digite o primeiro nome do seu pai"); | |
− | + | Blue(retorno); | |
− | + | strcpy(resp, retorno); | |
− | + | } | |
− | |||
− | + | if (strcmp(resp, p->nome_pai) == 0) { | |
− | + | return 1; | |
− | + | } else { | |
+ | return 0; | ||
+ | } | ||
+ | } | ||
− | + | if (iSecret == 2) { | |
− | + | if (blue == 0) { | |
− | + | printf("Digite o nome da sua cidade natal\n"); | |
− | + | scanf("%s", resp); | |
− | + | } else { | |
− | + | Pblue("Digite o nome da sua cidade natal"); | |
+ | Blue(retorno); | ||
+ | strcpy(resp, retorno); | ||
+ | } | ||
+ | |||
+ | if (strcmp(resp, p->cid_natal) == 0) { | ||
+ | return 1; | ||
+ | } else { | ||
+ | return 0; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if (iSecret == 3) { | ||
+ | if (blue == 0) { | ||
+ | printf("Digite o primeiro nome da sua mãe\n"); | ||
+ | scanf("%s", resp); | ||
+ | } else { | ||
+ | Pblue("Digite o primeiro nome da sua mãe"); | ||
+ | Blue(retorno); | ||
+ | strcpy(resp, retorno); | ||
+ | } | ||
+ | |||
+ | if (strcmp(resp, p->nome_mae) == 0) { | ||
+ | return 1; | ||
+ | } else { | ||
+ | return 0; | ||
+ | } | ||
+ | } | ||
} | } | ||
//----------------------------------------------- | //----------------------------------------------- | ||
− | void tratar_usuario() | + | void tratar_usuario() { |
− | { | + | char senha[TAM_VET], retorno[256]; |
− | + | struct TUsuario *p; | |
− | + | int ret; | |
− | + | int r; | |
− | + | ||
− | + | p = encontrar_usuario_lista(userID); /* Procura o usuário na lista */ | |
− | + | ||
+ | if (!p) { /* Se o usuário existir*/ | ||
+ | printf("\nUsuário inválido\n"); /* quando o usuário não está na lista*/ | ||
+ | } else { | ||
+ | r = 1; //permissao(p); | ||
+ | if (r == 1) { | ||
+ | // if(p -> contador < 3){ /* analisa o número de tentativas*/ | ||
+ | if (blue == 0) { | ||
+ | printf("\n%s %s!Entre com a senha\n", p->mensagem, p->userID); | ||
+ | scanf("%s", senha); | ||
+ | } else { | ||
+ | Pblue("senha"); | ||
+ | Blue(retorno); | ||
+ | strcpy(senha, retorno); | ||
+ | } | ||
+ | //printf("%s", pergunta); | ||
+ | if (strcmp(senha, p->senha) == 0) { | ||
+ | ret = perguntas(p); | ||
+ | |||
+ | if (ret == 1) { | ||
+ | if (blue == 0) | ||
+ | printf("\nPorta aberta\n"); | ||
+ | else | ||
+ | Pblue("Porta aberta"); | ||
+ | enviar_analogica('1', "150"); | ||
+ | sleep(2); | ||
+ | enviar_analogica('1', "000"); | ||
+ | p->contador = 0; /* zera o contador*/ | ||
+ | login(p); | ||
+ | } else { | ||
+ | p->contador++; /* Caso erre a pergunta acrescenta o contador*/ | ||
+ | if (blue == 0) | ||
+ | printf("\nDados invalidos\n"); | ||
+ | else | ||
+ | Pblue("Dados Invalidos"); | ||
+ | } | ||
− | + | } else { | |
− | + | p->contador++; /* Caso erre a senha acrescenta um contador*/ | |
− | + | if (blue == 0) | |
− | + | printf("\nSenha Invalida\n"); | |
− | + | else | |
− | + | Pblue("Senha invalida"); | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | } else { | |
− | + | if (blue == 0) | |
− | + | printf("\nFora do Horario\n"); | |
− | + | else | |
− | + | Pblue("Fora do Horario"); | |
− | + | } | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | + | ||
//------------------------------------------------------------ | //------------------------------------------------------------ | ||
− | void ler_lista() | + | void ler_lista() { |
− | { | + | struct TUsuario *p; |
− | + | FILE *p_arq; | |
− | + | int res; | |
− | |||
− | + | if ((p_arq = fopen("DADOS.txt", "r")) == NULL) {/*Abre um arquivo para ler os dados dos usuários*/ | |
− | + | head = tail = NULL; | |
− | + | return; | |
− | + | } | |
− | + | head = p = (struct TUsuario *) malloc(sizeof(struct TUsuario));/*Aloca a memória*/ | |
− | + | p->next = NULL; | |
− | + | for (;;) { | |
− | + | if ((res = fscanf(p_arq, "%s %s %s %s %s %s %d %d %d %d %d %d \n", | |
− | &p->entrada.minuto,&p->entrada.segundo,&p->saida.hora,&p->saida.minuto,&p->saida.segundo))==EOF){ | + | p->userID, p->senha, p->nome_pai, p->nome_mae, p->cid_natal, |
− | + | p->mensagem, &p->entrada.hora, &p->entrada.minuto, | |
− | + | &p->entrada.segundo, &p->saida.hora, &p->saida.minuto, | |
− | + | &p->saida.segundo)) == EOF) { | |
− | + | if (p == head) {/*Lista de usuários vazia*/ | |
− | + | head = NULL; | |
− | + | tail = NULL; | |
− | + | } else | |
− | + | tail->next = NULL;/*Finaliza a lista*/ | |
− | + | free(p);/*Libera a memória*/ | |
− | + | break; | |
− | + | } | |
− | + | tail = p; | |
+ | p = p->next = (struct TUsuario *) malloc(sizeof(struct TUsuario));/*Aloca a memória para novos usuários*/ | ||
+ | } | ||
+ | fclose(p_arq); | ||
} | } | ||
//----------------------------------------------------------- | //----------------------------------------------------------- | ||
− | + | int botao() { | |
+ | float n; | ||
+ | int i = 0; | ||
+ | |||
+ | n = receber_analogica('1'); | ||
+ | |||
+ | while (i == 0) { | ||
+ | n = receber_analogica('1'); | ||
+ | |||
+ | if (n > 0.20 && n != 0) { | ||
+ | if (n <= 0.26) { | ||
+ | return 9; | ||
+ | } | ||
+ | if (n > 0.26 && n < 0.30) { | ||
+ | return 8; | ||
+ | } | ||
+ | if (n >= 0.30 && n <= 0.35) { | ||
+ | return 7; | ||
+ | } | ||
+ | if (n >= 0.36 && n <= 0.40) { | ||
+ | return 6; | ||
+ | } | ||
+ | if (n >= 0.43 && n < 0.50) { | ||
+ | return 5; | ||
+ | } | ||
+ | if (n > 0.53 && n <= 0.58) { | ||
+ | return 4; | ||
+ | } | ||
+ | if (n > 0.70 && n <= 0.80) { | ||
+ | return 3; | ||
+ | } | ||
+ | if (n > 1.0 && n <= 1.1) { | ||
+ | return 2; | ||
+ | } | ||
+ | if (n > 1.8 && n <= 2.0) { | ||
+ | return 1; | ||
+ | } | ||
+ | if (n > 3.0 && n <= 3.3) { | ||
+ | return 0; | ||
+ | } | ||
+ | if (n > 4.0 && n <= 5.0) { | ||
+ | return 10; //enter | ||
+ | } | ||
+ | i = 1; | ||
+ | n = 0; | ||
+ | usleep(5000); | ||
+ | |||
+ | } | ||
+ | return 20; | ||
+ | } | ||
+ | return 20; | ||
+ | } | ||
+ | |||
+ | int main(int argc, char **argv) { | ||
− | + | int fd; | |
− | + | int fdmax; | |
− | + | int i, j, lag = 0; | |
− | + | size_t bytes_read; | |
− | + | fd_set master_set, myset; | |
− | + | char buffer[256]; | |
− | |||
− | + | char buf[50]; //variavel do teclado | |
+ | int bot, x = 0, y = 0, z = 0; //variaveis do teclado | ||
+ | int W = 6; | ||
+ | int segundos; | ||
− | + | FD_ZERO(&master_set); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | for (i = 1; i < argc; i++) { | |
− | + | if ((fd = open(argv[i], O_RDWR)) == -1) { | |
− | + | perror("open"); | |
− | + | exit(1); | |
− | + | } | |
+ | FD_SET(fd, &master_set); | ||
} | } | ||
− | + | // allocate socket http://www.br-c.org/doku.php?id=socket | |
− | FD_SET( | + | if ((s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) == -1) { |
+ | printf("Problemas na criação do socket\n"); | ||
+ | exit(-1); | ||
+ | } | ||
+ | FD_SET(s, &master_set); | ||
+ | fd++; | ||
− | + | /* registra o maior descritor */ | |
− | + | fdmax = fd; | |
− | |||
− | |||
− | + | // bind socket to port 1 of the first available | |
− | + | // local bluetooth adapter | |
− | + | //http://www.br-c.org/doku.php?id=bind | |
− | + | ||
− | + | loc_addr.rc_family = AF_BLUETOOTH; | |
− | + | loc_addr.rc_bdaddr = *BDADDR_ANY; | |
− | sscanf(buffer,"%s",userID); | + | //str2ba( endereco, &loc_addr.rc_bdaddr ); |
− | if(strcmp( userID, "admin")==0){ | + | loc_addr.rc_channel = (uint8_t) 3; |
+ | if (bind(s, (struct sockaddr *) &loc_addr, sizeof(loc_addr)) == -1) { | ||
+ | printf("Problemas no bind\n"); | ||
+ | exit(-1); | ||
+ | } | ||
+ | |||
+ | //listen http://www.br-c.org/doku.php?id=listen | ||
+ | printf("Preparando para listen..\n"); | ||
+ | // put socket into listening mode | ||
+ | if (listen(s, 1) < 0) | ||
+ | printf("Problemas de listen...\n"); | ||
+ | |||
+ | conectar(); | ||
+ | ler_lista(); | ||
+ | listar_lista(); | ||
+ | |||
+ | struct timeval timeout; | ||
+ | |||
+ | segundos = 0; | ||
+ | |||
+ | timeout.tv_sec = segundos; | ||
+ | timeout.tv_usec = 500000; | ||
+ | |||
+ | for (;;) { | ||
+ | if (x == 0) { | ||
+ | mostrar_menu_entrada_usuario(); | ||
+ | x = 1; | ||
+ | } | ||
+ | |||
+ | myset = master_set; /* deve ser copiado sempre pois o conjunto é alterado */ | ||
+ | |||
+ | if ((W = select(fdmax + 1, &myset, NULL, NULL, &timeout)) == -1) { | ||
+ | perror("select"); | ||
+ | exit(1); | ||
+ | } | ||
+ | if (W == 0) { | ||
+ | |||
+ | enviar_digital('1', '1'); | ||
+ | |||
+ | bot = botao(); | ||
+ | if (bot == 10) { | ||
+ | printf("enter"); | ||
+ | while (z < y) { | ||
+ | printf("\n %d \n", buf[z]); | ||
+ | z++; | ||
+ | x = 0; | ||
+ | } | ||
+ | z = 0; | ||
+ | } | ||
+ | |||
+ | if (bot >= 0 && bot <= 9) { | ||
+ | |||
+ | buf[y] = bot; | ||
+ | y++; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | if (FD_ISSET(3, &myset)) { | ||
+ | blue = 0; | ||
+ | if ((bytesRead = read(0, buffer, sizeof(buffer))) == -1) { | ||
+ | perror("Erro read"); | ||
+ | exit(1); | ||
+ | } | ||
+ | if (bytesRead > 0) { | ||
+ | sscanf(buffer, "%s", userID); | ||
+ | if (strcmp(userID, "admin") == 0) { | ||
administrar(); | administrar(); | ||
− | + | } else | |
− | + | tratar_usuario(); | |
− | + | ||
− | + | } | |
− | + | x = 0; | |
− | + | } | |
− | + | if (FD_ISSET(4, &myset)) { | |
− | + | blue = 1; | |
− | + | if ((client = accept(s, (struct sockaddr *) &rem_addr, &opt)) < 0) { | |
− | + | perror("accept: "); | |
− | + | exit(1); | |
− | + | } | |
− | + | ||
+ | memset(buf, 0, sizeof(buf)); | ||
+ | |||
+ | // read data from the client | ||
+ | if ((bytesRead = read(client, buf, sizeof(buf))) == -1) { | ||
+ | |||
+ | perror("Erro read"); | ||
+ | exit(1); | ||
+ | } | ||
+ | close(client); | ||
+ | |||
+ | if (bytesRead > 0) { | ||
+ | sscanf(buf, "%s", userID); | ||
+ | if (strcmp(userID, "admin") == 0) { | ||
+ | administrar(); | ||
+ | } else | ||
+ | tratar_usuario(); | ||
+ | |||
+ | } | ||
+ | x = 0; | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
} | } | ||
+ | |||
+ | |||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Linha 405: | Linha 641: | ||
#include "main.h" | #include "main.h" | ||
#include "admin.h" | #include "admin.h" | ||
+ | |||
+ | char retorno[256]; | ||
//------------------------------------------------------------ | //------------------------------------------------------------ | ||
Linha 410: | Linha 648: | ||
/* Função que permite subescrever a mensagem do usuário, quando o programa pedir sua senha*/ | /* Função que permite subescrever a mensagem do usuário, quando o programa pedir sua senha*/ | ||
− | struct TUsuario *nova_mensagem () | + | struct TUsuario *nova_mensagem() { |
− | { | + | struct TUsuario *p; |
− | |||
− | + | if (blue == 0) { | |
− | + | printf("\nESCOLHA O USUARIO\n"); | |
− | + | scanf("%s", userID); | |
− | + | } else { | |
− | + | Pblue("ESCOLHA O USUARIO"); | |
− | + | Blue(retorno); | |
− | + | strcpy(userID, retorno); | |
− | + | } | |
− | |||
− | |||
− | + | p = encontrar_usuario_lista(userID); | |
+ | |||
+ | if (!p) { | ||
+ | if (blue == 0) { | ||
+ | printf("Usuário não existente\n"); | ||
+ | } else { | ||
+ | Pblue("Usuário não existente"); | ||
+ | } | ||
+ | |||
+ | } else { | ||
+ | if (blue == 0) { | ||
+ | printf("\nDigite a nova mensagem Inicial\n"); | ||
+ | scanf("%s", p->mensagem); /* vai escrever uma mensagem na struct mensagem*/ | ||
+ | } else { | ||
+ | Pblue("Digite a nova mensagem Inicial"); | ||
+ | Blue(retorno); | ||
+ | strcpy(p->mensagem, retorno); | ||
+ | } | ||
+ | |||
+ | } | ||
} | } | ||
Linha 431: | Linha 685: | ||
/* Função para encontrar desbloquear usuário na lista ligada*/ | /* Função para encontrar desbloquear usuário na lista ligada*/ | ||
− | + | ||
− | struct TUsuario *desbloquear_usuario_lista( ) | + | struct TUsuario *desbloquear_usuario_lista() { |
− | { | + | struct TUsuario *p; |
− | + | if (blue == 0) { | |
− | + | printf("\nESCOLHA O USUARIO\n"); | |
− | + | scanf("%s", userID); | |
− | + | } else { | |
− | + | Pblue("ESCOLHA O USUARIO"); | |
− | + | Blue(retorno); | |
− | + | strcpy(userID, retorno); | |
− | + | } | |
− | + | ||
− | + | p = encontrar_usuario_lista(userID); | |
− | + | ||
− | + | if (!p) { | |
− | + | if (blue == 0) { | |
− | + | printf("Usuário não existente\n"); | |
− | } | + | } else { |
+ | Pblue("Usuário não existente"); | ||
+ | } | ||
+ | } else { | ||
+ | p->contador = 0; /* zerar o contador do usuário escolhido*/ | ||
+ | if (blue == 0) { | ||
+ | printf("\nUSUARIO DESBLOQUEADO\n"); | ||
+ | } else { | ||
+ | Pblue("USUARIO DESBLOQUEADO"); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
//------------------------------------------------------------ | //------------------------------------------------------------ | ||
− | /* Função para salvar o usuário no arquivo DADOS*/ | + | /* Função para salvar o usuário no arquivo DADOS*/ |
− | void salvar_lista() | + | void salvar_lista() { |
− | { | ||
− | + | FILE *p_arq; | |
− | + | int res; | |
− | + | struct TUsuario *p; | |
− | + | if ((p_arq = fopen("DADOS.txt", "w")) == NULL) {/* Cria um arquivo DADOS, se não houver nenhum*/ | |
− | + | printf("\nProblemas na abertura do arquivo\n"); | |
− | + | } | |
− | + | p = head; | |
− | + | while (p != NULL) {/* Escreve os dados do usuário no arquivo*/ | |
− | + | if ((res = fprintf(p_arq, "%s %s %s %s %s %d %d %d %d %d %d\n", | |
− | p->entrada.minuto,p->entrada.segundo,p->saida.hora,p->saida.minuto,p->saida.segundo))==EOF){ | + | p->userID, p->senha, p->nome_pai, p->nome_mae, p->cid_natal, |
− | + | p->entrada.hora, p->entrada.minuto, p->entrada.segundo, | |
− | + | p->saida.hora, p->saida.minuto, p->saida.segundo)) == EOF) { | |
− | + | printf("\nErro\n"); | |
− | + | } | |
− | + | p = p->next; | |
+ | } | ||
+ | fclose(p_arq); | ||
} | } | ||
Linha 481: | Linha 748: | ||
/* função para adicionar usuário no final da lista*/ | /* função para adicionar usuário no final da lista*/ | ||
− | void adicione_usuario_tail(struct TUsuario *p) | + | void adicione_usuario_tail(struct TUsuario *p) { |
− | { | ||
− | + | if (tail == NULL) {/* Teste para saber se a lista está vazia*/ | |
− | + | tail = head = p; | |
+ | } else {/* Quando a lista não está vazia, adiciona o usuário no final*/ | ||
+ | tail->next = p; | ||
+ | tail = p; | ||
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | + | salvar_lista(); | |
} | } | ||
Linha 500: | Linha 765: | ||
/* Função para definir um horário fixo, quando cria um usuário*/ | /* Função para definir um horário fixo, quando cria um usuário*/ | ||
− | + | ||
− | void definir_horario (struct TUsuario *p) | + | void definir_horario(struct TUsuario *p) { |
− | { | + | p->entrada.hora = 5; |
− | + | p->entrada.minuto = 30; | |
− | + | p->entrada.segundo = 0; | |
− | + | p->saida.hora = 23; | |
− | + | p->saida.minuto = 30; | |
− | + | p->saida.segundo = 0; | |
− | |||
} | } | ||
Linha 515: | Linha 779: | ||
/* Função para adicionar usuários e seus dados*/ | /* Função para adicionar usuários e seus dados*/ | ||
− | void adicionar_usuario() | + | void adicionar_usuario() { |
− | { | + | |
− | + | struct TUsuario *p; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if ((p = (struct TUsuario *) malloc(sizeof(struct TUsuario))) == NULL) { | |
− | + | if (blue == 0) { | |
+ | printf("Não é possível adicionar usuário ao sistema"); | ||
+ | } else { | ||
+ | Pblue("Não é possível adicionar usuário ao sistema"); | ||
+ | } | ||
− | + | return; | |
− | + | } | |
− | + | if (blue == 0) { | |
− | + | printf("Entre com userID\n"); | |
+ | scanf("%s", p->userID); | ||
+ | } else { | ||
+ | Pblue("Entre com userID"); | ||
+ | Blue(retorno); | ||
+ | strcpy(p->userID, retorno); | ||
+ | } | ||
− | + | if (blue == 0) { | |
− | + | printf("Entre com senha\n"); | |
+ | scanf("%s", p->senha); | ||
+ | } else { | ||
+ | Pblue("Entre com senha"); | ||
+ | Blue(retorno); | ||
+ | strcpy(p->senha, retorno); | ||
+ | } | ||
− | + | if (blue == 0) { | |
− | + | printf("Entre com o nome do pai\n"); | |
+ | scanf("%s", p->nome_pai); | ||
+ | } else { | ||
+ | Pblue("Entre com o nome do pai"); | ||
+ | Blue(retorno); | ||
+ | strcpy(p->nome_pai, retorno); | ||
+ | } | ||
+ | if (blue == 0) { | ||
+ | printf("Entre com o nome do mãe\n"); | ||
+ | scanf("%s", p->nome_mae); | ||
+ | } else { | ||
+ | Pblue("Entre com o nome do mãe"); | ||
+ | Blue(retorno); | ||
+ | strcpy(p->nome_mae, retorno); | ||
+ | } | ||
+ | if (blue == 0) { | ||
+ | printf("Entre com a cidade natal do usuário\n"); | ||
+ | scanf("%s", p->cid_natal); | ||
+ | } else { | ||
+ | Pblue("Entre com a sua cidade natal"); | ||
+ | Blue(retorno); | ||
+ | strcpy(p->cid_natal, retorno); | ||
+ | } | ||
− | + | definir_horario(p);/* esta dando erro na hora que pede para entrar com o userid*/ | |
− | + | p->next = NULL; | |
− | + | adicione_usuario_tail(p); | |
} | } | ||
Linha 552: | Linha 848: | ||
/* função que remove qualquer usuário */ | /* função que remove qualquer usuário */ | ||
− | void remover_usuario_lista(struct TUsuario *p) | + | void remover_usuario_lista(struct TUsuario *p) { |
− | { | + | |
− | + | struct TUsuario *p_aux; | |
− | + | ||
+ | if (p == head) { | ||
− | + | if (head == tail) {/*quando na lista ligada tem um unico usuário*/ | |
+ | free(p); | ||
+ | head = tail = NULL; | ||
− | + | } else { | |
− | + | head = head->next;/*Exclui o primeiro da lista*/ | |
− | + | free(p);/* libera a memória */ | |
+ | } | ||
+ | return; | ||
+ | } else { | ||
+ | p_aux = head;/*cria um auxiliar que igual ao inicio*/ | ||
− | + | while (p_aux->next != p) /*Enquanto o p_aux aponta para o próximo for diferente de p, executa o loop*/ | |
− | + | p_aux = p_aux->next; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if (p_aux == NULL) {/*Lista está vazia*/ | |
− | + | return; | |
− | + | } else { | |
− | |||
− | + | if (tail == p_aux->next)/*reconstroi a lista para remover o usuário*/ | |
− | + | tail = p_aux;/*Tanto exclui o do meio ou do fim*/ | |
− | + | p_aux->next = p->next; | |
− | + | free(p); | |
− | + | } | |
− | + | } | |
− | |||
− | |||
} | } | ||
Linha 591: | Linha 886: | ||
/* Função para escolher o usuário a ser removido */ | /* Função para escolher o usuário a ser removido */ | ||
− | void remover_usuario() | + | void remover_usuario() { |
− | + | ||
+ | char userID[TAM_VET]; | ||
+ | struct TUsuario *p; | ||
− | + | if (blue == 0) { | |
− | + | printf("Entre com userID do usuario a ser removido\n"); | |
− | + | scanf("%s", userID); | |
− | + | } else { | |
− | + | Pblue("Entre com userID do usuario a ser removido"); | |
− | + | Blue(retorno); | |
− | + | strcpy(userID, retorno); | |
+ | } | ||
− | + | p = encontrar_usuario_lista(userID); | |
− | |||
− | + | if (!p) { | |
− | + | if (blue == 0) | |
− | + | printf("Usuário não existente\n"); | |
− | + | else | |
− | + | Pblue("Usuário não existente"); | |
+ | } else { | ||
+ | remover_usuario_lista(p); | ||
+ | if (blue == 0) | ||
+ | printf("Usuário removido!\n"); | ||
+ | else | ||
+ | Pblue("Usuário removido!"); | ||
+ | salvar_lista(); | ||
+ | } | ||
} | } | ||
Linha 616: | Linha 921: | ||
/* Função para imprimir todos os usuários */ | /* Função para imprimir todos os usuários */ | ||
− | void listar_lista () | + | void listar_lista() { |
− | { | ||
− | + | struct TUsuario *p; | |
− | + | p = head; | |
− | + | if (head == NULL) { | |
− | + | if (blue == 0) | |
+ | printf("\nLista Vazia!\n"); | ||
+ | else | ||
+ | Pblue("Lista Vazia!"); | ||
+ | } else { | ||
+ | while (p) { /*enquanto não chega o fim da lista*/ | ||
+ | if (blue == 0) | ||
+ | printf("Usuários: %s\n", p->userID); | ||
+ | else | ||
+ | Pblue(p->userID); | ||
+ | p = p->next; | ||
+ | } | ||
+ | } | ||
+ | } | ||
− | + | struct TUsuario *novo_horario() { | |
− | + | struct TUsuario *p; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if (blue == 0) { | |
− | { | + | printf("\nESCOLHA O USUARIO\n"); |
− | + | scanf("%s", userID); | |
+ | } else { | ||
+ | Pblue("ESCOLHA O USUARIO"); | ||
+ | Blue(retorno); | ||
+ | strcpy(userID, retorno); | ||
+ | } | ||
+ | p = encontrar_usuario_lista(userID); | ||
− | + | if (!p) { | |
− | + | if (blue == 0) | |
− | + | printf("Usuário não existente\n"); | |
− | + | else | |
− | + | Pblue("ESCOLHA O USUARIO"); | |
− | + | } else { /* vai reescrever o horário na struct */ | |
− | + | printf("\nDigite a novo horario de entrada:\n"); | |
− | + | printf("\nHora:\n"); | |
− | + | scanf("%d", &p->entrada.hora); | |
− | |||
− | |||
− | + | printf("\nMinuto:\n"); | |
− | + | scanf("%d", &p->entrada.minuto); | |
− | + | printf("\nSegundo:\n"); | |
− | + | scanf("%d", &p->entrada.segundo); | |
− | + | printf("\nDigite a novo horario de saida:\n"); | |
− | + | printf("\nHora:\n"); | |
− | + | scanf("%d", &p->saida.hora); | |
− | + | printf("\nMinuto:\n"); | |
− | + | scanf("%d", &p->saida.minuto); | |
− | + | printf("\nSegundo:\n"); | |
− | + | scanf("%d", &p->saida.segundo); | |
− | + | salvar_lista(); | |
− | + | } | |
} | } | ||
//------------------------------------------------------------ | //------------------------------------------------------------ | ||
− | void | + | void administrar() { |
− | { | + | |
− | + | char senha_admin[TAM_VET]; | |
− | + | char userID[TAM_VET]; | |
− | + | int t; | |
− | + | ||
+ | struct TUsuario *p; | ||
+ | |||
+ | if (blue == 0) { | ||
+ | printf("\nBom dia Adiministrador! Entre com a senha\n"); | ||
+ | scanf("%s", senha_admin); | ||
+ | } else { | ||
+ | Pblue("Bom dia Adiministrador! Entre com a senha"); | ||
+ | Blue(retorno); | ||
+ | strcpy(senha_admin, retorno); | ||
+ | } | ||
− | + | if (strcmp(senha_admin, "123") == 0) { | |
+ | if (blue == 0) { | ||
+ | printf("\nOpção1:Desbloquear Usuario\n"); | ||
+ | printf("\nOpção2:Renomear a mensagem inicial do usuario\n"); | ||
+ | printf("\nOpção3:Adicionar usuário na lista\n"); | ||
+ | printf("\nOpçãoo4:Remover usuário da lista\n"); | ||
+ | printf("\nOpçãoo5:Listar usuários\n"); | ||
+ | printf("\nOpção6:Motificar horário de permissão de login\n"); | ||
+ | scanf("%d", &t); | ||
+ | } else { | ||
+ | Pblue( | ||
+ | "Opção1:Desbloquear Usuario \nOpção2:Renomear a mensagem inicial do usuario\nOpção3:Adicionar usuário na lista\nOpção4:Remover usuário da lista\nOpção5:Listar usuários\nOpção6:permissão"); | ||
+ | Blue(retorno); | ||
+ | t = atoi(retorno); | ||
+ | } | ||
− | + | if (t == 1) { | |
− | + | desbloquear_usuario_lista(); | |
− | + | } | |
− | |||
− | + | if (t == 2) { | |
− | + | nova_mensagem(); | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | + | if (t == 3) { | |
− | + | adicionar_usuario(); | |
− | + | } | |
− | + | if (t == 4) { | |
− | + | remover_usuario(); | |
− | + | } | |
− | + | if (t == 5) { | |
− | + | listar_lista(); | |
− | + | } | |
− | + | if (t == 6) { | |
− | + | novo_horario(); | |
− | + | } | |
− | + | } else { | |
− | + | if (blue == 0) | |
− | + | printf("\nsenha Invalida\n"); | |
+ | else | ||
+ | Pblue("senha Invalida"); | ||
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Edição atual tal como às 17h33min de 15 de dezembro de 2013
Exemplo do programa desenvolvido durante a disciplina de programação. Este programa esta dividido em 4 partes (main.c, main.h, admin.c, admin.h)
main.c
/***********************************************************************
Programa de controle de acesso
Disciplina de programação - Engenharia de telecomunicações
IFSC 2013
Professor:
Prof. Eraldo Silveira e Silva, Dr.
Autoras:
Ana Luiza Scharf
Karoline da Rocha
Incrementos:
André Felippe Weber
*************************************************************************/
#include <stdio.h>
#include <string.h>
#include "bibprg.h"
#include <stdlib.h>
#include <time.h>
#include "main.h"
#include "admin.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <errno.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/select.h>
struct TUsuario *head, *tail; /* ponteiros inicial e final*/
char userID[TAM_VET];
char *buf_bluetooth = "senha";
struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 };
char buf[1024] = { 0 };
int s, client, bytesRead, passo;
socklen_t opt = sizeof(rem_addr);
//-----------------------------------------------------------
char Blue(char *retorno) {
if ((client = accept(s, (struct sockaddr *) &rem_addr, &opt)) < 0) {
perror("accept: ");
exit(1);
}
memset(buf, 0, sizeof(buf));
// read data from the client
if ((bytesRead = read(client, buf, sizeof(buf))) == -1) {
perror("Erro read");
exit(1);
}
passo = client;
close(client);
strcpy(retorno, buf);
return;
}
//-----------------------------------------------------------
char Pblue(char *mensagem) {
if ((client = accept(s, (struct sockaddr *) &rem_addr, &opt)) < 0) {
perror("accept: ");
exit(1);
}
memset(buf, 0, sizeof(buf));
//envia uma resposta
strcpy(buf, mensagem);
write(client, buf, sizeof(buf));
sleep(1);
// close connection
close(client);
return;
}
//-----------------------------------------------------------
void mostrar_menu_entrada_usuario() {
printf("\nEntre com o seu USERID para ter acesso\n");
}
//------------------------------------------------------------
/* Função para encontrar usuários na lista ligada*/
struct TUsuario *encontrar_usuario_lista(char *userID) {
struct TUsuario *p;
p = head;
while (p) { /* loop para encontrar usuário*/
if (strcmp(userID, p->userID) == 0)
return p;
p = p->next;
}
return NULL;
}
//-----------------------------------------------
/* Função para armazenar os dados de entrada do usuários*/
int login(struct TUsuario *p)
{
time_t ltime;
FILE *fp;
time(<ime);
if ((fp = fopen("DATA.txt", "a")) == NULL) {/*Abre um arquivo com dados de login*/
printf("Problemas na abertura do arquivo\n");
return;
}
if (fprintf(fp, "%s %s\n", ctime(<ime), p->userID)) {/*escreve a cadeia de caracteres e o usuário no arquivo DATA*/
printf("%s", ctime(<ime));
fclose(fp);
} else {
printf("Erro na escrita do arquivo!\n");
}
}
//-----------------------------------------------
int permissao(struct TUsuario *p) {
time_t rawtime;
struct tm *tminfo;
time(&rawtime);
tminfo = localtime(&rawtime);
if (blue == 0)
printf("porta aberta: hora: %d minuto: %d segundo: %d \n",
tminfo->tm_hour, tminfo->tm_min, tminfo->tm_sec);
if (p->entrada.hora < tminfo->tm_hour) {/*testa se a hora real é maior que o tempo definido na entrada*/
} else {
if (p->entrada.hora == tminfo->tm_hour) {/* Caso a hora real for igual ao tempo de entrada, assim testa minutos e segundos*/
if (p->entrada.minuto < tminfo->tm_min) {
if (p->entrada.segundo < tminfo->tm_sec) {
} else {
return 2;/* Caso alguma dessas comparações sejam falsas retorna 2*/
}
} else {
return 2;
}
} else {
return 2;
}
}
if (p->saida.hora > tminfo->tm_hour) {/* Quando a hora real esta no limite de entrada e saída ja sai dos if's e retorna 1*/
return 1;
} else {
if (p->saida.hora == tminfo->tm_hour) {/*Caso a hora real for igual ao tempo de saída, assim testa minutos e segundos*/
if (p->saida.minuto > tminfo->tm_min) {
if (p->saida.segundo < tminfo->tm_sec) {
} else {
return 2;
}
} else {
return 2;
}
} else {
return 2;
}
}
printf("deixa passar\n");/* Se todas as comparações forem verdadeiras retorna 1*/
return 1;
}
//-----------------------------------------------
/* Função para sorteia uma pergunta para confirmar o usuário*/
char *pergunta;
int perguntas(struct TUsuario *p) {
int iSecret, iGuess;
char resp[TAM_VET], retorno[256];
srand (time(NULL) );/* inicia o randômico*/
iSecret = rand() % 3 + 1; /*sorteia o número*/
if (iSecret == 1) {
if (blue == 0) {
printf("Digite o primeiro nome do seu pai\n");
scanf("%s", resp);
} else {
Pblue("Digite o primeiro nome do seu pai");
Blue(retorno);
strcpy(resp, retorno);
}
if (strcmp(resp, p->nome_pai) == 0) {
return 1;
} else {
return 0;
}
}
if (iSecret == 2) {
if (blue == 0) {
printf("Digite o nome da sua cidade natal\n");
scanf("%s", resp);
} else {
Pblue("Digite o nome da sua cidade natal");
Blue(retorno);
strcpy(resp, retorno);
}
if (strcmp(resp, p->cid_natal) == 0) {
return 1;
} else {
return 0;
}
}
if (iSecret == 3) {
if (blue == 0) {
printf("Digite o primeiro nome da sua mãe\n");
scanf("%s", resp);
} else {
Pblue("Digite o primeiro nome da sua mãe");
Blue(retorno);
strcpy(resp, retorno);
}
if (strcmp(resp, p->nome_mae) == 0) {
return 1;
} else {
return 0;
}
}
}
//-----------------------------------------------
void tratar_usuario() {
char senha[TAM_VET], retorno[256];
struct TUsuario *p;
int ret;
int r;
p = encontrar_usuario_lista(userID); /* Procura o usuário na lista */
if (!p) { /* Se o usuário existir*/
printf("\nUsuário inválido\n"); /* quando o usuário não está na lista*/
} else {
r = 1; //permissao(p);
if (r == 1) {
// if(p -> contador < 3){ /* analisa o número de tentativas*/
if (blue == 0) {
printf("\n%s %s!Entre com a senha\n", p->mensagem, p->userID);
scanf("%s", senha);
} else {
Pblue("senha");
Blue(retorno);
strcpy(senha, retorno);
}
//printf("%s", pergunta);
if (strcmp(senha, p->senha) == 0) {
ret = perguntas(p);
if (ret == 1) {
if (blue == 0)
printf("\nPorta aberta\n");
else
Pblue("Porta aberta");
enviar_analogica('1', "150");
sleep(2);
enviar_analogica('1', "000");
p->contador = 0; /* zera o contador*/
login(p);
} else {
p->contador++; /* Caso erre a pergunta acrescenta o contador*/
if (blue == 0)
printf("\nDados invalidos\n");
else
Pblue("Dados Invalidos");
}
} else {
p->contador++; /* Caso erre a senha acrescenta um contador*/
if (blue == 0)
printf("\nSenha Invalida\n");
else
Pblue("Senha invalida");
}
} else {
if (blue == 0)
printf("\nFora do Horario\n");
else
Pblue("Fora do Horario");
}
}
}
//------------------------------------------------------------
void ler_lista() {
struct TUsuario *p;
FILE *p_arq;
int res;
if ((p_arq = fopen("DADOS.txt", "r")) == NULL) {/*Abre um arquivo para ler os dados dos usuários*/
head = tail = NULL;
return;
}
head = p = (struct TUsuario *) malloc(sizeof(struct TUsuario));/*Aloca a memória*/
p->next = NULL;
for (;;) {
if ((res = fscanf(p_arq, "%s %s %s %s %s %s %d %d %d %d %d %d \n",
p->userID, p->senha, p->nome_pai, p->nome_mae, p->cid_natal,
p->mensagem, &p->entrada.hora, &p->entrada.minuto,
&p->entrada.segundo, &p->saida.hora, &p->saida.minuto,
&p->saida.segundo)) == EOF) {
if (p == head) {/*Lista de usuários vazia*/
head = NULL;
tail = NULL;
} else
tail->next = NULL;/*Finaliza a lista*/
free(p);/*Libera a memória*/
break;
}
tail = p;
p = p->next = (struct TUsuario *) malloc(sizeof(struct TUsuario));/*Aloca a memória para novos usuários*/
}
fclose(p_arq);
}
//-----------------------------------------------------------
int botao() {
float n;
int i = 0;
n = receber_analogica('1');
while (i == 0) {
n = receber_analogica('1');
if (n > 0.20 && n != 0) {
if (n <= 0.26) {
return 9;
}
if (n > 0.26 && n < 0.30) {
return 8;
}
if (n >= 0.30 && n <= 0.35) {
return 7;
}
if (n >= 0.36 && n <= 0.40) {
return 6;
}
if (n >= 0.43 && n < 0.50) {
return 5;
}
if (n > 0.53 && n <= 0.58) {
return 4;
}
if (n > 0.70 && n <= 0.80) {
return 3;
}
if (n > 1.0 && n <= 1.1) {
return 2;
}
if (n > 1.8 && n <= 2.0) {
return 1;
}
if (n > 3.0 && n <= 3.3) {
return 0;
}
if (n > 4.0 && n <= 5.0) {
return 10; //enter
}
i = 1;
n = 0;
usleep(5000);
}
return 20;
}
return 20;
}
int main(int argc, char **argv) {
int fd;
int fdmax;
int i, j, lag = 0;
size_t bytes_read;
fd_set master_set, myset;
char buffer[256];
char buf[50]; //variavel do teclado
int bot, x = 0, y = 0, z = 0; //variaveis do teclado
int W = 6;
int segundos;
FD_ZERO(&master_set);
for (i = 1; i < argc; i++) {
if ((fd = open(argv[i], O_RDWR)) == -1) {
perror("open");
exit(1);
}
FD_SET(fd, &master_set);
}
// allocate socket http://www.br-c.org/doku.php?id=socket
if ((s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) == -1) {
printf("Problemas na criação do socket\n");
exit(-1);
}
FD_SET(s, &master_set);
fd++;
/* registra o maior descritor */
fdmax = fd;
// bind socket to port 1 of the first available
// local bluetooth adapter
//http://www.br-c.org/doku.php?id=bind
loc_addr.rc_family = AF_BLUETOOTH;
loc_addr.rc_bdaddr = *BDADDR_ANY;
//str2ba( endereco, &loc_addr.rc_bdaddr );
loc_addr.rc_channel = (uint8_t) 3;
if (bind(s, (struct sockaddr *) &loc_addr, sizeof(loc_addr)) == -1) {
printf("Problemas no bind\n");
exit(-1);
}
//listen http://www.br-c.org/doku.php?id=listen
printf("Preparando para listen..\n");
// put socket into listening mode
if (listen(s, 1) < 0)
printf("Problemas de listen...\n");
conectar();
ler_lista();
listar_lista();
struct timeval timeout;
segundos = 0;
timeout.tv_sec = segundos;
timeout.tv_usec = 500000;
for (;;) {
if (x == 0) {
mostrar_menu_entrada_usuario();
x = 1;
}
myset = master_set; /* deve ser copiado sempre pois o conjunto é alterado */
if ((W = select(fdmax + 1, &myset, NULL, NULL, &timeout)) == -1) {
perror("select");
exit(1);
}
if (W == 0) {
enviar_digital('1', '1');
bot = botao();
if (bot == 10) {
printf("enter");
while (z < y) {
printf("\n %d \n", buf[z]);
z++;
x = 0;
}
z = 0;
}
if (bot >= 0 && bot <= 9) {
buf[y] = bot;
y++;
}
}
if (FD_ISSET(3, &myset)) {
blue = 0;
if ((bytesRead = read(0, buffer, sizeof(buffer))) == -1) {
perror("Erro read");
exit(1);
}
if (bytesRead > 0) {
sscanf(buffer, "%s", userID);
if (strcmp(userID, "admin") == 0) {
administrar();
} else
tratar_usuario();
}
x = 0;
}
if (FD_ISSET(4, &myset)) {
blue = 1;
if ((client = accept(s, (struct sockaddr *) &rem_addr, &opt)) < 0) {
perror("accept: ");
exit(1);
}
memset(buf, 0, sizeof(buf));
// read data from the client
if ((bytesRead = read(client, buf, sizeof(buf))) == -1) {
perror("Erro read");
exit(1);
}
close(client);
if (bytesRead > 0) {
sscanf(buf, "%s", userID);
if (strcmp(userID, "admin") == 0) {
administrar();
} else
tratar_usuario();
}
x = 0;
}
}
}
main.h
#ifndef ADMIN_H
#define ADMIN_H
#define TAM_VET 20
#define TAM_MEN 100
struct TTempo{
int hora,minuto,segundo;
};
struct TUsuario /* struct TUsuario é o local onde contém todas as informações do usuário */
{
char userID[TAM_VET];
char senha[TAM_VET];
char cid_natal[TAM_VET];
char nome_pai[TAM_VET];
char nome_mae[TAM_VET];
int contador;
char mensagem[TAM_MEN];
struct TTempo entrada;
struct TTempo saida;
struct TUsuario *next;
};
extern char userID [];
extern struct TUsuario *next, *head, *tail; /* ponteiros próximo, inicial e final*/
//------------------------------------------------------------
void mostrar_menu_entrada_usuario();
//------------------------------------------------------------
/* Função para encontrar usuários na lista ligada*/
struct TUsuario *encontrar_usuario_lista(char *userID);
//------------------------------------------------------------
/* Função para armazenar os dados de entrada do usuários*/
int login(struct TUsuario *p);
//------------------------------------------------------------
/* Função para sorteia uma pergunta para confirmar o usuário*/
int perguntas(struct TUsuario *p);
//------------------------------------------------------------
void tratar_usuario();
//------------------------------------------------------------
void ler_lista( );
//-----------------------------------------------------------
#endif
admin.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "main.h"
#include "admin.h"
char retorno[256];
//------------------------------------------------------------
/* Função que permite subescrever a mensagem do usuário, quando o programa pedir sua senha*/
struct TUsuario *nova_mensagem() {
struct TUsuario *p;
if (blue == 0) {
printf("\nESCOLHA O USUARIO\n");
scanf("%s", userID);
} else {
Pblue("ESCOLHA O USUARIO");
Blue(retorno);
strcpy(userID, retorno);
}
p = encontrar_usuario_lista(userID);
if (!p) {
if (blue == 0) {
printf("Usuário não existente\n");
} else {
Pblue("Usuário não existente");
}
} else {
if (blue == 0) {
printf("\nDigite a nova mensagem Inicial\n");
scanf("%s", p->mensagem); /* vai escrever uma mensagem na struct mensagem*/
} else {
Pblue("Digite a nova mensagem Inicial");
Blue(retorno);
strcpy(p->mensagem, retorno);
}
}
}
//------------------------------------------------------------
/* Função para encontrar desbloquear usuário na lista ligada*/
struct TUsuario *desbloquear_usuario_lista() {
struct TUsuario *p;
if (blue == 0) {
printf("\nESCOLHA O USUARIO\n");
scanf("%s", userID);
} else {
Pblue("ESCOLHA O USUARIO");
Blue(retorno);
strcpy(userID, retorno);
}
p = encontrar_usuario_lista(userID);
if (!p) {
if (blue == 0) {
printf("Usuário não existente\n");
} else {
Pblue("Usuário não existente");
}
} else {
p->contador = 0; /* zerar o contador do usuário escolhido*/
if (blue == 0) {
printf("\nUSUARIO DESBLOQUEADO\n");
} else {
Pblue("USUARIO DESBLOQUEADO");
}
}
}
//------------------------------------------------------------
/* Função para salvar o usuário no arquivo DADOS*/
void salvar_lista() {
FILE *p_arq;
int res;
struct TUsuario *p;
if ((p_arq = fopen("DADOS.txt", "w")) == NULL) {/* Cria um arquivo DADOS, se não houver nenhum*/
printf("\nProblemas na abertura do arquivo\n");
}
p = head;
while (p != NULL) {/* Escreve os dados do usuário no arquivo*/
if ((res = fprintf(p_arq, "%s %s %s %s %s %d %d %d %d %d %d\n",
p->userID, p->senha, p->nome_pai, p->nome_mae, p->cid_natal,
p->entrada.hora, p->entrada.minuto, p->entrada.segundo,
p->saida.hora, p->saida.minuto, p->saida.segundo)) == EOF) {
printf("\nErro\n");
}
p = p->next;
}
fclose(p_arq);
}
//------------------------------------------------------------
/* função para adicionar usuário no final da lista*/
void adicione_usuario_tail(struct TUsuario *p) {
if (tail == NULL) {/* Teste para saber se a lista está vazia*/
tail = head = p;
} else {/* Quando a lista não está vazia, adiciona o usuário no final*/
tail->next = p;
tail = p;
}
salvar_lista();
}
//------------------------------------------------------------
/* Função para definir um horário fixo, quando cria um usuário*/
void definir_horario(struct TUsuario *p) {
p->entrada.hora = 5;
p->entrada.minuto = 30;
p->entrada.segundo = 0;
p->saida.hora = 23;
p->saida.minuto = 30;
p->saida.segundo = 0;
}
//------------------------------------------------------------
/* Função para adicionar usuários e seus dados*/
void adicionar_usuario() {
struct TUsuario *p;
if ((p = (struct TUsuario *) malloc(sizeof(struct TUsuario))) == NULL) {
if (blue == 0) {
printf("Não é possível adicionar usuário ao sistema");
} else {
Pblue("Não é possível adicionar usuário ao sistema");
}
return;
}
if (blue == 0) {
printf("Entre com userID\n");
scanf("%s", p->userID);
} else {
Pblue("Entre com userID");
Blue(retorno);
strcpy(p->userID, retorno);
}
if (blue == 0) {
printf("Entre com senha\n");
scanf("%s", p->senha);
} else {
Pblue("Entre com senha");
Blue(retorno);
strcpy(p->senha, retorno);
}
if (blue == 0) {
printf("Entre com o nome do pai\n");
scanf("%s", p->nome_pai);
} else {
Pblue("Entre com o nome do pai");
Blue(retorno);
strcpy(p->nome_pai, retorno);
}
if (blue == 0) {
printf("Entre com o nome do mãe\n");
scanf("%s", p->nome_mae);
} else {
Pblue("Entre com o nome do mãe");
Blue(retorno);
strcpy(p->nome_mae, retorno);
}
if (blue == 0) {
printf("Entre com a cidade natal do usuário\n");
scanf("%s", p->cid_natal);
} else {
Pblue("Entre com a sua cidade natal");
Blue(retorno);
strcpy(p->cid_natal, retorno);
}
definir_horario(p);/* esta dando erro na hora que pede para entrar com o userid*/
p->next = NULL;
adicione_usuario_tail(p);
}
//------------------------------------------------------------
/* função que remove qualquer usuário */
void remover_usuario_lista(struct TUsuario *p) {
struct TUsuario *p_aux;
if (p == head) {
if (head == tail) {/*quando na lista ligada tem um unico usuário*/
free(p);
head = tail = NULL;
} else {
head = head->next;/*Exclui o primeiro da lista*/
free(p);/* libera a memória */
}
return;
} else {
p_aux = head;/*cria um auxiliar que igual ao inicio*/
while (p_aux->next != p) /*Enquanto o p_aux aponta para o próximo for diferente de p, executa o loop*/
p_aux = p_aux->next;
if (p_aux == NULL) {/*Lista está vazia*/
return;
} else {
if (tail == p_aux->next)/*reconstroi a lista para remover o usuário*/
tail = p_aux;/*Tanto exclui o do meio ou do fim*/
p_aux->next = p->next;
free(p);
}
}
}
//------------------------------------------------------------
/* Função para escolher o usuário a ser removido */
void remover_usuario() {
char userID[TAM_VET];
struct TUsuario *p;
if (blue == 0) {
printf("Entre com userID do usuario a ser removido\n");
scanf("%s", userID);
} else {
Pblue("Entre com userID do usuario a ser removido");
Blue(retorno);
strcpy(userID, retorno);
}
p = encontrar_usuario_lista(userID);
if (!p) {
if (blue == 0)
printf("Usuário não existente\n");
else
Pblue("Usuário não existente");
} else {
remover_usuario_lista(p);
if (blue == 0)
printf("Usuário removido!\n");
else
Pblue("Usuário removido!");
salvar_lista();
}
}
//------------------------------------------------------------
/* Função para imprimir todos os usuários */
void listar_lista() {
struct TUsuario *p;
p = head;
if (head == NULL) {
if (blue == 0)
printf("\nLista Vazia!\n");
else
Pblue("Lista Vazia!");
} else {
while (p) { /*enquanto não chega o fim da lista*/
if (blue == 0)
printf("Usuários: %s\n", p->userID);
else
Pblue(p->userID);
p = p->next;
}
}
}
struct TUsuario *novo_horario() {
struct TUsuario *p;
if (blue == 0) {
printf("\nESCOLHA O USUARIO\n");
scanf("%s", userID);
} else {
Pblue("ESCOLHA O USUARIO");
Blue(retorno);
strcpy(userID, retorno);
}
p = encontrar_usuario_lista(userID);
if (!p) {
if (blue == 0)
printf("Usuário não existente\n");
else
Pblue("ESCOLHA O USUARIO");
} else { /* vai reescrever o horário na struct */
printf("\nDigite a novo horario de entrada:\n");
printf("\nHora:\n");
scanf("%d", &p->entrada.hora);
printf("\nMinuto:\n");
scanf("%d", &p->entrada.minuto);
printf("\nSegundo:\n");
scanf("%d", &p->entrada.segundo);
printf("\nDigite a novo horario de saida:\n");
printf("\nHora:\n");
scanf("%d", &p->saida.hora);
printf("\nMinuto:\n");
scanf("%d", &p->saida.minuto);
printf("\nSegundo:\n");
scanf("%d", &p->saida.segundo);
salvar_lista();
}
}
//------------------------------------------------------------
void administrar() {
char senha_admin[TAM_VET];
char userID[TAM_VET];
int t;
struct TUsuario *p;
if (blue == 0) {
printf("\nBom dia Adiministrador! Entre com a senha\n");
scanf("%s", senha_admin);
} else {
Pblue("Bom dia Adiministrador! Entre com a senha");
Blue(retorno);
strcpy(senha_admin, retorno);
}
if (strcmp(senha_admin, "123") == 0) {
if (blue == 0) {
printf("\nOpção1:Desbloquear Usuario\n");
printf("\nOpção2:Renomear a mensagem inicial do usuario\n");
printf("\nOpção3:Adicionar usuário na lista\n");
printf("\nOpçãoo4:Remover usuário da lista\n");
printf("\nOpçãoo5:Listar usuários\n");
printf("\nOpção6:Motificar horário de permissão de login\n");
scanf("%d", &t);
} else {
Pblue(
"Opção1:Desbloquear Usuario \nOpção2:Renomear a mensagem inicial do usuario\nOpção3:Adicionar usuário na lista\nOpção4:Remover usuário da lista\nOpção5:Listar usuários\nOpção6:permissão");
Blue(retorno);
t = atoi(retorno);
}
if (t == 1) {
desbloquear_usuario_lista();
}
if (t == 2) {
nova_mensagem();
}
if (t == 3) {
adicionar_usuario();
}
if (t == 4) {
remover_usuario();
}
if (t == 5) {
listar_lista();
}
if (t == 6) {
novo_horario();
}
} else {
if (blue == 0)
printf("\nsenha Invalida\n");
else
Pblue("senha Invalida");
}
}
admin.h
#ifndef MAIN_H
#define MAIN_H
#define TAM_MEN 100
#include "main.h"
/* Função que permite subescrever a mensagem do usuário, quando o programa pedir sua senha*/
struct TUsuario *nova_mensagem ();
//------------------------------------------------------------
/* Função para encontrar desbloquear usuário na lista ligada*/
struct TUsuario *desbloquear_usuario_lista( );
//------------------------------------------------------------
void salvar_lista();
//------------------------------------------------------------
/* Função para adicionar usuário no final da lista*/
void adicione_usuario_tail(struct TUsuario *p);
//------------------------------------------------------------
/* Função para definir horário padrão*/
void definir_horario (struct TUsuario *p);
//------------------------------------------------------------
/* Função para adicionar usuários e seus dados*/
void adicionar_usuario();
//------------------------------------------------------------
/* Função que remove qualquer usuário */
void remover_usuario_lista(struct TUsuario *p);
//------------------------------------------------------------
/* Função para escolher o usuário a ser removido */
void remover_usuario();
//------------------------------------------------------------
/* Função para imprimir todos os usuários */
void listar_lista ();
//------------------------------------------------------------
struct TUsuario *novo_horario();
//------------------------------------------------------------
void administrar();
#endif
Para facilitar a compilação, existe um arquivo make pronto:
#arquivo Makefile
karol_ana: main.o admin.o
gcc main.o admin.o -lprg -lusb-1.0 -o karol_ana
main.o: main.c main.h admin.h
gcc -c -lprg -lusb-1.0 main.c
admin.o: admin.c admin.h main.h
gcc -c -lprg -lusb-1.0 admin.c
clean: admin.o main.o
rm main.o
rm admin.o
rm DADOS.txt
install:
./karol_ana