Protegemed / prtgmdWebSocketClient

Fork of WebSocketClient by Samuel Mokrani

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers WebsocketCaptureMonitor.cpp Source File

WebsocketCaptureMonitor.cpp

00001 #include "WebsocketCaptureMonitor.h"
00002 #include "Pmed_reset.h"
00003 #include "Log.h"
00004 //#include "Settings.h"
00005 
00006 void WebsocketCaptureMonitor::WebsocketCaptureMonitor_Thread(void const *arg)
00007 {
00008     //Log::writeEntry("WebSocket Capture Thread Start");
00009     char mensagem[600];
00010     CaptureMailbox& mbox = EventDetector::GetMailbox();
00011     osEvent evt;
00012     while(true){
00013         evt = mbox.get();
00014         if(evt.status == osEventMail)
00015         {
00016             //printf("Entrou monitor de captura!!!!\n\n");
00017             CaptureEvent* cap = (CaptureEvent*)evt.value.p;
00018             
00019             //printf("Request=[%s]\n",mensagem);
00020             //Websocket::ReceiveMessage(mensagem);
00021             //memset(mensagem, 0, 600);
00022             //printf("Saiu do monitor de captura!!!!\n\n");
00023             
00024             //testar porque não funciona, ideia era se o websocket não estiver conectado, abrir um socket e enviar por post direto
00025             PrepareMessage(cap, mensagem, true);
00026             Websocket::ReceiveMessage(mensagem);
00027             
00028             //if(Websocket::wsIsConnected()){
00029                 //PrepareMessage(cap, mensagem, true);
00030                 //Websocket::ReceiveMessage(mensagem);
00031                 /*
00032                 printf("WebSocket conectado para o envio de dados!!!\n");
00033                 strcpy(tmp, mensagem);
00034                 strcpy(mensagem, "#*InsertCaptureDB*#");
00035                 strcat(mensagem, tmp);
00036                 
00037                 //memset(tmp,0,600);
00038                 //alguma forma de tentar conectar o websocket
00039                 */
00040             //}
00041             //else
00042             //{
00043                 //TCPSocketConnection sock;
00044                 //DoPost(sock,Settings::get_networkServer(),cap);
00045             //}
00046             mbox.free(cap);
00047         }
00048     }
00049 }
00050 
00051 void WebsocketCaptureMonitor::PrepareMessage(CaptureEvent* dados, char *strfinal, bool isWS){
00052     char str[400];
00053     char aux[_PRTGMD_SETTINGS_DEFAULT_MAX_HARMONICS_];
00054     int i;
00055 
00056     const char *header1 = "POST /Ptgm-Scripts/capture.php HTTP/1.1\r\n";
00057                 //"Host: 192.168.1.26\r\n"
00058                 //"Content-Length: "
00059                 
00060     const char *header2 = "\r\n"
00061                 "Content-Type: application/x-www-form-urlencoded\r\n"
00062                 "\r\n";
00063     
00064     //str = (char *) malloc(450);
00065     //strfinal = (char *) malloc(450);
00066     memset(str,0,400);
00067     memset(strfinal,0,500);
00068     
00069     if(isWS){
00070         strcat(strfinal, "#*InsertCaptureDB*#");
00071     }
00072      
00073     strcat(strfinal, header1);    
00074     strcat(strfinal, "Host: ");
00075     strcat(strfinal, Settings::get_networkServer() );
00076     strcat(strfinal, "\r\n");
00077     
00078     sprintf(aux,"TYPE=0%d",dados->get_Type());
00079     strcat(str, aux);
00080 
00081     sprintf(aux,"&OUTLET=%02d",dados->get_OutletNumber());
00082     strcat(str, aux);
00083     
00084     sprintf(aux,"&RFID=%s", dados->get_RFID());
00085     strcat(str,aux);
00086 
00087     sprintf(aux,"&OFFSET=%04d",dados->get_Offset());
00088     strcat(str,aux);
00089     
00090     float f = dados->get_Gain();
00091     sprintf(aux,"&GAIN=%08X", *(unsigned int*)&f);
00092     strcat(str,aux);
00093     
00094     f = dados->get_RMSValue();
00095     sprintf(aux,"&RMS=%08X",*(unsigned int*)&f);
00096     strcat(str,aux);
00097     
00098     f = dados->get_MeanValue();
00099     sprintf(aux,"&MV=%08X",*(unsigned int*)&f);
00100     strcat(str,aux);        
00101     
00102     /* Adicionados para alteracao */
00103     //printf("MV %f MV2 %f\n", dados->get_MeanValue(), dados->get_MV2());
00104     f = dados->get_MV2();
00105     sprintf(aux,"&MV2=%08X",*(unsigned int*)&f);
00106     strcat(str,aux);        
00107     
00108     sprintf(aux,"&UNDER=%04d",dados->get_Under());
00109     strcat(str,aux);
00110     
00111     sprintf(aux,"&OVER=%04d",dados->get_Over());
00112     strcat(str,aux);
00113     
00114     sprintf(aux,"&DURATION=%04d",dados->get_Duration());
00115     strcat(str,aux);
00116     /* Ate Aqui */
00117     
00118     strcat(str,"&SIN=");
00119     for(i=0;i<Settings::get_maxHarmonics();i++)
00120     {
00121         char s[10];
00122         //According to RFC1738,RFC3986 the semicolon is a reserved character and must be encoded
00123         f = dados->get_SineValue(i);
00124         sprintf(s,"%08X",*(unsigned int*)&f);
00125         strcat(str,s);
00126         if (i < (Settings::get_maxHarmonics() - 1))
00127             strcat(str, "%3B");
00128     }
00129 
00130     strcat(str,"&COS=");
00131     for(i=0;i<Settings::get_maxHarmonics();i++)
00132     {
00133         char c[10];
00134         //According to RFC1738,RFC3986 the semicolon is a reserved character and must be encoded
00135         f = dados->get_CossineValue(i);
00136         sprintf(c,"%08X",*(unsigned int*)&f);
00137         strcat(str,c);
00138         if (i < (Settings::get_maxHarmonics()-1))
00139             strcat(str, "%3B");
00140     }
00141     strcat(str,"\r\n");
00142     
00143     char len[5];
00144     sprintf(len,"%d",strlen(str));        
00145     
00146     strcat(strfinal, "Content-Length: ");
00147     strcat(strfinal, len);
00148     strcat(strfinal, header2);
00149     strcat(strfinal, str);    
00150     strcat(strfinal, "\r\n");
00151     
00152     //printf("Request=[%s]\n",strfinal);
00153     //printf("Tamanho STR %d\n", strlen(str));
00154     //printf("Tamanho STRFINAL %d\n", strlen(strfinal));      
00155  }
00156  
00157  void WebsocketCaptureMonitor::DoPost(TCPSocketConnection sock, char *host, CaptureEvent* dados){
00158     char http_cmd[400]; 
00159     int escritos, r=-1, i;
00160     //FILE *f;
00161     
00162     //Timer t;
00163     //t.start();
00164     
00165     //printf("HTTP Socket %s:%d\n", host, sock.get_port());
00166     //printf("Antes Connect\n");
00167     //rs= sock.connect(host, 80);   
00168     //printf("%d\n", rs);
00169     //printf("Depois Connect "); 
00170     
00171     //t.stop();
00172     //printf("HHTP: The time taken in connection was %d useconds\n", t.read_us());
00173            
00174     //http_cmd = (char *) malloc(500);
00175     memset(http_cmd, 0, 600);
00176     PrepareMessage( dados,http_cmd, false );
00177     //printf("Fuga\n");
00178     //printf("Tamanho do comando %d\n", strlen(http_cmd));
00179     //printf("Comando: /* %s */\n", http_cmd);
00180     
00181     //http_cmd = prepare_POST( dados );
00182     
00183     //printf("Tamanho comando %d\n", strlen(http_cmd));     
00184     //printf("Request \n [%s]\n", http_cmd);     
00185 
00186     
00187     for(i=0; i < _PRTGMD_SETTINGS_DEFAULT_TRIES_ ; i++){
00188         r = sock.connect(host, 80);        
00189         if (r < 0) {
00190             printf("Error: Unable to connect to (%s) on port (%d) Try %d\n", host, 80, i);
00191             Thread::wait(Settings::get_delayTry());
00192         }
00193         else
00194             break;            
00195     }     
00196     if (r == 0){
00197         for(i=0; i < _PRTGMD_SETTINGS_DEFAULT_TRIES_ ; i++){
00198             escritos = sock.send_all(http_cmd, strlen(http_cmd));        
00199             if(escritos != strlen(http_cmd)){
00200                 printf("Erro ao gravar no socket HTTP!! Escritos %d\t Tam %d Try %d\n", escritos, strlen(http_cmd), i);            
00201                 Thread::wait(Settings::get_delayTry());
00202             }
00203             else 
00204                 break;
00205         }
00206         if ( i != _PRTGMD_SETTINGS_DEFAULT_TRIES_  )
00207             Thread::wait(Settings::get_delaySend());
00208         else{
00209             //printf("Reset\n");
00210             /*f = fopen(FILENAMERESET, "a");
00211             if (f == NULL)            
00212                 f = fopen(FILENAMERESET, "w");
00213             fprintf(f, "Reset - Connect\n");
00214             fclose(f);*/
00215                 
00216             Pmed_reset(PMEDLOG_HTTP_CONNECT);
00217         }            
00218             
00219         //Codigo para buscar o retorno do servidor HTTP
00220         /*
00221         printf("Vai pegar retorno\n");
00222         
00223         char buffer[300];
00224         int ret;
00225         while (true) {
00226             ret = sock.receive(buffer, sizeof(buffer)-1);
00227             if (ret <= 0)
00228                 break;
00229             buffer[ret] = '\0';
00230             printf("Received %d chars from server:\n%s\n", ret, buffer);
00231         }
00232         */
00233     }
00234     else{
00235         printf("Reset\n");
00236         /*f = fopen(FILENAMERESET, "a");
00237         if (f == NULL)            
00238             f = fopen(FILENAMERESET, "w");
00239         fprintf(f, "Reset - Send\n");
00240         fclose(f);*/
00241             
00242         Pmed_reset(PMEDLOG_HTTP_SEND);
00243     }
00244     
00245     sock.close();  
00246 }