teste de publish

Dependencies:   DS1820 HighSpeedAnalogIn devices mbed

Revision:
7:ae9c47f62946
Parent:
6:d4ebbaaba295
Child:
8:9f8ad3dbeb87
--- a/modem.cpp	Thu Jun 15 12:50:58 2017 +0000
+++ b/modem.cpp	Tue Jul 11 11:55:56 2017 +0000
@@ -42,14 +42,14 @@
     uint16_t numeroByteSendoEnviado;
 
     sprintf(aux,"AT+CIPSEND=%u,%lu\r\n",sId,bufferLength);    
-    if(modemCom::sendToModem(aux,1,&modemCom::status.PROMPT_ENVIO_COMMAND_MODE,2000,10)) {    
+    if(modemCom::sendToModem(aux,1,&modemCom::status.PROMPT_ENVIO_COMMAND_MODE,NULL,300,10,1)) {    
         for(numeroByteSendoEnviado = 0; numeroByteSendoEnviado<bufferLength; numeroByteSendoEnviado++) {            
             modem.printf("%c",buffer[numeroByteSendoEnviado]);            
             #ifdef xereta_modem
                 pc.printf("%c",buffer[numeroByteSendoEnviado]);
             #endif
         }        
-        numeroByteSendoEnviado = modemCom::sendToModem(NULL,1,&modemCom::status.SEND_OK,5000,1);
+        numeroByteSendoEnviado = modemCom::sendToModem(NULL,1,&modemCom::status.SEND_OK,NULL,500,1,1);
     }else{
         numeroByteSendoEnviado = false;   //Reaproveitando numeroByteSendoEnviado para resultado de retorno
      }
@@ -59,7 +59,7 @@
 void modemCom::leMAC(void)
 {
     char *ptr;    
-    if(modemCom::sendToModem("AT+CIPSTAMAC?\r\n",1,&modemCom::status.OK,250,20)){
+    if(modemCom::sendToModem("AT+CIPSTAMAC?\r\n",1,&modemCom::status.modemResponse,NULL,250,20,1)){
         //resposta: +CIPSTAMAC:"18:fe:34:f4:5f:c4"
         ptr = strtok(bufModem.getRowBuffer(),"\"");
         ptr = strtok(NULL,"\"");
@@ -70,19 +70,7 @@
     }
 }
 
-bool modemCom::getSocketInfo(uint8_t sId){
-    bool retorno=false;
-    sId++; //Para transformar de indice C para o índice usado no modem;
-    switch(sId){
-        case 1:
-                retorno=modemCom::sendToModem("AT#SI=1\r",1,&modemCom::status.OK,300,1);
-            break;    
-        case 2:
-                retorno=modemCom::sendToModem("AT#SI=2\r",1,&modemCom::status.OK,300,1);
-            break;                
-    }
-    return retorno;
-}
+
 
 bool modemCom::writeStatusToSD(void){
     char aux[30];
@@ -97,9 +85,7 @@
     sprintf(aux,";imsi=%s}log",modemCom::status.MAC);    
     sdCardBuf.fill(aux,strlen(aux));
     
-    if(!sdCard::arquivoAberto()){
-        sdCard::insereDadosArquivo(&sdCard::armazenamento,sdCardBuf.get(),sdCardBuf.getLength());
-    }
+    return sdCard::insereDadosArquivo(&sdCard::armazenamento,sdCardBuf.get(),sdCardBuf.getLength());    
 }
 
 bool modemCom::montaStatus(void)
@@ -127,9 +113,7 @@
                 pc.printf("Nao foi possivel preparar o envio.\n");
                 return false;                
             }
-            if(sdCard::envio.bytes==0) {
-                sdCard::getFileTam(&sdCard::envio);
-            }
+            sdCard::getFileTam(&sdCard::envio);            
             pc.printf("Preparado o envio do arquivo com %lu bytes.\n",sdCard::envio.bytes);
             break;
         case dadosStatus:
@@ -185,13 +169,16 @@
     if(arquivo->bytes==0){
         
         if((!sdCard::getFileTam(arquivo))||(arquivo->bytes == 0)){
+            if(arquivo->bytes == 0){
+                sdCard::excluiArquivo(arquivo);    
+            }            
             return false;    
         }
     }
     
     pc.printf("Abrindo o socket em <%s>.\n",host);
     sprintf(header,"AT+CIPSTART=1,\"TCP\",\"%s\",80\r\n",host);
-    if(modemCom::sendToModem(header,1,&modemCom::status.OK,20000,2)) {
+    if(modemCom::sendToModem(header,1,&modemCom::status.OK,NULL,20000,1,1)) {
         modemCom::status.NO_CARRIER=0; //Socket Aberto!
         pc.printf("Aberto o socket em command mode.\n");
         pc.printf("Enviando arquivo com nome %s.\n",arquivo->nome);
@@ -211,7 +198,7 @@
     pc.printf("Iniciando o envio do arquivo de %lu bytes\nnumeroDePartes = %lu\nrestoDoEnvio = %lu\n",arquivo->bytes,numeroDePartes,restoDoEnvio);
     
     if(!sdCard::abreArquivo(arquivo,"r")){
-        pc.printf("Nao foi posssivel abrir o arquivo de dentro da funcao sendFileCommandMode().\n");
+        pc.printf("Nao foi posssivel abrir o arquivo de dentro da funcao postFileCommandMode().\n");
         modemCom::status.emComunicacao = false;
         return 0;
     }        
@@ -232,8 +219,8 @@
     headerTam = strlen(header);
 
     sprintf(aux,"AT+CIPSEND=1,%u\r\n",headerTam);
-    if(modemCom::sendToModem(aux,1,&modemCom::status.PROMPT_ENVIO_COMMAND_MODE,100,10)) {
-        if(!modemCom::sendToModem(header,1,&modemCom::status.SEND_OK,1000,1)) {            
+    if(modemCom::sendToModem(aux,1,&modemCom::status.PROMPT_ENVIO_COMMAND_MODE,NULL,100,10,1)) {
+        if(!modemCom::sendToModem(header,1,&modemCom::status.SEND_OK,NULL,1000,1,1)) {            
             sdCard::fechaArquivo(arquivo);
             modemCom::status.emComunicacao = false;
             pc.printf("Cabecalho http nao enviado.\n");
@@ -255,7 +242,7 @@
         passaParaProximaParte = false;
         while((maxTentativas)&&(!passaParaProximaParte)) {
             sprintf(aux,"AT+CIPSEND=1,%u\r\n",numeroDeBytesPorEnvio);
-            if(modemCom::sendToModem(aux,1,&modemCom::status.PROMPT_ENVIO_COMMAND_MODE,100,20)) {
+            if(modemCom::sendToModem(aux,1,&modemCom::status.PROMPT_ENVIO_COMMAND_MODE,NULL,100,20,1)) {
                 if(maxTentativas!=maxRetentativasEnvioParteArquivo) {
                     //Estou realizando reenvio desta parte logo preciso fazer fseek para a quantidade de bytes do envio anterior
                     fseek(arquivo->fp,-numeroDeBytesPorEnvio,SEEK_CUR);
@@ -269,7 +256,7 @@
                     #endif
                 }
 
-                if(modemCom::sendToModem(NULL,1,&modemCom::status.SEND_OK,5000,1)) {
+                if(modemCom::sendToModem(NULL,1,&modemCom::status.SEND_OK,NULL,5000,1,1)) {
                     diversos::progressBar(parteSendoEnviada,numeroDePartes);
                     //Preciso verificar se o buffer esvaziou. Se deu "flush"
                     //if(modemCom::aguardaFlush(0)==1) {
@@ -307,7 +294,7 @@
     maxTentativas = maxRetentativasEnvioParteArquivo;
     while((maxTentativas)&&(!passaParaProximaParte)) {
         sprintf(aux,"AT+CIPSEND=1,%u\r\n",restoDoEnvio+strlen("\r\n--xxBOUNDARYxx--\r\n\r\n")); //Para incluir "\n--xxBOUNDARYxx--\n\n" no fim da msg http
-        if(modemCom::sendToModem(aux,1,&modemCom::status.PROMPT_ENVIO_COMMAND_MODE,100,3)) {
+        if(modemCom::sendToModem(aux,1,&modemCom::status.PROMPT_ENVIO_COMMAND_MODE,NULL,100,3,1)) {
             for(numeroByteSendoEnviado=0; numeroByteSendoEnviado<restoDoEnvio; numeroByteSendoEnviado++) {
                 //Envio os bytes aqui! Menos o ultimo para ter o check;
                 c = fgetc(arquivo->fp);
@@ -316,7 +303,7 @@
                     pc.printf("%c",c);
                 #endif
             }
-            if(modemCom::sendToModem("\r\n--xxBOUNDARYxx--\r\n\r\n",1,&modemCom::status.SEND_OK,5000,1)) {
+            if(modemCom::sendToModem("\r\n--xxBOUNDARYxx--\r\n\r\n",1,&modemCom::status.SEND_OK,NULL,5000,1,1)) {
                 if(numeroDePartes) {
                     diversos::progressBar(parteSendoEnviada,numeroDePartes);
                 }                
@@ -337,7 +324,7 @@
             }
         } else {
             maxTentativas--;
-            modemCom::sendToModem("AT\r\n",1,&modemCom::status.OK,1000,100);            
+            modemCom::sendToModem("AT\r\n",1,&modemCom::status.OK,NULL,1000,100,1);            
         }
     }
 
@@ -349,7 +336,7 @@
     }
 
     //Logica de timeout esperando confirmação modemCom::status.ServerAck 20 segundos
-    parteSendoEnviada = 600;    
+    parteSendoEnviada = 200;    
     while((parteSendoEnviada)&&(!modemCom::status.ServerAck)&&(!modemCom::status.NO_CARRIER)) {
         osDelay(100);
         parteSendoEnviada--;
@@ -364,57 +351,65 @@
     return modemCom::status.ServerAck;
 }
 
-uint8_t modemCom::sendToModem(char *string,uint8_t confirmado,char *codigoConfirmacao,uint16_t timeOut,uint8_t maxTentativas)
+uint8_t modemCom::sendToModem(char *string,uint8_t confirmado,char *codigoConfirmacao,char *stringConfirmacao,uint16_t timeOut,uint8_t maxTentativas,uint16_t delayEntreTentativas)
 {
     uint16_t timeOutProcesso;
     uint16_t indexString,strLen; //Para exibir retentativas!
-    led3=1;
+    
     while(maxTentativas){
         timeOutProcesso=timeOut;
-        //UARTSend(2,string,strlen(string));
+        
+        
+        bufModem.del(); //Deletando o buffer antes de iniciar envio
+        
         if(string!=NULL) {
-            modem.puts(string);
-#ifdef xereta_modem
-            //DebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebug
-            pc.printf("Sai pro modem <%s>\n",string); //Enviando na serial PC para debug
-#endif
+            modem.puts(string);            
+            #ifdef xereta_modem
+                pc.printf("Sai pro modem <%s>\n",string); //Enviando na serial PC para debug
+            #endif            
         }
-        if(confirmado==1){
-            *codigoConfirmacao=0;
+        if(confirmado==1){           
             modemCom::status.ERROR=0;
-            while((timeOutProcesso)&&(!(*codigoConfirmacao))&&(!modemCom::status.ERROR)) {
-                osDelay(5); //timeOut em mS
-                timeOutProcesso--;
+            modemCom::status.busy=0;
+            
+            if(codigoConfirmacao!=NULL){
+                *codigoConfirmacao=0;
+                while((timeOutProcesso)&&(!(*codigoConfirmacao))&&(!modemCom::status.ERROR)&&(!modemCom::status.busy)){
+                    osDelay(5); //timeOut em mS
+                    timeOutProcesso--;
+                }
+            }else{
+                    while((timeOutProcesso)&&(!modemCom::status.ERROR)&&(!modemCom::status.busy)&&(!strstr(bufModem.getRowBuffer(),stringConfirmacao))) {
+                        osDelay(1); //timeOut em mS
+                        timeOutProcesso--;
+                    }
+                }
+            if(modemCom::status.ERROR||modemCom::status.busy) {
+                osDelay(1000);//espera 1S
             }
-            if(modemCom::status.ERROR||modemCom::status.busy) {
-                osDelay(1000);//espera 0.1S
-            }
-
-#ifdef xereta_modem
-            //DebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebugDebug
-            pc.printf("Vem do modem <%s>\n",bufModem.getRowBuffer());
-#endif
-            if(*codigoConfirmacao==1) {
-                led3=0;
+            
+            if(timeOutProcesso) {                
                 return maxTentativas;                
-            }            
+            }                                    
+            
             strLen = strlen(string);
-            pc.printf("Erro em sendToModem codigo <%s> Retentativa de envio da string <",bufModem.getRowBuffer());
             for(indexString=0; indexString<(strLen-1); indexString++) {
                 pc.putc(string[indexString]);
             }
-            pc.printf("> maxTentativas = %lu.\n",maxTentativas);
+            #ifdef xereta_modem
+                pc.printf("> maxTentativas = %lu.\n",maxTentativas);
+            #endif
         }    
-        maxTentativas--;    
-    }
-    led3=0;
+        maxTentativas--;
+        osDelay(delayEntreTentativas);    
+    }    
     return 0;
 }
 
 bool modemCom::closeConnection(uint8_t id){
     char command[20];
     sprintf(command,"AT+CIPCLOSE=%u\r\n",id);
-    return modemCom::sendToModem(command,1,&modemCom::status.CLOSED,500,5);
+    return modemCom::sendToModem(command,1,&modemCom::status.OK,NULL,500,3,1);
 }
 
 char modemCom::cipSend(uint8_t connID,char *buffer,uint16_t len){
@@ -425,7 +420,7 @@
     }
     printf("conteudo de cipsend.<");
     sprintf(aux,"AT+CIPSENDEX=%u,%lu\r\n",connID,len);
-    if(sendToModem(aux,1,&modemCom::status.OK,500,1)){        
+    if(sendToModem(aux,1,&modemCom::status.OK,NULL,500,1,1)){        
         for(i=0;i<len;i++){
             modem.putc(buffer[i]);
             pc.putc(buffer[i]);    
@@ -434,7 +429,7 @@
         return 0;            
     }
     printf(">\r\n");
-    if(sendToModem("",1,&modemCom::status.SEND_OK,2000,1)){
+    if(sendToModem("",1,&modemCom::status.SEND_OK,NULL,2000,1,1)){
         return 1;
     }
     return 2;
@@ -442,9 +437,9 @@
 
 void modemCom::webServer(void){
     char buf[512];
-    char auxMsg[50];
+    //char auxMsg[50];
     bool encontrado=0;
-    uint32_t aux_int;
+    //uint32_t aux_int;
     
     
     
@@ -471,11 +466,9 @@
         encontrado = 1;
     }
         
-    if(strstr(bufInPtr,"configRede.htm")){
-        
-        
+    if(strstr(bufInPtr,"configRede.htm")){        
         //Pegando o IP
-        sendToModem("AT+CIFSR\r\n",1,&modemCom::status.OK,200,1);        
+        modemCom::leIP();        
         //sprintf(buf,"<script>window.location.href = 'http://www.vitaesolucoes.com.br/controladorawifi/config.php?ip=%s'</script>",modemStatus.STAIP);
         
         //sprintf(buf,"<!DOCTYPE html><form action='cwjap.htm' method='GET'><fieldset><legend>Parametros de Configuracao da rede:</legend>SSID WiFi:<br><input type='text' name='ssid' value=''><br>Senha WiFi:<br><input type='text' name='password' value=''><br>IP:(0 para DHCP)<br><input type='text' name='ip' value='0'><br>Porta:<br><input type='text' name='port' value=''><br><input type='submit' value='Configurar'></fieldset></form>");
@@ -552,7 +545,7 @@
     
     
     if(strstr(bufInPtr,"lecomandocontrole.htm")){        
-        led2=1;
+        
         uint16_t timeout = 5000;
         IrDetect.reset();
         IrDetect.start();
@@ -567,9 +560,7 @@
             }
          }
         IrDetect.stop();
-
-        encontrado = 1;
-        led2=0;
+        encontrado = 1;        
     }
     
     if(!encontrado){        
@@ -587,7 +578,7 @@
     
     if(mudaRede){            
         mudaRede = false;
-        modemCom::sendToModem("AT+CIPSERVER=0\r\n",1,&modemCom::status.OK,2000,1);        
+        modemCom::sendToModem("AT+CIPSERVER=0\r\n",1,&modemCom::status.OK,NULL,2000,1,1);        
         pc.printf("Mudando para rede:\r\nSSID:%s\r\nPASSWORD:%S\r\nPORTA:%s\r\n\r\n",modemCom::status.ssid,modemCom::status.password,modemCom::status.port);
         if(sdCard::abreArquivo(&sdCard::config,"w")){
             pc.printf("Guardando config.\r\n");
@@ -598,6 +589,19 @@
     }
 }
 
+bool modemCom::leIP(void){    
+    char *ptr;    
+    sendToModem("AT+CIFSR\r\n",1,NULL,"+CIFSR:STAIP,",200,1,1);
+    ptr=strstr(modemCom::bufIn,"+CIFSR:STAIP,");
+    if(ptr) {        
+        ptr = strtok(ptr,"\"");
+        ptr = strtok(NULL,"\"");
+        strcpy(modemCom::status.STAIP,ptr);
+    }
+    if(strstr(modemCom::status.STAIP,"0.0.0.0")){return false;}
+    return true;    
+}
+
 int16_t modemCom::getRSSI(void){
     /*char *ptr;
     int16_t RSSI = 0;
@@ -612,6 +616,19 @@
     return RSSI;*/
     return -50;
 }
+
+bool modemCom::verificaConexao(void){
+    uint8_t i = 1;
+    while(i){
+        if(!modemCom::sendToModem("AT+CWJAP?\r\n",1,NULL,"+CWJAP:",100,10,1000)){
+            modemCom::conectaWiFi();
+            i--;    
+        }else{
+            return true;
+         }
+    }    
+    return false;
+}
     
 void modemCom::conectaWiFi(void){
     //Função para mudança de rede
@@ -649,101 +666,83 @@
         pc.printf("Lidos os parametros de configuracao de wifi como sendo:\r\nSSID:<%s>\r\nPASSWORD:<%s>\r\nPORT:<%s>\r\n\r\n",modemCom::status.ssid,modemCom::status.password,modemCom::status.port);        
         pc.printf("Iniciando conexao wifi.\r\n");        
     }else{
-            strcpy(modemCom::status.ssid,"VSA");
+            strcpy(modemCom::status.ssid,"VSE");
             strcpy(modemCom::status.password,"vitaeBBYP");
-            strcpy(modemCom::status.port,"80");
+            strcpy(modemCom::status.port,"4000");
          }           
         
         //Mudando mode para AP e Station
-        if(modemCom::sendToModem("AT+CWMODE=3\r\n",1,&modemCom::status.OK,10000,1)) {
+        if(modemCom::sendToModem("AT+CWMODE=3\r\n",1,&modemCom::status.OK,NULL,10000,1,1)) {
             pc.printf("Modo AP+STATION aceito.\n");
         }
         
         //AT+CWJAP=\"\",\"\"\r\n
         sprintf(aux,"AT+CWJAP=\"%s\",\"%s\"\r\n",modemCom::status.ssid,modemCom::status.password);
-        if(modemCom::sendToModem(aux,1,&modemCom::status.OK,10000,1)) {
+        if(modemCom::sendToModem(aux,1,&modemCom::status.OK,NULL,10000,1,1)) {
             pc.printf("WiFi Conectado.\n");
         }
             
         //AT+CIPSERVER=1,80
-        if(modemCom::sendToModem("AT+CIPMUX=1\r\n",1,&modemCom::status.OK,250,4)) {
+        if(modemCom::sendToModem("AT+CIPMUX=1\r\n",1,&modemCom::status.OK,NULL,250,4,1)) {
             pc.printf("Recebeu o comando AT+CIPMUX=1.\n");
         }
         
         //AT+CIPSERVER=1,80
         sprintf(aux,"AT+CIPSERVER=1,%s\r\n",modemCom::status.port);
-        if(modemCom::sendToModem(aux,1,&modemCom::status.OK,250,4)) {
+        if(modemCom::sendToModem(aux,1,&modemCom::status.OK,NULL,250,4,1)) {
             pc.printf("Recebeu o comando <%s>.\n",aux);
         }
     
-        if(modemCom::sendToModem("AT+CIPSTO=60\r\n",1,&modemCom::status.OK,250,4)) {
+        if(modemCom::sendToModem("AT+CIPSTO=60\r\n",1,&modemCom::status.OK,NULL,250,4,1)) {
             pc.printf("Recebeu o comando AT+CIPSTO=60.\n");
         }        
         
         sprintf(aux,"AT+CWSAP_CUR=\"DROME_WIFI_%s\",\"VsaDROME\",5,3\r\n",modemCom::status.MAC);
-        if(modemCom::sendToModem(aux,1,&modemCom::status.OK,250,4)) {
+        if(modemCom::sendToModem(aux,1,&modemCom::status.OK,NULL,250,4,1)) {
             pc.printf("Recebeu o comando %s.\n",aux);
         }
 
         
-        if(modemCom::sendToModem("AT+CIPAP_CUR=\"192.168.4.1\",\"192.168.4.1\",\"255.255.255.0\"\r\n",1,&modemCom::status.OK,250,4)) {
+        if(modemCom::sendToModem("AT+CIPAP_CUR=\"192.168.4.1\",\"192.168.4.1\",\"255.255.255.0\"\r\n",1,&modemCom::status.OK,NULL,250,4,1)) {
             pc.printf("Recebeu o comando AT+CIPAP_CUR=\"192.168.4.1\",\"192.168.4.1\",\"255.255.255.0\".\n");
         }    
         
-        if(modemCom::sendToModem("AT+CWDHCP_CUR=2,1\r\n",1,&modemCom::status.OK,250,4)) {
+        if(modemCom::sendToModem("AT+CWDHCP_CUR=2,1\r\n",1,&modemCom::status.OK,NULL,250,4,1)) {
             pc.printf("Recebeu o comando AT+CWDHCP_CUR=2,1.\n");
         }
 
 }
 
 void modemCom::processaPacote(void const *args){
-    char *ptr,*scanPtr;        
-    bool naoCompreendido=true;
+    char *ptr,*scanPtr;            
     uint16_t bufInLength = bufModem.getLength();
-    modemCom::bufIn = bufModem.get();    
-    
-    //pc.printf("Entrada do modem<\n\n%s\n\n>\n",modemCom::bufIn);
+    uint16_t timeOut;
+    modemCom::bufIn = bufModem.get();
     
-    /*
-    if(modemCom::exibeEntradaPacote){
-        modemCom::exibeEntradaPacote=false;
-        pc.printf("Lido entrada Pacote modem<%s>.\n",modemCom::bufIn);        
-    }
-    */
+    modemCom::status.modemResponse=true;
+    
+    //pc.printf("Vem do modem <%s>.\r\n",modemCom::bufIn);    
     
-    //Reconhecendo GET HTTP e atendendo com um servidor web    
-    if(strstr(modemCom::bufIn,"GET /") && strstr(modemCom::bufIn,"HTTP/1.1")){
-        ptr=strstr(modemCom::bufIn,"GET /");
-        if(ptr) {
-            naoCompreendido=false;
-            ptr = strtok(ptr,"/");
-            ptr = strtok(NULL," ");
-            bufInPtr = ptr;        
-            modemCom::atendendoWebServer = true;            
-            //osSignalSet(idThreadComunicacoes, 0x1);        
-            
+    if(strstr(modemCom::bufIn,"WIFI")==NULL){    
+        //Buscando connect
+        if(!modemCom::atendendoWebServer){
+            ptr=strstr(modemCom::bufIn,"CONNECT\r\n");
+            //if(strstr(modemCom::bufIn,"WIFI")){ptr=NULL;}
+            if(ptr) {
+                ptr = strtok(modemCom::bufIn,",");
+                connID = atoi(ptr);                                    
+                modemCom::status.serverConnected=1;        
+                pc.printf("Recebido string CONNECT socket na conexao %u.\n",connID);
+                if(!modemCom::status.emComunicacao){                            
+                    pc.printf("Atendendo socket entrante na conexao %u.\n",connID);
+                    modemCom::status.SRINGsockEntrante = true;
+                }
+                modemCom::status.emComunicacao=true;
+                modemCom::bufIn = strtok(NULL,"");
+            }    
         }
     }
     
-    //Buscando connect
-    if(!modemCom::atendendoWebServer){
-        ptr=strstr(modemCom::bufIn,"CONNECT\r\n");
-        if(ptr) {
-            ptr = strtok(modemCom::bufIn,",");
-            connID = atoi(ptr);                        
-            naoCompreendido=false;
-            modemCom::status.serverConnected=1;        
-            pc.printf("Recebido string CONNECT socket na conexao %u.\n",connID);
-            if(!modemCom::status.emComunicacao){            
-                //Preciso saber se é decorrente de uma chamada minha ou se é uma entrada de socket.            
-                pc.printf("Atendendo socket entrante na conexao %u.\n",connID);
-                modemCom::status.SRINGsockEntrante = true;
-            }
-            modemCom::status.emComunicacao=true;
-            modemCom::bufIn = strtok(NULL,NULL);
-        }    
-    }
-    
     IPDNumBytes = 0;
     ptr = strstr(modemCom::bufIn,"+IPD");
     if(ptr!=NULL){
@@ -756,54 +755,51 @@
         ptr = strtok(NULL,":");    //Pegando o numero de caracteres IPD
         IPDNumBytes = atoi(ptr);
         
-        modemCom::bufIn = strtok(NULL,NULL);
+        modemCom::bufIn = strtok(NULL,"");
         
-        printf("Recebido pacote via conexao %u com %lu bytes.\n",connID,IPDNumBytes);
+        //printf("Recebido pacote via conexao %u com %lu bytes.\n",connID,IPDNumBytes);
         
     }
     
-    if(modemCom::atendendoWebServer){
-        return;    
+    //Reconhecendo GET HTTP e atendendo com um servidor web    
+    if(strstr(modemCom::bufIn,"GET /") && strstr(modemCom::bufIn,"HTTP/1.1")){
+        ptr=strstr(modemCom::bufIn,"GET /");
+        if(ptr) {            
+            ptr = strtok(ptr,"/");
+            ptr = strtok(NULL," ");
+            bufInPtr = ptr;        
+            modemCom::atendendoWebServer = true;            
+        }
     }
     
-    //printf("Sobrou pacote <%s>.\n\n",modemCom::bufIn);
-    //uint8_t i;
-
-    
-    
     ptr=strstr(modemCom::bufIn,"*ServerAck*");
-    if(ptr) {
-        naoCompreendido=false;
-        modemCom::status.ServerAck=1;
-        pc.printf("SERVER RESPONSE\n%s\n\n",modemCom::bufIn);
+    if(ptr) {        
+        modemCom::status.ServerAck=1;        
     }        
     
     ptr=strstr(modemCom::bufIn,"*ServerCommand*");
-    if(ptr) {
-        naoCompreendido=false;
+    if(ptr) {        
         scanPtr = strtok (ptr,"\\");
-        scanPtr = strtok (NULL,">");
-        //modemCom::status.ServerCommand=1;
+        scanPtr = strtok (NULL,">");        
         strcpy(commands::buffer,scanPtr);
         pc.printf("Comandos <%s>.\n",commands::buffer);
         executaComandoServer = true;
-        //Se devo executar comando tenho que sair imediatamente.
-        return;
     }
     
     //if(modemCom::status.recebendoArquivoDoServer){
-    if(IPDNumBytes && modemCom::status.recebendoArquivoDoServer && (strstr(modemCom::bufIn,"CONNECT")==NULL) && (strstr(modemCom::bufIn,"*ServerCommand*")==NULL) ){        
-        //Appenda bufIn no devicescfg        
-        //sdCard::insereDadosArquivo(&sdCard::devices,modemCom::bufIn,bufInLength);
+    if(IPDNumBytes && modemCom::status.recebendoArquivoDoServer && (strstr(modemCom::bufIn,"CONNECT")==NULL) && (strstr(modemCom::bufIn,"*ServerCommand*")==NULL) ){
         sdCard::insereDadosArquivo(&sdCard::tempFile,modemCom::bufIn,IPDNumBytes);
-        osDelay(250);
+        //modemCom::status.timeOut=100;        
         
-        
-        modemCom::status.timeOut=100;        
+        bufModem.del();
         
         sprintf(modemCom::bufIn,"AT+CIPSEND=%u,%lu\r\n",connID,10);
         modem.puts(modemCom::bufIn);
-        osDelay(100);
+        timeOut = 5000;
+        while(timeOut && (strstr(bufModem.getRowBuffer(),">")==NULL)){
+            osDelay(1);
+            timeOut--;
+        }
         modem.puts("sendData\r\n");
         pc.printf("sendData\n");
         return;
@@ -811,10 +807,9 @@
     
     //Reconhecimento dos status
     modemCom::status.PROMPT_ENVIO_COMMAND_MODE=0;
-
     ptr=strstr(modemCom::bufIn,"> ");
     if(ptr) {
-        naoCompreendido=false;
+        
         modemCom::status.serverConnected=1;
         modemCom::status.commandMode=1;
         modemCom::status.NO_CARRIER=0;
@@ -822,176 +817,47 @@
     }
 
     modemCom::status.OK=0;
-
     ptr=strstr(modemCom::bufIn,"OK\r");
-    if(ptr) {
-        naoCompreendido=false;
+    if(ptr) {        
         modemCom::status.OK=1;
-    }    
-    
-    
-    ptr=strstr(modemCom::bufIn,"+CIFSR:STAIP,");
-    if(ptr) {
-        naoCompreendido=false;
-        ptr = strtok(ptr,"\"");
-        ptr = strtok(NULL,"\"");
-        strcpy(modemCom::status.STAIP,ptr);
-    }
+    }        
 
     modemCom::status.busy=false;
     ptr=strstr(modemCom::bufIn,"busy s...");
     if(ptr) {
-        naoCompreendido=false;
+        
         modemCom::status.busy=1;
     }
     
     modemCom::status.SEND_OK=0;
     ptr=strstr(modemCom::bufIn,"SEND OK");
     if(ptr) {
-        naoCompreendido=false;
+        
         modemCom::status.SEND_OK=1;
     }
 
-    ptr=strstr(modemCom::bufIn,"#SGACT: 1,");
-    if(ptr) {
-        naoCompreendido=false;
-        if(ptr[10]=='1') {
-            modemCom::status.associated=1;
-        }
-        if(ptr[10]=='0') {
-            modemCom::status.associated=0;
-        }
-    } else {
-
-        ptr=strstr(modemCom::bufIn,"#SGACT: ");
-        if(ptr) {
-            naoCompreendido=false;
-            modemCom::status.associated=1;
-            scanPtr = strtok (ptr," ");
-            scanPtr = strtok (NULL,"\r");
-            if(scanPtr) {
-                strcpy(modemCom::status.modemIP,scanPtr);
-            }
-        }
-    }
-
-
-    ptr=strstr(modemCom::bufIn,"+CGPADDR: 1,");
-    if(ptr) {
-        naoCompreendido=false;
-        scanPtr = strtok (ptr,"\"");
-        scanPtr = strtok (NULL,"\"");
-        if(scanPtr) {
-            strcpy(modemCom::status.modemIP,scanPtr);
-        }
-    }
-
-
-    //#PING: 01,"187.45.195.188",5,54
-    ptr=strstr(modemCom::bufIn,"#PING: ");
-    if(ptr) {
-        naoCompreendido=false;
-        scanPtr = strtok (ptr,"\"");
-        scanPtr = strtok (NULL,"\"");
-        if(scanPtr) {
-            strcpy(modemCom::status.serverIP,scanPtr);
-            modemCom::status.serverIP[16]=1;
-            modemCom::status.ping=1;
-        }
-    }
-
-
-    //SocketBufferPendent?
-    //#SI: 1,123,400,10,50
-
-    ptr=strstr(modemCom::bufIn,"#SI: ");
-    if(ptr) {        
-        //uint8_t connId;        
-        naoCompreendido=false;     
-        
-        //Descartando "#SI: "   
-        scanPtr = strtok (ptr," ");
-        
-        //Capturando connId
-        scanPtr = strtok (NULL,",");        
-        connID = atoi(scanPtr);
-        connID--; //Para transformar em indice de linguagem C que começa em zero;        
-        
-        //capturando sent
-        scanPtr = strtok (NULL,",");
-        modemCom::status.socketInfo[connID].sent = atoi(scanPtr);
-        
-        //capturando received
-        scanPtr = strtok (NULL,",");
-        modemCom::status.socketInfo[connID].received = atoi(scanPtr);
-        
-        //capturando buff_in
-        scanPtr = strtok (NULL,",");
-        modemCom::status.socketInfo[connID].buff_in = atoi(scanPtr);
-        
-        //capturando ack_waiting
-        scanPtr = strtok (NULL,",");
-        modemCom::status.socketInfo[connID].ack_waiting = atoi(scanPtr);
-    }
-
-
     modemCom::status.ERROR=0;
     ptr=strstr(modemCom::bufIn,"ERROR");
     if(ptr) {
-        naoCompreendido=false;
+        
         modemCom::status.ERROR=1;
         modemCom::status.OK=0;
+    }    
+    ptr=strstr(modemCom::bufIn,"FAIL");
+    if(ptr) {
+        
+        modemCom::status.ERROR=1;
+        modemCom::status.OK=0;
+    }    
+   
+    //modemCom::status.CLOSED=false;    
+    ptr=strstr(modemCom::bufIn,"CLOSED");
+    if(ptr) {
+        
+        modemCom::status.CLOSED=1;
     }
 
-    ptr=strstr(modemCom::bufIn,"HTTP/1.1");
-    if(ptr) {
-        naoCompreendido=false;
-        pc.printf("HTTP RESPONSE\n%s\n\n",modemCom::bufIn);
-    }
     
-    ptr=strstr(modemCom::bufIn,"SRING: 1");
-    if(ptr) {
-        naoCompreendido=false;
-        modem.printf("AT#SRECV=1,1500\r");          
-    }
-        
-    ptr=strstr(modemCom::bufIn,"SRING: 2");
-    if(ptr){
-        naoCompreendido=false;
-        if(!modemCom::status.socketEntranteAtivo){
-         modemCom::status.SRINGsockEntrante=1;    
-         osSignalSet(idThreadComunicacoes, 0x1);   
-        }else{
-            //modem.printf("AT#SRECV=2,1500\r");
-         }
-    }
-    
-
-    ptr=strstr(modemCom::bufIn,"NO CARRIER");
-    if(ptr) {
-        naoCompreendido=false;
-        modemCom::status.serverConnected=0;
-        modemCom::status.commandMode=1;
-        modemCom::status.NO_CARRIER=1;
-        pc.printf("NO CARRIER!!\n");
-    }
-    
-    modemCom::status.CLOSED=false;
-    
-    ptr=strstr(modemCom::bufIn,"CLOSED");
-    if(ptr) {
-        naoCompreendido=false;
-        modemCom::status.CLOSED=1;        
-    }
-
-    if(naoCompreendido) {
-        pc.printf("Mensagem nao compreendida vinda do modem \n ->{\n\n%s\n\n}<-\n",modemCom::bufIn);
-    }   
-    
-    //if(modemCom::status.exibeBufModem){
-    //    modemCom::status.exibeBufModem=false;
-        //pc.printf("Entrada do modem<\n\n%s\n\n>\n",modemCom::bufIn);
-    //} 
 }
 
 uint8_t modemCom::inicializaModem(void)
@@ -1000,25 +866,17 @@
 
     //char config[255];
     //char *ptr;
-    char *buf;
-    buf = bufModem.getRowBuffer();
+    //char *buf;
+    //buf = bufModem.getRowBuffer();
     
     modemCom::timeOutModem = 10;
     modemCom::status.emComunicacao = true;    
 
-    if(modemCom::sendToModem("ATE0\r\n",1,&modemCom::status.OK,1000,10)) {
+    if(modemCom::sendToModem("ATE0\r\n",1,&modemCom::status.OK,NULL,1000,10,1)) {
         pc.printf("Recebeu o comando ATE0.\n");
     }
 
-    modemCom::leMAC();
-
-    
-    
-    /*    
-    if(modemCom::sendToModem("\r",1,&modemCom::status.OK,250,4)) {
-        pc.printf("Recebeu o comando .\n");
-    }
-    */
+    modemCom::leMAC();    
         
     modemCom::status.emComunicacao = false;
     return 1;