You are on page 1of 5

#include

#include
#include
#include
#include
#include
#include
#include

<stdio.h>
<stdlib.h>
<unistd.h>
<sys/socket.h>
<netdb.h>
<string.h>
<arpa/inet.h>
<signal.h>

#include "cJSON.h"
#define BUFFERSIZE 1200
#define ADDRSIZE 40
int continua;
void tratamensagem(char *mensagem);
int salvarLog(char *mensagem, char *filename);
void signal_handle(int signum);
int main(int argc, const char * argv[])
{
//
declarao da estrutura de dados
int
sd;
int
status;
struct sockaddr_in serveraddr;
unsigned short
serverport;
char
hostnamep[ADDRSIZE];
char
rx[BUFFERSIZE];
char
*tx;
//
//

//

flag para finalizar programa


continua = 1;
uso do sinal sigterm, para finalizar programa corretamente
signal(SIGTERM, signal_handle);
if(argc == 3)
{
strncpy(hostnamep, argv[1], ADDRSIZE -1);
serverport = (unsigned short) atoi(argv[2]);
}
else
{
assumir localhost:2947 (default do gpsd)
strncpy(hostnamep, "127.0.0.1", ADDRSIZE -1);
serverport = 2947;
}

printf("Gps Log V0.1 (Depende de gpsd)\nConectando...\nHost: %s\nPorta:


\
%d\n\n", hostnamep, serverport);
//
printf("Entre com a mensagem: ");
//
getchar();
//
fgets(txbuffer, BUFFERSIZE, stdin);
tx = "?WATCH={\"enable\":true,\"json\":true}";
//
tx = "?WATCH={\"enable\":true,\"json\":true}\n";
//
scanf("%s", txbuffer);
//

chamada socket para tcp

sd = socket(PF_INET, SOCK_STREAM, 6);


//

definio de endereo de destino


serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(serverport);

//

chamada de converso de dados


status = inet_pton(AF_INET, hostnamep, &serveraddr.sin_addr);

//

verificao de erro de converso de dados


if (status <= 0)
{
perror("Erro na converso do endereo IP");
exit(1);
}

//

chamada connect
status = connect(sd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))

;
//

teste de conexo
if (status != 0)
{
perror("Erro na chamada connect");
exit(1);
}

//
//

enviar comando para iniciar gpsd


chamada write()
status = write(sd, tx, strlen(tx)+1);

//

teste de envio
if (status == -1)
{
perror("Erro na chamada write");
close(sd);
exit(1);
}

//

while (continua == 1)
{
limpar rx
memset(rx, 0, sizeof(rx));

//

chamda read()
status = read(sd, rx, sizeof(rx)-1);
printf("Info: %d bytes recebidos.\n", status);

//

teste de recebimento
if (status <= 0)
{
if (status <= -1)
{
perror("Erro na chamada read");
close(sd);
exit(1);
}
else
{
continua = 0;

}
}
else
{
if (status >= sizeof(rx))
{
printf("Erro: Dados recebidos excederam o tamanh
o do buffer.\n");
printf("Sugesto: Aumentar buffer!\n");
continua = 0;
}
else
{
tratamensagem(rx);
}
}
}
//
//

enviar comando de parada


tx = "?WATCH={\"enable\":false}";
chamada write()
status = write(sd, tx, strlen(tx)+1);

//

teste de envio
if (status == -1)
{
perror("Erro na chamada write");
close(sd);
exit(1);
}

//

chamada close
status = close(sd);

//

verificao da chamada close


if (status == -1)
{
perror("Erro na chamada close");
}
return 0;

}
void tratamensagem(char *mensagem)
{
cJSON *root, *aux;
char *textaux, tpvFilename[] = "tpv0.log";
int number;
root = cJSON_Parse(mensagem);
if (!root) {printf("Error before: [%s]\n",cJSON_GetErrorPtr()); exit(1);
}
textaux = cJSON_GetObjectItem(root,"class")->valuestring;
if (strcmp(textaux, "VERSION") == 0)
{
if (!salvarLog(mensagem, "version.log"))
{

exit(1);
}
}
else if (strcmp(textaux, "DEVICES") == 0)
{
if (!salvarLog(mensagem, "devices.log"))
{
exit(1);
}
}
else if (strcmp(textaux, "DEVICE") == 0)
{
if (!salvarLog(mensagem, "devices.log"))
{
exit(1);
}
}
else if (strcmp(textaux, "TPV") == 0)
{
number = cJSON_GetObjectItem(root,"mode")->valueint;
tpvFilename[3] += (char)number;
if (!salvarLog(mensagem, tpvFilename))
{
exit(1);
}
}
else if (strcmp(textaux, "WATCH") == 0)
{
if (!salvarLog(mensagem, "watch.log"))
{
exit(1);
}
}
else if (strcmp(textaux, "SKY") == 0)
{
if (!salvarLog(mensagem, "sky.log"))
{
exit(1);
}
}
else
{
if (!salvarLog(mensagem, "desconhecido.log"))
{
exit(1);
}
}
cJSON_Delete(root);
}
int salvarLog(char *mensagem, char *filename)
{
FILE *file;
char mode[] = "a";
file = fopen(filename, mode);
if (file == NULL)
{
perror("Erro abrindo arquivo");
return 0;

}
fwrite(mensagem, sizeof(char), strlen(mensagem), file);
fwrite("\n", sizeof(char), strlen("\n"), file);
fclose(file);
return 1;
}
void signal_handle(int signum)
{
printf("Pegou sinal %d\nFinalizando...", signum);
continua = 0;
}

You might also like