Added WebSocket protocol

Committer:
mauricioaschmitz
Date:
Wed Apr 19 21:26:46 2017 +0000
Revision:
0:6d4dbf28d4ee
Added WebSocket protocol

Who changed what in which revision?

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