Client of WebSocket protocol

Fork of WebSocketClient by Samuel Mokrani

Revision:
8:c9da00db9d33
Parent:
7:4567996414a5
--- a/Websocket.cpp	Fri Feb 08 12:33:04 2013 +0000
+++ b/Websocket.cpp	Fri Feb 24 20:06:49 2017 +0000
@@ -1,7 +1,11 @@
 #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
@@ -14,14 +18,166 @@
 #define ERR(x, ...) 
 #endif
 
-#define INFO(x, ...) printf("[WebSocket : INFO]"x"\r\n", ##__VA_ARGS__); 
+#define INFO(x, ...) printf("[WebSocket : INFO]"x"\r\n", ##__VA_ARGS__);
+
+char * Websocket::captureMessage;
+bool Websocket::haveMessage;
+bool Websocket::isConect;
+bool disconnectedWS = false;
 
-Websocket::Websocket(char * url) {
+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);
 }
 
-void Websocket::fillFields(char * url) {
+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)
   {
@@ -119,7 +275,7 @@
 
     while (socket.connect(host, port) < 0) {
         ERR("Unable to connect to (%s) on port (%d)", host, port);
-        wait(0.2);
+        Thread::wait(200);
         return false;
     }
 
@@ -141,19 +297,18 @@
 
     sprintf(cmd, "Sec-WebSocket-Version: 13\r\n\r\n");
     int ret = write(cmd, strlen(cmd));
-    if (ret != 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);
 
@@ -171,8 +326,8 @@
         close();
         return false;
     }
-
-    INFO("\r\nhost: %s\r\npath: %s\r\nport: %d\r\n\r\n", host, path, port);
+    
+    //INFO("\r\nhost: %s\r\npath: %s\r\nport: %d\r\n\r\n", host, path, port);
     return true;
 }
 
@@ -290,7 +445,7 @@
     if (nb != len_msg)
         return false;
 
-    for (i = 0; i < len_msg; i++) {
+    for (i = 0; (unsigned)i < len_msg; i++) {
         message[i] = message[i] ^ mask[i % 4];
     }
 
@@ -300,10 +455,10 @@
 }
 
 bool Websocket::close() {
-    if (!is_connected())
-        return false;
+    //if (!is_connected())
+        //return false;
 
-    int ret = socket.close();
+    int ret = socket.close(true);
     if (ret < 0) {
         ERR("Could not disconnect");
         return false;
@@ -312,6 +467,7 @@
 }
 
 bool Websocket::is_connected() {
+    isConect = socket.is_connected();
     return socket.is_connected();
 }