Client of WebSocket protocol
Fork of WebSocketClient by
WebsocketCaptureMonitor.cpp
- Committer:
- mauricioaschmitz
- Date:
- 2017-02-24
- Revision:
- 8:c9da00db9d33
File content as of revision 8:c9da00db9d33:
#include "WebsocketCaptureMonitor.h" #include "Pmed_reset.h" #include "Log.h" //#include "Settings.h" void WebsocketCaptureMonitor::WebsocketCaptureMonitor_Thread(void const *arg) { //Log::writeEntry("WebSocket Capture Thread Start"); char mensagem[600]; CaptureMailbox& mbox = EventDetector::GetMailbox(); osEvent evt; while(true){ evt = mbox.get(); if(evt.status == osEventMail) { //printf("Entrou monitor de captura!!!!\n\n"); CaptureEvent* cap = (CaptureEvent*)evt.value.p; //printf("Request=[%s]\n",mensagem); //Websocket::ReceiveMessage(mensagem); //memset(mensagem, 0, 600); //printf("Saiu do monitor de captura!!!!\n\n"); //testar porque não funciona, ideia era se o websocket não estiver conectado, abrir um socket e enviar por post direto PrepareMessage(cap, mensagem, true); Websocket::ReceiveMessage(mensagem); //if(Websocket::wsIsConnected()){ //PrepareMessage(cap, mensagem, true); //Websocket::ReceiveMessage(mensagem); /* printf("WebSocket conectado para o envio de dados!!!\n"); strcpy(tmp, mensagem); strcpy(mensagem, "#*InsertCaptureDB*#"); strcat(mensagem, tmp); //memset(tmp,0,600); //alguma forma de tentar conectar o websocket */ //} //else //{ //TCPSocketConnection sock; //DoPost(sock,Settings::get_networkServer(),cap); //} mbox.free(cap); } } } void WebsocketCaptureMonitor::PrepareMessage(CaptureEvent* dados, char *strfinal, bool isWS){ char str[400]; char aux[_PRTGMD_SETTINGS_DEFAULT_MAX_HARMONICS_]; int i; const char *header1 = "POST /Ptgm-Scripts/capture.php HTTP/1.1\r\n"; //"Host: 192.168.1.26\r\n" //"Content-Length: " const char *header2 = "\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "\r\n"; //str = (char *) malloc(450); //strfinal = (char *) malloc(450); memset(str,0,400); memset(strfinal,0,500); if(isWS){ strcat(strfinal, "#*InsertCaptureDB*#"); } strcat(strfinal, header1); strcat(strfinal, "Host: "); strcat(strfinal, Settings::get_networkServer() ); strcat(strfinal, "\r\n"); sprintf(aux,"TYPE=0%d",dados->get_Type()); strcat(str, aux); sprintf(aux,"&OUTLET=%02d",dados->get_OutletNumber()); strcat(str, aux); sprintf(aux,"&RFID=%s", dados->get_RFID()); strcat(str,aux); sprintf(aux,"&OFFSET=%04d",dados->get_Offset()); strcat(str,aux); float f = dados->get_Gain(); sprintf(aux,"&GAIN=%08X", *(unsigned int*)&f); strcat(str,aux); f = dados->get_RMSValue(); sprintf(aux,"&RMS=%08X",*(unsigned int*)&f); strcat(str,aux); f = dados->get_MeanValue(); sprintf(aux,"&MV=%08X",*(unsigned int*)&f); strcat(str,aux); /* Adicionados para alteracao */ //printf("MV %f MV2 %f\n", dados->get_MeanValue(), dados->get_MV2()); f = dados->get_MV2(); sprintf(aux,"&MV2=%08X",*(unsigned int*)&f); strcat(str,aux); sprintf(aux,"&UNDER=%04d",dados->get_Under()); strcat(str,aux); sprintf(aux,"&OVER=%04d",dados->get_Over()); strcat(str,aux); sprintf(aux,"&DURATION=%04d",dados->get_Duration()); strcat(str,aux); /* Ate Aqui */ strcat(str,"&SIN="); for(i=0;i<Settings::get_maxHarmonics();i++) { char s[10]; //According to RFC1738,RFC3986 the semicolon is a reserved character and must be encoded f = dados->get_SineValue(i); sprintf(s,"%08X",*(unsigned int*)&f); strcat(str,s); if (i < (Settings::get_maxHarmonics() - 1)) strcat(str, "%3B"); } strcat(str,"&COS="); for(i=0;i<Settings::get_maxHarmonics();i++) { char c[10]; //According to RFC1738,RFC3986 the semicolon is a reserved character and must be encoded f = dados->get_CossineValue(i); sprintf(c,"%08X",*(unsigned int*)&f); strcat(str,c); if (i < (Settings::get_maxHarmonics()-1)) strcat(str, "%3B"); } strcat(str,"\r\n"); char len[5]; sprintf(len,"%d",strlen(str)); strcat(strfinal, "Content-Length: "); strcat(strfinal, len); strcat(strfinal, header2); strcat(strfinal, str); strcat(strfinal, "\r\n"); //printf("Request=[%s]\n",strfinal); //printf("Tamanho STR %d\n", strlen(str)); //printf("Tamanho STRFINAL %d\n", strlen(strfinal)); } void WebsocketCaptureMonitor::DoPost(TCPSocketConnection sock, char *host, CaptureEvent* dados){ char http_cmd[400]; int escritos, r=-1, i; //FILE *f; //Timer t; //t.start(); //printf("HTTP Socket %s:%d\n", host, sock.get_port()); //printf("Antes Connect\n"); //rs= sock.connect(host, 80); //printf("%d\n", rs); //printf("Depois Connect "); //t.stop(); //printf("HHTP: The time taken in connection was %d useconds\n", t.read_us()); //http_cmd = (char *) malloc(500); memset(http_cmd, 0, 600); PrepareMessage( dados,http_cmd, false ); //printf("Fuga\n"); //printf("Tamanho do comando %d\n", strlen(http_cmd)); //printf("Comando: /* %s */\n", http_cmd); //http_cmd = prepare_POST( dados ); //printf("Tamanho comando %d\n", strlen(http_cmd)); //printf("Request \n [%s]\n", http_cmd); for(i=0; i < _PRTGMD_SETTINGS_DEFAULT_TRIES_ ; i++){ r = sock.connect(host, 80); if (r < 0) { printf("Error: Unable to connect to (%s) on port (%d) Try %d\n", host, 80, i); Thread::wait(Settings::get_delayTry()); } else break; } if (r == 0){ for(i=0; i < _PRTGMD_SETTINGS_DEFAULT_TRIES_ ; i++){ escritos = sock.send_all(http_cmd, strlen(http_cmd)); if(escritos != strlen(http_cmd)){ printf("Erro ao gravar no socket HTTP!! Escritos %d\t Tam %d Try %d\n", escritos, strlen(http_cmd), i); Thread::wait(Settings::get_delayTry()); } else break; } if ( i != _PRTGMD_SETTINGS_DEFAULT_TRIES_ ) Thread::wait(Settings::get_delaySend()); else{ //printf("Reset\n"); /*f = fopen(FILENAMERESET, "a"); if (f == NULL) f = fopen(FILENAMERESET, "w"); fprintf(f, "Reset - Connect\n"); fclose(f);*/ Pmed_reset(PMEDLOG_HTTP_CONNECT); } //Codigo para buscar o retorno do servidor HTTP /* printf("Vai pegar retorno\n"); char buffer[300]; int ret; while (true) { ret = sock.receive(buffer, sizeof(buffer)-1); if (ret <= 0) break; buffer[ret] = '\0'; printf("Received %d chars from server:\n%s\n", ret, buffer); } */ } else{ printf("Reset\n"); /*f = fopen(FILENAMERESET, "a"); if (f == NULL) f = fopen(FILENAMERESET, "w"); fprintf(f, "Reset - Send\n"); fclose(f);*/ Pmed_reset(PMEDLOG_HTTP_SEND); } sock.close(); }