Added WebSocket protocol
Revision 0:6d4dbf28d4ee, committed 2017-04-19
- Comitter:
- mauricioaschmitz
- Date:
- Wed Apr 19 21:26:46 2017 +0000
- Commit message:
- Added WebSocket protocol
Changed in this revision
diff -r 000000000000 -r 6d4dbf28d4ee Websocket.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Websocket.cpp Wed Apr 19 21:26:46 2017 +0000 @@ -0,0 +1,516 @@ +#include "Websocket.h" +#include "Pmed_reset.h" +#include "Log.h" + +#define MAX_TRY_WRITE 20 +#define MAX_TRY_READ 10 +#define MAX_TRY_CONNECT 50 +#define WAIT_CONNECT_TIME 10000 + +//Debug is disabled by default +#if 0 +#define DBG(x, ...) std::printf("[WebSocket : DBG]"x"\r\n", ##__VA_ARGS__); +#define WARN(x, ...) std::printf("[WebSocket : WARN]"x"\r\n", ##__VA_ARGS__); +#define ERR(x, ...) std::printf("[WebSocket : ERR]"x"\r\n", ##__VA_ARGS__); +#else +#define DBG(x, ...) +#define WARN(x, ...) +#define ERR(x, ...) +#endif + +#define INFO(x, ...) printf("[WebSocket : INFO]"x"\r\n", ##__VA_ARGS__); + +char * Websocket::captureMessage; +bool Websocket::haveMessage; +bool Websocket::isConect; +bool disconnectedWS = false; + +void Websocket::Websocket_Thread(void const *arg) +{ + //Log::writeEntry("WebSocket Thread Start"); + printf("Thread WebSocket Iniciada\r\n"); + int i = 0, f = 0; + char *comando = NULL; + char *tomada = NULL; + char *canal = NULL; + char *limite = NULL; + char server[30]; + char buffer[1024] = {}; + //bool external = false; + strcpy(server, "ws://"); + strcat(server, Settings::get_networkServer()); + strcat(server, ":8080"); + + //printf("Servidor WS: %s", server); + + Websocket ws(server); + + while(1){ + if(ws.is_connected()){ + if (f == 0){ + //Log::writeEntry("WebSocket Conectado."); + //printf("\nMensagem do MBED para servidor WebSocket em PHP\n\n"); + //ws.send("#*MBEDStart*#Mensagem do MBED para servidor WebSocket em PHP\n"); //mensagem para registrar login do mbed no banco de dados (ainda por implementar) + f = 1; + } + if(disconnectedWS != false){ + disconnectedWS = false; + } + if(haveMessage){ + ws.send(captureMessage); + haveMessage = false; + captureMessage = NULL; + } + if (ws.read(buffer)) { + //ws.send("#*MBEDTest*#"); + //printf("Recebido Mensagem WebSocket: %s\r\n", buffer); + comando = strtok(buffer, ":"); + if(strcmp(comando, "test") == 0){ + //printf("\r\nRecebido por WebSocket o Comando de Teste."); + ws.send("#*MBEDTest*#"); + //Log::writeEntry("Recebido por WebSocket o Comando de Teste."); + } + if(strcmp(comando, "capture") == 0){ + tomada = strtok(NULL, ":"); + canal = strtok(NULL, " "); + /* + printf("Comando: %s\n", comando); + printf("Tomada: %s\n", tomada); + printf("Canal: %s\n", canal); + printf("Tamanho da string: %d\n", strlen(buffer)); + */ + + EventDetector::externalCapture(atoi(tomada), canal[0]); + } + if(strcmp(comando, "reset") == 0){ + Pmed_reset("Reiniciando o MBED por WebSocket."); + } + + if(strcmp(comando, "setLimit") == 0 || strcmp(comando, "setStandByLimit") == 0){ + tomada = strtok(NULL, ":"); + canal = strtok(NULL, ":"); + limite = strtok(NULL, " "); + for(i=0; (unsigned)i < _PRTGMD_SETTINGS_MAX_NUMBER_OF_OUTLETS_; i++){ + if(atoi(tomada) == Settings::get_outlet(i)){ + if(strcmp(comando, "setLimit") == 0){ + if(strcmp(canal, "p") == 0){ + printf("Entrou canal fase e setou limite %s para tomada %s\r\n", limite, tomada); + Settings::set_limit(i*2,strtod(limite, NULL)); + } + if(strcmp(canal, "d") == 0){ + printf("Entrou canal fuga e setou limite %s para tomada %s\r\n", limite, tomada); + Settings::set_limit(i*2+1,strtod(limite, NULL)); + } + } + if(strcmp(comando, "setStandByLimit") == 0){ + if(strcmp(canal, "p") == 0){ + printf("Entrou canal StandBy de fase e setou limite %s para tomada %s\r\n", limite, tomada); + Settings::set_standbyLimit(i*2,strtod(limite, NULL)); + } + if(strcmp(canal, "d") == 0){ + printf("Entrou canal StandBy de fuga e setou limite %s para tomada %s\r\n", limite, tomada); + Settings::set_standbyLimit(i*2+1,strtod(limite, NULL)); + } + } + break; + }else{ + if(i == _PRTGMD_SETTINGS_MAX_NUMBER_OF_OUTLETS_ - 1){ + printf("Tomada %d nao encontrada para atualizar limite!\r\n", atoi(tomada)); + } + } + } + //printf("Comando: %s\n", comando); + //printf("Tomada: %d\n", atoi(tomada)); + //printf("Canal: %s\n", canal); + //printf("Limite: %f\n", strtod(limite, NULL)); + } + /* + if(strcmp(comando, "iniciar") == 0){ + printf("\n\nChegou o Iniciar!!!\n\n"); + external = true; + } + if(strcmp(comando, "parar") == 0){ + printf("\n\nChegou o Parar!!!\n\n"); + external = false; + } + if(external){ + + }*/ + } + /* + if (!ws.is_connected()){ + printf("Caiu a conexao!!!\n"); + Thread::wait(Settings::get_delayTry()); + for(int i=0; i < MAX_TRY_CONNECT; i++){ + Thread::wait(Settings::get_delayTry()); + //if(ws.connect()){ + // break; + //} + } + //Websocket ws("ws://192.168.103.101:8080"); + ws.connect(); + }*/ + }else{ + if(!disconnectedWS){ + if(ws.close()){ + disconnectedWS = true; + Log::writeEntry("WebSocket Desconectado."); + } + } + Thread::wait(WAIT_CONNECT_TIME); + if(ws.connect()){ + //Log::writeEntry("WebSocket Conectado."); + printf("Thread WebSocket Conectou no Servidor %s\r\n", Settings::get_networkServer()); + } + //Thread::wait(10000); + } + } + +} + +Websocket::Websocket(char const * url) { + fillFields(url); + socket.set_blocking(false, 400); +} + +bool Websocket::wsIsConnected(){ + return isConect; +} + +void Websocket::fillFields(char const * url) { + int ret = parseURL(url, scheme, sizeof(scheme), host, sizeof(host), &port, path, sizeof(path)); + if(ret) + { + ERR("URL parsing failed; please use: \"ws://ip-or-domain[:port]/path\""); + return; + } + + if(port == 0) //TODO do handle WSS->443 + { + port = 80; + } + + if(strcmp(scheme, "ws")) + { + ERR("Wrong scheme, please use \"ws\" instead"); + } +} + +int Websocket::parseURL(const char* url, char* scheme, size_t maxSchemeLen, char* host, size_t maxHostLen, uint16_t* port, char* path, size_t maxPathLen) //Parse URL +{ + char* schemePtr = (char*) url; + char* hostPtr = (char*) strstr(url, "://"); + if(hostPtr == NULL) + { + WARN("Could not find host"); + return -1; //URL is invalid + } + + if( maxSchemeLen < hostPtr - schemePtr + 1 ) //including NULL-terminating char + { + WARN("Scheme str is too small (%d >= %d)", maxSchemeLen, hostPtr - schemePtr + 1); + return -1; + } + memcpy(scheme, schemePtr, hostPtr - schemePtr); + scheme[hostPtr - schemePtr] = '\0'; + + hostPtr+=3; + + size_t hostLen = 0; + + char* portPtr = strchr(hostPtr, ':'); + if( portPtr != NULL ) + { + hostLen = portPtr - hostPtr; + portPtr++; + if( sscanf(portPtr, "%hu", port) != 1) + { + WARN("Could not find port"); + return -1; + } + } + else + { + *port=0; + } + char* pathPtr = strchr(hostPtr, '/'); + if( hostLen == 0 ) + { + hostLen = pathPtr - hostPtr; + } + + if( maxHostLen < hostLen + 1 ) //including NULL-terminating char + { + WARN("Host str is too small (%d >= %d)", maxHostLen, hostLen + 1); + return -1; + } + memcpy(host, hostPtr, hostLen); + host[hostLen] = '\0'; + + size_t pathLen; + char* fragmentPtr = strchr(hostPtr, '#'); + if(fragmentPtr != NULL) + { + pathLen = fragmentPtr - pathPtr; + } + else + { + pathLen = strlen(pathPtr); + } + + if( maxPathLen < pathLen + 1 ) //including NULL-terminating char + { + WARN("Path str is too small (%d >= %d)", maxPathLen, pathLen + 1); + return -1; + } + memcpy(path, pathPtr, pathLen); + path[pathLen] = '\0'; + + return 0; +} + + +bool Websocket::connect() { + char cmd[200]; + + while (socket.connect(host, port) < 0) { + ERR("Unable to connect to (%s) on port (%d)", host, port); + Thread::wait(200); + return false; + } + + // sent http header to upgrade to the ws protocol + sprintf(cmd, "GET %s HTTP/1.1\r\n", path); + write(cmd, strlen(cmd)); + + sprintf(cmd, "Host: %s:%d\r\n", host, port); + write(cmd, strlen(cmd)); + + sprintf(cmd, "Upgrade: WebSocket\r\n"); + write(cmd, strlen(cmd)); + + sprintf(cmd, "Connection: Upgrade\r\n"); + write(cmd, strlen(cmd)); + + sprintf(cmd, "Sec-WebSocket-Key: L159VM0TWUzyDxwJEIEzjw==\r\n"); + write(cmd, strlen(cmd)); + + sprintf(cmd, "Sec-WebSocket-Version: 13\r\n\r\n"); + int ret = write(cmd, strlen(cmd)); + if ((unsigned)ret != strlen(cmd)) { + close(); + ERR("Could not send request"); + return false; + } + + ret = read(cmd, 200, 100); + if (ret < 0) { + close(); + ERR("Could not receive answer\r\n"); + return false; + } + cmd[ret] = '\0'; + DBG("recv: %s\r\n", cmd); + + if ( strstr(cmd, "DdLWT/1JcX+nQFHebYP+rqEx5xI=") == NULL ) { + ERR("Wrong answer from server, got \"%s\" instead\r\n", cmd); + do { + ret = read(cmd, 200, 100); + if (ret < 0) { + ERR("Could not receive answer\r\n"); + return false; + } + cmd[ret] = '\0'; + printf("%s",cmd); + } while (ret > 0); + close(); + return false; + } + + //INFO("\r\nhost: %s\r\npath: %s\r\nport: %d\r\n\r\n", host, path, port); + return true; +} + +int Websocket::sendLength(uint32_t len, char * msg) { + + if (len < 126) { + msg[0] = len | (1<<7); + return 1; + } else if (len < 65535) { + msg[0] = 126 | (1<<7); + msg[1] = (len >> 8) & 0xff; + msg[2] = len & 0xff; + return 3; + } else { + msg[0] = 127 | (1<<7); + for (int i = 0; i < 8; i++) { + msg[i+1] = (len >> i*8) & 0xff; + } + return 9; + } +} + +int Websocket::readChar(char * pC, bool block) { + return read(pC, 1, 1); +} + +int Websocket::sendOpcode(uint8_t opcode, char * msg) { + msg[0] = 0x80 | (opcode & 0x0f); + return 1; +} + +int Websocket::sendMask(char * msg) { + for (int i = 0; i < 4; i++) { + msg[i] = 0; + } + return 4; +} + +int Websocket::send(char * str) { + char msg[strlen(str) + 15]; + int idx = 0; + idx = sendOpcode(0x01, msg); + idx += sendLength(strlen(str), msg + idx); + idx += sendMask(msg + idx); + memcpy(msg+idx, str, strlen(str)); + int res = write(msg, idx + strlen(str)); + return res; +} + + +bool Websocket::read(char * message) { + int i = 0; + uint32_t len_msg; + char opcode = 0; + char c; + char mask[4] = {0, 0, 0, 0}; + bool is_masked = false; + Timer tmr; + + // read the opcode + tmr.start(); + while (true) { + if (tmr.read() > 3) { + DBG("timeout ws\r\n"); + return false; + } + + if(!socket.is_connected()) + { + WARN("Connection was closed by server"); + return false; + } + + socket.set_blocking(false, 1); + if (socket.receive(&opcode, 1) != 1) { + socket.set_blocking(false, 2000); + return false; + } + + socket.set_blocking(false, 2000); + + if (opcode == 0x81) + break; + } + DBG("opcode: 0x%X\r\n", opcode); + + readChar(&c); + len_msg = c & 0x7f; + is_masked = c & 0x80; + if (len_msg == 126) { + readChar(&c); + len_msg = c << 8; + readChar(&c); + len_msg += c; + } else if (len_msg == 127) { + len_msg = 0; + for (int i = 0; i < 8; i++) { + readChar(&c); + len_msg += (c << (7-i)*8); + } + } + + if (len_msg == 0) { + return false; + } + DBG("length: %d\r\n", len_msg); + + if (is_masked) { + for (i = 0; i < 4; i++) + readChar(&c); + mask[i] = c; + } + + int nb = read(message, len_msg, len_msg); + if (nb != len_msg) + return false; + + for (i = 0; (unsigned)i < len_msg; i++) { + message[i] = message[i] ^ mask[i % 4]; + } + + message[len_msg] = '\0'; + + return true; +} + +bool Websocket::close() { + //if (!is_connected()) + //return false; + + int ret = socket.close(true); + if (ret < 0) { + ERR("Could not disconnect"); + return false; + } + return true; +} + +bool Websocket::is_connected() { + isConect = socket.is_connected(); + return socket.is_connected(); +} + +char* Websocket::getPath() { + return path; +} + +int Websocket::write(char * str, int len) { + int res = 0, idx = 0; + + for (int j = 0; j < MAX_TRY_WRITE; j++) { + + if(!socket.is_connected()) + { + WARN("Connection was closed by server"); + break; + } + + if ((res = socket.send_all(str + idx, len - idx)) == -1) + continue; + + idx += res; + + if (idx == len) + return len; + } + + return (idx == 0) ? -1 : idx; +} + +int Websocket::read(char * str, int len, int min_len) { + int res = 0, idx = 0; + + for (int j = 0; j < MAX_TRY_WRITE; j++) { + + if ((res = socket.receive_all(str + idx, len - idx)) == -1) + continue; + + idx += res; + + if (idx == len || (min_len != -1 && idx > min_len)) + return idx; + } + + return (idx == 0) ? -1 : idx; +}
diff -r 000000000000 -r 6d4dbf28d4ee Websocket.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Websocket.h Wed Apr 19 21:26:46 2017 +0000 @@ -0,0 +1,175 @@ +/** +* @author Samuel Mokrani +* +* @section LICENSE +* +* Copyright (c) 2011 mbed +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +* +* @section DESCRIPTION +* Simple websocket client +* +*/ + +#ifndef WEBSOCKET_H +#define WEBSOCKET_H + +#include "mbed.h" +#include "rtos.h" + +#include "TCPSocketConnection.h" +#include "EventDetector.h" + +extern void Websocket_Thread(void const *arg); + +/** Websocket client Class. + * + * Example (ethernet network): + * @code + * #include "mbed.h" + * #include "EthernetInterface.h" + * #include "Websocket.h" + * + * int main() { + * EthernetInterface eth; + * eth.init(); //Use DHCP + * eth.connect(); + * printf("IP Address is %s\n\r", eth.getIPAddress()); + * + * Websocket ws("ws://sockets.mbed.org:443/ws/demo/rw"); + * ws.connect(); + * + * while (1) { + * int res = ws.send("WebSocket Hello World!"); + * + * if (ws.read(recv)) { + * printf("rcv: %s\r\n", recv); + * } + * + * wait(0.1); + * } + * } + * @endcode + */ + +class Websocket +{ + public: + + /* + * Prepare message get from mailbox + * + * + */ + static void ReceiveMessage(char * dados){ haveMessage = true; captureMessage = dados; } + + /* + * Get status of connection + * + * + */ + static bool wsIsConnected(); + + + /** + * Thread to start Websocket + * + */ + static void Websocket_Thread(void const *arg); + + /** + * Constructor + * + * @param url The Websocket url in the form "ws://ip_domain[:port]/path" (by default: port = 80) + */ + Websocket(char const * url); + + /** + * Connect to the websocket url + * + *@return true if the connection is established, false otherwise + */ + bool connect(); + + /** + * Send a string according to the websocket format (see rfc 6455) + * + * @param str string to be sent + * + * @returns the number of bytes sent + */ + int send(char * str); + + /** + * Read a websocket message + * + * @param message pointer to the string to be read (null if drop frame) + * + * @return true if a websocket frame has been read + */ + bool read(char * message); + + /** + * To see if there is a websocket connection active + * + * @return true if there is a connection active + */ + bool is_connected(); + + /** + * Close the websocket connection + * + * @return true if the connection has been closed, false otherwise + */ + bool close(); + + /* + * Accessor: get path from the websocket url + * + * @return path + */ + char* getPath(); + + private: + + void fillFields(char const * url); + int parseURL(const char* url, char* scheme, size_t maxSchemeLen, char* host, size_t maxHostLen, uint16_t* port, char* path, size_t maxPathLen); //Parse URL + int sendOpcode(uint8_t opcode, char * msg); + int sendLength(uint32_t len, char * msg); + int sendMask(char * msg); + int readChar(char * pC, bool block = true); + + char scheme[8]; + uint16_t port; + char host[32]; + char path[64]; + + TCPSocketConnection socket; + + int read(char * buf, int len, int min_len = -1); + int write(char * buf, int len); + + static char * captureMessage; + static bool haveMessage; + static bool isConect; + +}; + +#endif
diff -r 000000000000 -r 6d4dbf28d4ee WebsocketCaptureMonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebsocketCaptureMonitor.cpp Wed Apr 19 21:26:46 2017 +0000 @@ -0,0 +1,246 @@ +#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(); +} \ No newline at end of file
diff -r 000000000000 -r 6d4dbf28d4ee WebsocketCaptureMonitor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebsocketCaptureMonitor.h Wed Apr 19 21:26:46 2017 +0000 @@ -0,0 +1,34 @@ +#include "mbed.h" +#include "rtos.h" +#include "EventDetector.h" +#include "Websocket.h" +#include "EthernetInterface.h" +#include "Settings.h" + +extern void WebsocketCaptureMonitor_Thread(void const *arg); + +class WebsocketCaptureMonitor +{ + public: + /** + * Thread to start Websocket Capture Monitor + * + */ + static void WebsocketCaptureMonitor_Thread(void const *arg); + + /* + * Prepare message get from mailbox + * + * + */ + static void PrepareMessage(CaptureEvent* dados,char *strfinal, bool isWS); + + /* + * Send data + * + * + */ + + static void DoPost(TCPSocketConnection sock, char *host, CaptureEvent* dados); + +};