teste de publish
Dependencies: DS1820 HighSpeedAnalogIn devices mbed
Diff: modem.cpp
- Revision:
- 0:1c0a769988ee
- Child:
- 1:0e0967c88590
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modem.cpp Fri Mar 24 15:54:41 2017 +0000 @@ -0,0 +1,971 @@ +#include "modem.h" + +modemStatus modemCom::status; +char* modemCom::bufIn; //Ponteiro para buffer de entrada do modem; +uint32_t modemCom::timeOutModem; +bool modemCom::atendendoWebServer; +bool modemCom::exibeEntradaPacote; +int16_t numeroDeBytesPorEnvio; +uint8_t connID; +uint16_t IPDNumBytes; +bool enviaSendData; +char *bufInPtr; +bool mudaRede = false; + +void modemCom::atendeSRING(uint8_t conId){ + pc.printf("Atendendo a conexao entrante.\n"); + modemCom::status.socketEntranteAtivo=true; + modemCom::status.timeOut = 30; + modemCom::timeOutModem = 50; + while(modemCom::status.timeOut||modemCom::status.NO_CARRIER){ + modemCom::status.timeOut--; + /*//Aqui devo perguntar e pedir os dados em buffer + */ + osDelay(100); + } + + //Para parar de colocar dentro do arquivo + modemCom::status.recebendoArquivoDoServer = false; + + modemCom::status.serverConnected=0; + modemCom::timeOutModem = 10; + + //Fechando o socket + modemCom::closeConnection(conId); + modemCom::status.socketEntranteAtivo=false; + modemCom::status.emComunicacao = false; + modemCom::timeOutModem = 10; +} + +bool modemCom::sendBufferCommandMode(uint8_t sId, char *buffer, uint16_t bufferLength){ + char aux[25]; + 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)) { + 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); + }else{ + numeroByteSendoEnviado = false; //Reaproveitando numeroByteSendoEnviado para resultado de retorno + } + return numeroByteSendoEnviado; //Reaproveitando numeroByteSendoEnviado para resultado de retorno +} + +void modemCom::leMAC(void) +{ + char *ptr; + if(modemCom::sendToModem("AT+CIPSTAMAC?\r\n",1,&modemCom::status.OK,250,20)){ + //resposta: +CIPSTAMAC:"18:fe:34:f4:5f:c4" + ptr = strtok(bufModem.getRowBuffer(),"\""); + ptr = strtok(NULL,"\""); + if(ptr) { + strcpy(modemCom::status.MAC,ptr); + pc.printf("Lido MAC <%s>.\n",modemCom::status.MAC); + } + } +} + +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::montaStatus(void) +{ + if(sdCard::abreArquivo(&sdCard::status,"w")) { + fprintf(sdCard::status.fp,"log{status:ip:255.255.255.255;csq:30;imsi:%s}log",modemCom::status.MAC); + sdCard::fechaArquivo(&sdCard::status); + sdCard::exibeArquivo(&sdCard::status); + } else { + return 0; + } + return true; +} + + + +uint8_t modemCom::enviaDados(char tipoDado) +{ + uint8_t result=0; + modemCom::status.emComunicacao = true; + + switch(tipoDado) { + case dadosArmazenados: + if(!sdCard::preparaEnvio()){ + pc.printf("Nao foi possivel preparar o envio.\n"); + return false; + } + if(sdCard::envio.bytes==0) { + sdCard::getFileTam(&sdCard::envio); + } + pc.printf("Preparado o envio do arquivo com %lu bytes.\n",sdCard::envio.bytes); + break; + case dadosStatus: + modemCom::montaStatus(); + break; + } + + switch(tipoDado) { + case dadosArmazenados: + result = modemCom::postFileCommandMode("www.vitaesolucoes.com.br","/drome/Parser/",&sdCard::envio); + break; + case dadosStatus: + result = modemCom::postFileCommandMode("www.vitaesolucoes.com.br","/drome/Parser/",&sdCard::status); + break; + } + + if(!result){ + return result; + } + + //Envia uma string nula e faz o processador esperar a resposta do server! + if(modemCom::status.ServerAck) { + pc.printf("Enviado e recebido resposta do server (*ServerAck*).\n"); + } else { + pc.printf("Enviado mas nao recebido resposta do server (*ServerAck*).\n"); + pc.printf("Conteudo de getRowBuffer <%s>.\n",bufModem.getRowBuffer()); + } + return result; +} + + + +uint8_t modemCom::postFileCommandMode(char *host, char *uri, arquivoSD *arquivo) +{ + #define maxRetentativasEnvioParteArquivo 20 + uint32_t numeroDePartes; + uint16_t restoDoEnvio; + int32_t parteSendoEnviada; + uint16_t numeroByteSendoEnviado; + uint16_t maxTentativas=0; + //unsigned int result; + char header[512]; + char aux[40]; + uint16_t headerTam; + uint32_t dataTam=0; + char c; + bool passaParaProximaParte = false; + + //Para garantir que não seja duvidoso proveniente de outra conexão. + modemCom::status.ServerAck=0; + modemCom::status.NO_CARRIER=0; + + if(arquivo->bytes==0){ + + if((!sdCard::getFileTam(arquivo))||(arquivo->bytes == 0)){ + 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)) { + 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); + modemCom::status.serverConnected=1; + modemCom::timeOutModem = 100; + modemCom::status.emComunicacao = true; + } else { + pc.printf("Nao foi possivel Abrir o socket. Abortando tentativa.\n"); + modemCom::timeOutModem = 10; + return 0; + } + + numeroDePartes = arquivo->bytes / numeroDeBytesPorEnvio; + restoDoEnvio = arquivo->bytes % numeroDeBytesPorEnvio; + + //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"); + modemCom::status.emComunicacao = false; + return 0; + } + + //Monta Header aqui! + sprintf(header,"--xxBOUNDARYxx\nContent-Type: text/plain\nContent-Disposition: form-data; name=\"IMEI\"\n\n%s\n--xxBOUNDARYxx\nContent-Type: application/octet-stream\nContent-Disposition: form-data; name=\"file\"; filename=\"%s\"\n\n",modemCom::status.MAC,arquivo->nome); + + dataTam = strlen(header); + dataTam+=arquivo->bytes; + dataTam+= strlen("\n--xxBOUNDARYxx--"); + //"/drome/parser/index.php" uri drome + sprintf(header,"POST %s HTTP/1.1\nHost: %s\nContent-Type: multipart/form-data; boundary=xxBOUNDARYxx\nContent-Length: %lu\n\n",uri,host,dataTam); + headerTam = strlen(header); //Pego o tamanho parcial para fazer a concatenaçao a fim de predizer o tamanho do post total + + sprintf(&header[headerTam],"--xxBOUNDARYxx\nContent-Type: text/plain\nContent-Disposition: form-data; name=\"IMEI\"\n\n%s\n--xxBOUNDARYxx\nContent-Type: application/octet-stream\nContent-Disposition: form-data; name=\"file\"; filename=\"%s\"\n\n",modemCom::status.MAC,arquivo->nome); + 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)) { + sdCard::fechaArquivo(arquivo); + modemCom::status.emComunicacao = false; + return 0; + } else { + pc.printf("Cabecalho http enviado.\n"); + } + } else { + pc.printf("Erro enviando arquivo.\n"); + sdCard::fechaArquivo(arquivo); + modemCom::status.emComunicacao = false; + return 0; + } + + //Enviando as partes inteiras + maxTentativas = maxRetentativasEnvioParteArquivo; + for(parteSendoEnviada=0; parteSendoEnviada<numeroDePartes; parteSendoEnviada++) { + //Aqui realizo o envio de cada parte. + 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(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); + } + for(numeroByteSendoEnviado=0; numeroByteSendoEnviado<(numeroDeBytesPorEnvio); numeroByteSendoEnviado++) { + c = fgetc(arquivo->fp); + modem.printf("%c",c); + #ifdef xereta_modem + pc.printf("%c",c); + #endif + } + + if(modemCom::sendToModem(NULL,1,&modemCom::status.SEND_OK,5000,1)) { + diversos::progressBar(parteSendoEnviada,numeroDePartes); + //Preciso verificar se o buffer esvaziou. Se deu "flush" + //if(modemCom::aguardaFlush(0)==1) { + //passa pra proxima parte + passaParaProximaParte = true; + maxTentativas = maxRetentativasEnvioParteArquivo; + } else { + maxTentativas--; + if(maxTentativas == 1) { + pc.printf("MaxTentativas dentro de envio das partes == 1, vou aguardar o flush.\n"); + } + if(maxTentativas == 0) { + sdCard::fechaArquivo(arquivo); + modemCom::status.emComunicacao = false; + return 0; + } + } + } else { + pc.printf("Erro enviando o arquivo nao recebeu a tentativa de envio de parte inteira.\n"); + sdCard::fechaArquivo(arquivo); + modemCom::status.emComunicacao = false; + return 0; + } + } + if(!passaParaProximaParte) { + pc.printf("Erro enviando o arquivo nao recebeu a tentativa de envio de parte inteira.\n"); + sdCard::fechaArquivo(arquivo); + modemCom::status.emComunicacao = false; + return 0; + } + } + + //Enviando o resto + passaParaProximaParte = false; + maxTentativas = maxRetentativasEnvioParteArquivo; + while((maxTentativas)&&(!passaParaProximaParte)) { + sprintf(aux,"AT+CIPSEND=1,%u\r\n",restoDoEnvio+19); //Para incluir "\n--xxBOUNDARYxx--\n\n" no fim da msg http + if(modemCom::sendToModem(aux,1,&modemCom::status.PROMPT_ENVIO_COMMAND_MODE,100,3)) { + for(numeroByteSendoEnviado=0; numeroByteSendoEnviado<restoDoEnvio; numeroByteSendoEnviado++) { + //Envio os bytes aqui! Menos o ultimo para ter o check; + c = fgetc(arquivo->fp); + modem.printf("%c",c); + #ifdef xereta_modem + pc.printf("%c",c); + #endif + } + if(modemCom::sendToModem("\n--xxBOUNDARYxx--\n\n",1,&modemCom::status.SEND_OK,5000,1)) { + if(numeroDePartes) { + diversos::progressBar(parteSendoEnviada,numeroDePartes); + } + passaParaProximaParte = true; + pc.printf("\nEnviado o resto do envio com fim de cabecalho!\n",parteSendoEnviada); + modemCom::timeOutModem = 250; + //} + /*else { + pc.printf("Erro enviando arquivo.\n"); + fclose(fp); + *aberto = false; + return 0; + }*/ + } else { + sdCard::fechaArquivo(arquivo); + modemCom::status.emComunicacao = false; + return 0; + } + } else { + maxTentativas--; + modemCom::sendToModem("AT\r\n",1,&modemCom::status.OK,1000,100); + } + } + + if(!passaParaProximaParte) { + pc.printf("Erro enviando o arquivo nao recebeu a tentativa de envio de parte inteira.\n"); + sdCard::fechaArquivo(arquivo); + modemCom::status.emComunicacao = false; + return 0; + } + + //Logica de timeout esperando confirmação modemCom::status.ServerAck 20 segundos + parteSendoEnviada = 600; + while((parteSendoEnviada)&&(!modemCom::status.ServerAck)&&(!modemCom::status.NO_CARRIER)) { + osDelay(100); + parteSendoEnviada--; + } + + modemCom::status.serverConnected=0; + sdCard::fechaArquivo(arquivo); + + //modemCom::sendToModem("AT+CIPCLOSE=1\r\n",1,&modemCom::status.OK,500,3); + modemCom::closeConnection(1); + modemCom::status.emComunicacao = false; + return modemCom::status.ServerAck; +} + +uint8_t modemCom::sendToModem(char *string,uint8_t confirmado,char *codigoConfirmacao,uint16_t timeOut,uint8_t maxTentativas) +{ + uint16_t timeOutProcesso; + uint16_t indexString,strLen; //Para exibir retentativas! + led3=1; + while(maxTentativas){ + timeOutProcesso=timeOut; + //UARTSend(2,string,strlen(string)); + 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 + } + if(confirmado==1){ + *codigoConfirmacao=0; + modemCom::status.ERROR=0; + while((timeOutProcesso)&&(!(*codigoConfirmacao))&&(!modemCom::status.ERROR)) { + osDelay(5); //timeOut em mS + timeOutProcesso--; + } + 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; + 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); + } + maxTentativas--; + } + led3=0; + 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,1); +} + +char modemCom::cipSend(uint8_t connID,char *buffer,uint16_t len){ + char aux[20]; + uint16_t i; + if(!len){ + len = strlen(buffer); + } + printf("conteudo de cipsend.<"); + sprintf(aux,"AT+CIPSENDEX=%u,%lu\r\n",connID,len); + if(sendToModem(aux,1,&modemCom::status.OK,500,1)){ + for(i=0;i<len;i++){ + modem.putc(buffer[i]); + pc.putc(buffer[i]); + } + }else{ + return 0; + } + printf(">\r\n"); + if(sendToModem("",1,&modemCom::status.SEND_OK,2000,1)){ + return 1; + } + return 2; +} + +void modemCom::webServer(void){ + char buf[512]; + char auxMsg[50]; + bool encontrado=0; + uint32_t aux_int; + + + + if(strstr(bufInPtr,"comandos.htm")){ + + //sprintf(buf,"<!DOCTYPE html><html><body><h1>DROME-Seu processo na palma da sua mao!</h1><img src='http://criandoriquezaimagens.s3.amazonaws.com/wp-content/uploads/2014/12/casaPropria.png' width='200' height='210'><br><p><a href='/lecomandocontrole.htm'>Ler comando do controle.</a></p><br></body></html>"); + sprintf(buf,"<!DOCTYPE html><html><body><h1>DROME-Dispositivo Remoto de Operacao e Monitoramento de Equipamentos</h1><br><p><a href='/lecomandocontrole.htm'>Ler comando do controle.</a><a href='/configRede.htm'><br>Configurar rede.</a></p><br></body></html>"); + if(cipSend(connID,buf,0)==1){ + printf("Requisicao enviada!\n"); + }else{ + printf("Requisicao nao enviada 1!!\n"); + } + encontrado = 1; + } + + if(strstr(bufInPtr,"configRede.htm")){ + + + //Pegando o IP + sendToModem("AT+CIFSR\r\n",1,&modemCom::status.OK,200,1); + //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>"); + sprintf(buf,"<!DOCTYPE html>IP Atual = %s.<br><form action='cwjap.htm' method='GET'><fieldset><legend>Parametros de Configuracao da rede:</legend>SSID WiFi:<br><input type='text' name='ssid' value='%s'><br>Senha WiFi:<br><input type='text' name='password' value='%s'><br>PORTA:<br><input type='text' name='porta' value='%s'><br><input type='submit' value='Configurar'></fieldset></form>",modemCom::status.STAIP,modemCom::status.ssid,modemCom::status.password,modemCom::status.port); + + cipSend(connID,buf,0); + encontrado = 1; + } + + if(strstr(bufInPtr,"cwjap.htm")){ + //cwjap.htm?ssid=VSA&password=vitaeBBYP&ip=0&port=80 + + strtok(bufInPtr,"="); + strcpy(modemCom::status.ssid,strtok(NULL,"&")); //pegando ssid + + strtok(NULL,"="); + strcpy(modemCom::status.password,strtok(NULL,"&")); //pegando password + + //strtok(NULL,"="); + //strcpy(modemStatus.STAIP,strtok(NULL,"&")); //pegando ip + + strtok(NULL,"="); + strcpy(modemCom::status.port,strtok(NULL," ")); //pegando port + + if(strlen(modemCom::status.ssid) && strlen(modemCom::status.password)){ + sprintf(buf,"Novos parametros: ssid = %s, password = %s, port = %s.\n",modemCom::status.ssid,modemCom::status.password,modemCom::status.port); + cipSend(connID,buf,0); + mudaRede = true; + }else{ + sprintf(buf,"Erro nos parametros.\n"); + cipSend(connID,buf,0); + } + encontrado = 1; + } + + /*if(strstr(bufInPtr,"leTemperaturas.htm")){ + + + + strtok(bufInPtr,"="); + bufInPtr = strtok(NULL,NULL); + //sprintf(buf,"%s",bufInPtr); + aux_int = atoi(bufInPtr); + aux_int--; + */ + + /*if(num_temperatureSensors){ + //Zerano conteudo de buff + sprintf(buf,"callback({\"response\":\""); + probe[0]->convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready + for (int i = 0; i<num_temperatureSensors; i++){ + sprintf(auxMsg,"%3.1f;",probe[i]->temperature()); + strcat(buf,auxMsg); + } + buf[strlen(buf)-1]=0; + sprintf(auxMsg,"\"})"); + strcat(buf,auxMsg); + }else{ + sprintf(buf,"callback({\"response\":\"Sensor_ERROR\"})"); + } + if(cipSend(connID,buf,0)==1){ + printf("Requisicao enviada!\n"); + }else{ + printf("Requisicao nao enviada 1!!\n"); + } + encontrado = 1; + }*/ + + + + if(strstr(bufInPtr,"lecomandocontrole.htm")){ + led2=1; + uint16_t timeout = 5000; + IrDetect.reset(); + IrDetect.start(); + + while((IrDetect.read_ms()<timeout) && (!detectaIRIn())); + if(IrDetect.read_ms()<timeout){ + serializaPacoteIR(connID); + }else{ + sprintf(buf,"callback({\"response\": \"ERROR\"})"); + if(cipSend(connID,buf,0)==1){ + printf("Requisicao enviada!\n"); + } + } + IrDetect.stop(); + encontrado = 1; + led2=0; + } + + if(!encontrado){ + + sprintf(buf,"Pagina Nao Encontrada."); + if(cipSend(connID,buf,0)==1){ + printf("Requisicao enviada!\n"); + }else{ + printf("Requisicao nao enviada 3!!\n"); + } + } + + sprintf(buf,"AT+CIPCLOSE=%u\r\n",connID); + sendToModem(buf,1,&modemCom::status.OK,2000,1); + + if(mudaRede){ + mudaRede = false; + modemCom::sendToModem("AT+CIPSERVER=0\r\n",1,&modemCom::status.OK,2000,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"); + fprintf(sdCard::config.fp,"SSID:%s\r\nPASSWORD:%s\r\nPORT:%s",modemCom::status.ssid,modemCom::status.password,modemCom::status.port); + sdCard::fechaArquivo(&sdCard::config); + modemCom::conectaWiFi(); + } + } +} + +void modemCom::conectaWiFi(void){ + //Função para mudança de rede + char *ptr; + char aux[128]; + if(sdCard::abreArquivo(&sdCard::config,"r")){ + pc.printf("Abrindo arquivo de config para buscar dados de conexao.\r\n"); + //"SSID:DROME\r\nPASSWORD:VITAE\r\nPORT:80" + + //Pegando SSID + fgets(modemCom::status.ssid,40,sdCard::config.fp); + ptr = strtok(modemCom::status.ssid,":"); + ptr = strtok(NULL,"\r\n"); + strcpy(modemCom::status.ssid,ptr); + + //Pegando PASSWORD + fgets(modemCom::status.password,50,sdCard::config.fp); + ptr = strtok(modemCom::status.password,":"); + ptr = strtok(NULL,"\r\n"); + strcpy(modemCom::status.password,ptr); + + //Pegando PORT + fgets(modemCom::status.port,20,sdCard::config.fp); + ptr = strtok(modemCom::status.port,":"); + ptr = strtok(NULL,"\r\n"); + strcpy(modemCom::status.port,ptr); + + sdCard::fechaArquivo(&sdCard::config); + 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"); + + + //AT+CIPSERVER=1,80 + if(modemCom::sendToModem("AT+CIPMUX=1\r\n",1,&modemCom::status.OK,250,4)) { + 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)) { + pc.printf("Recebeu o comando <%s>.\n",aux); + } + + if(modemCom::sendToModem("AT+CIPSTO=60\r\n",1,&modemCom::status.OK,250,4)) { + 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)) { + 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)) { + 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)) { + pc.printf("Recebeu o comando AT+CWDHCP_CUR=2,1.\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)) { + pc.printf("WiFi Conectado.\n"); + } + } + +} + +void modemCom::processaPacote(void const *args){ + char *ptr,*scanPtr; + bool naoCompreendido=true; + uint16_t bufInLength = bufModem.getLength(); + modemCom::bufIn = bufModem.get(); + + /* + if(modemCom::exibeEntradaPacote){ + modemCom::exibeEntradaPacote=false; + pc.printf("Lido entrada Pacote modem<%s>.\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); + + } + } + + //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){ + //+IPD,0,480:GET + strtok(ptr,","); //Separando +IPD + + ptr = strtok(NULL,","); //Pegando o numero da conexão + connID = atoi(ptr); + + ptr = strtok(NULL,":"); //Pegando o numero de caracteres IPD + IPDNumBytes = atoi(ptr); + + modemCom::bufIn = strtok(NULL,NULL); + + printf("Recebido pacote via conexao %u com %lu bytes.\n",connID,IPDNumBytes); + + } + + if(modemCom::atendendoWebServer){ + return; + } + + //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); + } + + ptr=strstr(modemCom::bufIn,"*ServerCommand*"); + if(ptr) { + naoCompreendido=false; + scanPtr = strtok (ptr,"\\"); + scanPtr = strtok (NULL,">"); + //modemCom::status.ServerCommand=1; + 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); + sdCard::insereDadosArquivo(&sdCard::tempFile,modemCom::bufIn,IPDNumBytes); + osDelay(250); + //Euclerio Deletar + /*for(uint16_t cont = 0; cont<IPDNumBytes; cont++){ + pc.printf("%c",modemCom::bufIn[cont]); + }*/ + + modemCom::status.timeOut=100; + + sprintf(modemCom::bufIn,"AT+CIPSEND=%u,%lu\r\n",connID,10); + modem.puts(modemCom::bufIn); + osDelay(100); + modem.puts("sendData\r\n"); + pc.printf("sendData\n"); + return; + } + + //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; + modemCom::status.PROMPT_ENVIO_COMMAND_MODE=1; + } + + modemCom::status.OK=0; + + ptr=strstr(modemCom::bufIn,"OK\r"); + if(ptr) { + naoCompreendido=false; + 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; + } + } + + + //+CSQ: 99,99 + + ptr=strstr(modemCom::bufIn,"+CSQ:"); + if(ptr) { + naoCompreendido=false; + scanPtr = strtok (ptr," "); + scanPtr = strtok (NULL,","); + if(scanPtr) { + modemCom::status.CSQ = atoi(scanPtr); + } + } + + //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,"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) +{ + //uint8_t maxTentativas=0; + + //char config[255]; + //char *ptr; + char *buf; + buf = bufModem.getRowBuffer(); + + modemCom::timeOutModem = 10; + modemCom::status.emComunicacao = true; + + if(modemCom::sendToModem("ATE0\r\n",1,&modemCom::status.OK,1000,10)) { + 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::status.emComunicacao = false; + return 1; +} + +