Client of WebSocket protocol

Fork of WebSocketClient by Samuel Mokrani

Committer:
mauricioaschmitz
Date:
Fri Feb 24 20:06:49 2017 +0000
Revision:
8:c9da00db9d33
Added project prtgmdWebSocketClient

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mauricioaschmitz 8:c9da00db9d33 1 #include "WebsocketCaptureMonitor.h"
mauricioaschmitz 8:c9da00db9d33 2 #include "Pmed_reset.h"
mauricioaschmitz 8:c9da00db9d33 3 #include "Log.h"
mauricioaschmitz 8:c9da00db9d33 4 //#include "Settings.h"
mauricioaschmitz 8:c9da00db9d33 5
mauricioaschmitz 8:c9da00db9d33 6 void WebsocketCaptureMonitor::WebsocketCaptureMonitor_Thread(void const *arg)
mauricioaschmitz 8:c9da00db9d33 7 {
mauricioaschmitz 8:c9da00db9d33 8 //Log::writeEntry("WebSocket Capture Thread Start");
mauricioaschmitz 8:c9da00db9d33 9 char mensagem[600];
mauricioaschmitz 8:c9da00db9d33 10 CaptureMailbox& mbox = EventDetector::GetMailbox();
mauricioaschmitz 8:c9da00db9d33 11 osEvent evt;
mauricioaschmitz 8:c9da00db9d33 12 while(true){
mauricioaschmitz 8:c9da00db9d33 13 evt = mbox.get();
mauricioaschmitz 8:c9da00db9d33 14 if(evt.status == osEventMail)
mauricioaschmitz 8:c9da00db9d33 15 {
mauricioaschmitz 8:c9da00db9d33 16 //printf("Entrou monitor de captura!!!!\n\n");
mauricioaschmitz 8:c9da00db9d33 17 CaptureEvent* cap = (CaptureEvent*)evt.value.p;
mauricioaschmitz 8:c9da00db9d33 18
mauricioaschmitz 8:c9da00db9d33 19 //printf("Request=[%s]\n",mensagem);
mauricioaschmitz 8:c9da00db9d33 20 //Websocket::ReceiveMessage(mensagem);
mauricioaschmitz 8:c9da00db9d33 21 //memset(mensagem, 0, 600);
mauricioaschmitz 8:c9da00db9d33 22 //printf("Saiu do monitor de captura!!!!\n\n");
mauricioaschmitz 8:c9da00db9d33 23
mauricioaschmitz 8:c9da00db9d33 24 //testar porque não funciona, ideia era se o websocket não estiver conectado, abrir um socket e enviar por post direto
mauricioaschmitz 8:c9da00db9d33 25 PrepareMessage(cap, mensagem, true);
mauricioaschmitz 8:c9da00db9d33 26 Websocket::ReceiveMessage(mensagem);
mauricioaschmitz 8:c9da00db9d33 27
mauricioaschmitz 8:c9da00db9d33 28 //if(Websocket::wsIsConnected()){
mauricioaschmitz 8:c9da00db9d33 29 //PrepareMessage(cap, mensagem, true);
mauricioaschmitz 8:c9da00db9d33 30 //Websocket::ReceiveMessage(mensagem);
mauricioaschmitz 8:c9da00db9d33 31 /*
mauricioaschmitz 8:c9da00db9d33 32 printf("WebSocket conectado para o envio de dados!!!\n");
mauricioaschmitz 8:c9da00db9d33 33 strcpy(tmp, mensagem);
mauricioaschmitz 8:c9da00db9d33 34 strcpy(mensagem, "#*InsertCaptureDB*#");
mauricioaschmitz 8:c9da00db9d33 35 strcat(mensagem, tmp);
mauricioaschmitz 8:c9da00db9d33 36
mauricioaschmitz 8:c9da00db9d33 37 //memset(tmp,0,600);
mauricioaschmitz 8:c9da00db9d33 38 //alguma forma de tentar conectar o websocket
mauricioaschmitz 8:c9da00db9d33 39 */
mauricioaschmitz 8:c9da00db9d33 40 //}
mauricioaschmitz 8:c9da00db9d33 41 //else
mauricioaschmitz 8:c9da00db9d33 42 //{
mauricioaschmitz 8:c9da00db9d33 43 //TCPSocketConnection sock;
mauricioaschmitz 8:c9da00db9d33 44 //DoPost(sock,Settings::get_networkServer(),cap);
mauricioaschmitz 8:c9da00db9d33 45 //}
mauricioaschmitz 8:c9da00db9d33 46 mbox.free(cap);
mauricioaschmitz 8:c9da00db9d33 47 }
mauricioaschmitz 8:c9da00db9d33 48 }
mauricioaschmitz 8:c9da00db9d33 49 }
mauricioaschmitz 8:c9da00db9d33 50
mauricioaschmitz 8:c9da00db9d33 51 void WebsocketCaptureMonitor::PrepareMessage(CaptureEvent* dados, char *strfinal, bool isWS){
mauricioaschmitz 8:c9da00db9d33 52 char str[400];
mauricioaschmitz 8:c9da00db9d33 53 char aux[_PRTGMD_SETTINGS_DEFAULT_MAX_HARMONICS_];
mauricioaschmitz 8:c9da00db9d33 54 int i;
mauricioaschmitz 8:c9da00db9d33 55
mauricioaschmitz 8:c9da00db9d33 56 const char *header1 = "POST /Ptgm-Scripts/capture.php HTTP/1.1\r\n";
mauricioaschmitz 8:c9da00db9d33 57 //"Host: 192.168.1.26\r\n"
mauricioaschmitz 8:c9da00db9d33 58 //"Content-Length: "
mauricioaschmitz 8:c9da00db9d33 59
mauricioaschmitz 8:c9da00db9d33 60 const char *header2 = "\r\n"
mauricioaschmitz 8:c9da00db9d33 61 "Content-Type: application/x-www-form-urlencoded\r\n"
mauricioaschmitz 8:c9da00db9d33 62 "\r\n";
mauricioaschmitz 8:c9da00db9d33 63
mauricioaschmitz 8:c9da00db9d33 64 //str = (char *) malloc(450);
mauricioaschmitz 8:c9da00db9d33 65 //strfinal = (char *) malloc(450);
mauricioaschmitz 8:c9da00db9d33 66 memset(str,0,400);
mauricioaschmitz 8:c9da00db9d33 67 memset(strfinal,0,500);
mauricioaschmitz 8:c9da00db9d33 68
mauricioaschmitz 8:c9da00db9d33 69 if(isWS){
mauricioaschmitz 8:c9da00db9d33 70 strcat(strfinal, "#*InsertCaptureDB*#");
mauricioaschmitz 8:c9da00db9d33 71 }
mauricioaschmitz 8:c9da00db9d33 72
mauricioaschmitz 8:c9da00db9d33 73 strcat(strfinal, header1);
mauricioaschmitz 8:c9da00db9d33 74 strcat(strfinal, "Host: ");
mauricioaschmitz 8:c9da00db9d33 75 strcat(strfinal, Settings::get_networkServer() );
mauricioaschmitz 8:c9da00db9d33 76 strcat(strfinal, "\r\n");
mauricioaschmitz 8:c9da00db9d33 77
mauricioaschmitz 8:c9da00db9d33 78 sprintf(aux,"TYPE=0%d",dados->get_Type());
mauricioaschmitz 8:c9da00db9d33 79 strcat(str, aux);
mauricioaschmitz 8:c9da00db9d33 80
mauricioaschmitz 8:c9da00db9d33 81 sprintf(aux,"&OUTLET=%02d",dados->get_OutletNumber());
mauricioaschmitz 8:c9da00db9d33 82 strcat(str, aux);
mauricioaschmitz 8:c9da00db9d33 83
mauricioaschmitz 8:c9da00db9d33 84 sprintf(aux,"&RFID=%s", dados->get_RFID());
mauricioaschmitz 8:c9da00db9d33 85 strcat(str,aux);
mauricioaschmitz 8:c9da00db9d33 86
mauricioaschmitz 8:c9da00db9d33 87 sprintf(aux,"&OFFSET=%04d",dados->get_Offset());
mauricioaschmitz 8:c9da00db9d33 88 strcat(str,aux);
mauricioaschmitz 8:c9da00db9d33 89
mauricioaschmitz 8:c9da00db9d33 90 float f = dados->get_Gain();
mauricioaschmitz 8:c9da00db9d33 91 sprintf(aux,"&GAIN=%08X", *(unsigned int*)&f);
mauricioaschmitz 8:c9da00db9d33 92 strcat(str,aux);
mauricioaschmitz 8:c9da00db9d33 93
mauricioaschmitz 8:c9da00db9d33 94 f = dados->get_RMSValue();
mauricioaschmitz 8:c9da00db9d33 95 sprintf(aux,"&RMS=%08X",*(unsigned int*)&f);
mauricioaschmitz 8:c9da00db9d33 96 strcat(str,aux);
mauricioaschmitz 8:c9da00db9d33 97
mauricioaschmitz 8:c9da00db9d33 98 f = dados->get_MeanValue();
mauricioaschmitz 8:c9da00db9d33 99 sprintf(aux,"&MV=%08X",*(unsigned int*)&f);
mauricioaschmitz 8:c9da00db9d33 100 strcat(str,aux);
mauricioaschmitz 8:c9da00db9d33 101
mauricioaschmitz 8:c9da00db9d33 102 /* Adicionados para alteracao */
mauricioaschmitz 8:c9da00db9d33 103 //printf("MV %f MV2 %f\n", dados->get_MeanValue(), dados->get_MV2());
mauricioaschmitz 8:c9da00db9d33 104 f = dados->get_MV2();
mauricioaschmitz 8:c9da00db9d33 105 sprintf(aux,"&MV2=%08X",*(unsigned int*)&f);
mauricioaschmitz 8:c9da00db9d33 106 strcat(str,aux);
mauricioaschmitz 8:c9da00db9d33 107
mauricioaschmitz 8:c9da00db9d33 108 sprintf(aux,"&UNDER=%04d",dados->get_Under());
mauricioaschmitz 8:c9da00db9d33 109 strcat(str,aux);
mauricioaschmitz 8:c9da00db9d33 110
mauricioaschmitz 8:c9da00db9d33 111 sprintf(aux,"&OVER=%04d",dados->get_Over());
mauricioaschmitz 8:c9da00db9d33 112 strcat(str,aux);
mauricioaschmitz 8:c9da00db9d33 113
mauricioaschmitz 8:c9da00db9d33 114 sprintf(aux,"&DURATION=%04d",dados->get_Duration());
mauricioaschmitz 8:c9da00db9d33 115 strcat(str,aux);
mauricioaschmitz 8:c9da00db9d33 116 /* Ate Aqui */
mauricioaschmitz 8:c9da00db9d33 117
mauricioaschmitz 8:c9da00db9d33 118 strcat(str,"&SIN=");
mauricioaschmitz 8:c9da00db9d33 119 for(i=0;i<Settings::get_maxHarmonics();i++)
mauricioaschmitz 8:c9da00db9d33 120 {
mauricioaschmitz 8:c9da00db9d33 121 char s[10];
mauricioaschmitz 8:c9da00db9d33 122 //According to RFC1738,RFC3986 the semicolon is a reserved character and must be encoded
mauricioaschmitz 8:c9da00db9d33 123 f = dados->get_SineValue(i);
mauricioaschmitz 8:c9da00db9d33 124 sprintf(s,"%08X",*(unsigned int*)&f);
mauricioaschmitz 8:c9da00db9d33 125 strcat(str,s);
mauricioaschmitz 8:c9da00db9d33 126 if (i < (Settings::get_maxHarmonics() - 1))
mauricioaschmitz 8:c9da00db9d33 127 strcat(str, "%3B");
mauricioaschmitz 8:c9da00db9d33 128 }
mauricioaschmitz 8:c9da00db9d33 129
mauricioaschmitz 8:c9da00db9d33 130 strcat(str,"&COS=");
mauricioaschmitz 8:c9da00db9d33 131 for(i=0;i<Settings::get_maxHarmonics();i++)
mauricioaschmitz 8:c9da00db9d33 132 {
mauricioaschmitz 8:c9da00db9d33 133 char c[10];
mauricioaschmitz 8:c9da00db9d33 134 //According to RFC1738,RFC3986 the semicolon is a reserved character and must be encoded
mauricioaschmitz 8:c9da00db9d33 135 f = dados->get_CossineValue(i);
mauricioaschmitz 8:c9da00db9d33 136 sprintf(c,"%08X",*(unsigned int*)&f);
mauricioaschmitz 8:c9da00db9d33 137 strcat(str,c);
mauricioaschmitz 8:c9da00db9d33 138 if (i < (Settings::get_maxHarmonics()-1))
mauricioaschmitz 8:c9da00db9d33 139 strcat(str, "%3B");
mauricioaschmitz 8:c9da00db9d33 140 }
mauricioaschmitz 8:c9da00db9d33 141 strcat(str,"\r\n");
mauricioaschmitz 8:c9da00db9d33 142
mauricioaschmitz 8:c9da00db9d33 143 char len[5];
mauricioaschmitz 8:c9da00db9d33 144 sprintf(len,"%d",strlen(str));
mauricioaschmitz 8:c9da00db9d33 145
mauricioaschmitz 8:c9da00db9d33 146 strcat(strfinal, "Content-Length: ");
mauricioaschmitz 8:c9da00db9d33 147 strcat(strfinal, len);
mauricioaschmitz 8:c9da00db9d33 148 strcat(strfinal, header2);
mauricioaschmitz 8:c9da00db9d33 149 strcat(strfinal, str);
mauricioaschmitz 8:c9da00db9d33 150 strcat(strfinal, "\r\n");
mauricioaschmitz 8:c9da00db9d33 151
mauricioaschmitz 8:c9da00db9d33 152 //printf("Request=[%s]\n",strfinal);
mauricioaschmitz 8:c9da00db9d33 153 //printf("Tamanho STR %d\n", strlen(str));
mauricioaschmitz 8:c9da00db9d33 154 //printf("Tamanho STRFINAL %d\n", strlen(strfinal));
mauricioaschmitz 8:c9da00db9d33 155 }
mauricioaschmitz 8:c9da00db9d33 156
mauricioaschmitz 8:c9da00db9d33 157 void WebsocketCaptureMonitor::DoPost(TCPSocketConnection sock, char *host, CaptureEvent* dados){
mauricioaschmitz 8:c9da00db9d33 158 char http_cmd[400];
mauricioaschmitz 8:c9da00db9d33 159 int escritos, r=-1, i;
mauricioaschmitz 8:c9da00db9d33 160 //FILE *f;
mauricioaschmitz 8:c9da00db9d33 161
mauricioaschmitz 8:c9da00db9d33 162 //Timer t;
mauricioaschmitz 8:c9da00db9d33 163 //t.start();
mauricioaschmitz 8:c9da00db9d33 164
mauricioaschmitz 8:c9da00db9d33 165 //printf("HTTP Socket %s:%d\n", host, sock.get_port());
mauricioaschmitz 8:c9da00db9d33 166 //printf("Antes Connect\n");
mauricioaschmitz 8:c9da00db9d33 167 //rs= sock.connect(host, 80);
mauricioaschmitz 8:c9da00db9d33 168 //printf("%d\n", rs);
mauricioaschmitz 8:c9da00db9d33 169 //printf("Depois Connect ");
mauricioaschmitz 8:c9da00db9d33 170
mauricioaschmitz 8:c9da00db9d33 171 //t.stop();
mauricioaschmitz 8:c9da00db9d33 172 //printf("HHTP: The time taken in connection was %d useconds\n", t.read_us());
mauricioaschmitz 8:c9da00db9d33 173
mauricioaschmitz 8:c9da00db9d33 174 //http_cmd = (char *) malloc(500);
mauricioaschmitz 8:c9da00db9d33 175 memset(http_cmd, 0, 600);
mauricioaschmitz 8:c9da00db9d33 176 PrepareMessage( dados,http_cmd, false );
mauricioaschmitz 8:c9da00db9d33 177 //printf("Fuga\n");
mauricioaschmitz 8:c9da00db9d33 178 //printf("Tamanho do comando %d\n", strlen(http_cmd));
mauricioaschmitz 8:c9da00db9d33 179 //printf("Comando: /* %s */\n", http_cmd);
mauricioaschmitz 8:c9da00db9d33 180
mauricioaschmitz 8:c9da00db9d33 181 //http_cmd = prepare_POST( dados );
mauricioaschmitz 8:c9da00db9d33 182
mauricioaschmitz 8:c9da00db9d33 183 //printf("Tamanho comando %d\n", strlen(http_cmd));
mauricioaschmitz 8:c9da00db9d33 184 //printf("Request \n [%s]\n", http_cmd);
mauricioaschmitz 8:c9da00db9d33 185
mauricioaschmitz 8:c9da00db9d33 186
mauricioaschmitz 8:c9da00db9d33 187 for(i=0; i < _PRTGMD_SETTINGS_DEFAULT_TRIES_ ; i++){
mauricioaschmitz 8:c9da00db9d33 188 r = sock.connect(host, 80);
mauricioaschmitz 8:c9da00db9d33 189 if (r < 0) {
mauricioaschmitz 8:c9da00db9d33 190 printf("Error: Unable to connect to (%s) on port (%d) Try %d\n", host, 80, i);
mauricioaschmitz 8:c9da00db9d33 191 Thread::wait(Settings::get_delayTry());
mauricioaschmitz 8:c9da00db9d33 192 }
mauricioaschmitz 8:c9da00db9d33 193 else
mauricioaschmitz 8:c9da00db9d33 194 break;
mauricioaschmitz 8:c9da00db9d33 195 }
mauricioaschmitz 8:c9da00db9d33 196 if (r == 0){
mauricioaschmitz 8:c9da00db9d33 197 for(i=0; i < _PRTGMD_SETTINGS_DEFAULT_TRIES_ ; i++){
mauricioaschmitz 8:c9da00db9d33 198 escritos = sock.send_all(http_cmd, strlen(http_cmd));
mauricioaschmitz 8:c9da00db9d33 199 if(escritos != strlen(http_cmd)){
mauricioaschmitz 8:c9da00db9d33 200 printf("Erro ao gravar no socket HTTP!! Escritos %d\t Tam %d Try %d\n", escritos, strlen(http_cmd), i);
mauricioaschmitz 8:c9da00db9d33 201 Thread::wait(Settings::get_delayTry());
mauricioaschmitz 8:c9da00db9d33 202 }
mauricioaschmitz 8:c9da00db9d33 203 else
mauricioaschmitz 8:c9da00db9d33 204 break;
mauricioaschmitz 8:c9da00db9d33 205 }
mauricioaschmitz 8:c9da00db9d33 206 if ( i != _PRTGMD_SETTINGS_DEFAULT_TRIES_ )
mauricioaschmitz 8:c9da00db9d33 207 Thread::wait(Settings::get_delaySend());
mauricioaschmitz 8:c9da00db9d33 208 else{
mauricioaschmitz 8:c9da00db9d33 209 //printf("Reset\n");
mauricioaschmitz 8:c9da00db9d33 210 /*f = fopen(FILENAMERESET, "a");
mauricioaschmitz 8:c9da00db9d33 211 if (f == NULL)
mauricioaschmitz 8:c9da00db9d33 212 f = fopen(FILENAMERESET, "w");
mauricioaschmitz 8:c9da00db9d33 213 fprintf(f, "Reset - Connect\n");
mauricioaschmitz 8:c9da00db9d33 214 fclose(f);*/
mauricioaschmitz 8:c9da00db9d33 215
mauricioaschmitz 8:c9da00db9d33 216 Pmed_reset(PMEDLOG_HTTP_CONNECT);
mauricioaschmitz 8:c9da00db9d33 217 }
mauricioaschmitz 8:c9da00db9d33 218
mauricioaschmitz 8:c9da00db9d33 219 //Codigo para buscar o retorno do servidor HTTP
mauricioaschmitz 8:c9da00db9d33 220 /*
mauricioaschmitz 8:c9da00db9d33 221 printf("Vai pegar retorno\n");
mauricioaschmitz 8:c9da00db9d33 222
mauricioaschmitz 8:c9da00db9d33 223 char buffer[300];
mauricioaschmitz 8:c9da00db9d33 224 int ret;
mauricioaschmitz 8:c9da00db9d33 225 while (true) {
mauricioaschmitz 8:c9da00db9d33 226 ret = sock.receive(buffer, sizeof(buffer)-1);
mauricioaschmitz 8:c9da00db9d33 227 if (ret <= 0)
mauricioaschmitz 8:c9da00db9d33 228 break;
mauricioaschmitz 8:c9da00db9d33 229 buffer[ret] = '\0';
mauricioaschmitz 8:c9da00db9d33 230 printf("Received %d chars from server:\n%s\n", ret, buffer);
mauricioaschmitz 8:c9da00db9d33 231 }
mauricioaschmitz 8:c9da00db9d33 232 */
mauricioaschmitz 8:c9da00db9d33 233 }
mauricioaschmitz 8:c9da00db9d33 234 else{
mauricioaschmitz 8:c9da00db9d33 235 printf("Reset\n");
mauricioaschmitz 8:c9da00db9d33 236 /*f = fopen(FILENAMERESET, "a");
mauricioaschmitz 8:c9da00db9d33 237 if (f == NULL)
mauricioaschmitz 8:c9da00db9d33 238 f = fopen(FILENAMERESET, "w");
mauricioaschmitz 8:c9da00db9d33 239 fprintf(f, "Reset - Send\n");
mauricioaschmitz 8:c9da00db9d33 240 fclose(f);*/
mauricioaschmitz 8:c9da00db9d33 241
mauricioaschmitz 8:c9da00db9d33 242 Pmed_reset(PMEDLOG_HTTP_SEND);
mauricioaschmitz 8:c9da00db9d33 243 }
mauricioaschmitz 8:c9da00db9d33 244
mauricioaschmitz 8:c9da00db9d33 245 sock.close();
mauricioaschmitz 8:c9da00db9d33 246 }