Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: DS1820 HighSpeedAnalogIn devices mbed
modem.cpp
- Committer:
- brunofgc
- Date:
- 2017-06-07
- Revision:
- 5:7801f913384e
- Parent:
- 4:13ff9c81dc10
- Child:
- 6:d4ebbaaba295
File content as of revision 5:7801f913384e:
#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::writeStatusToSD(void){
char aux[30];
int16_t RSSI;
RSSI = modemCom::getRSSI();
sdCardBuf.del();
sdCardBuf.fill("log{status:ip=255.255.255.255;csq=",34);
sprintf(aux,"%d",RSSI);
sdCardBuf.fill(aux,strlen(aux));
sprintf(aux,";imsi=%s}log",modemCom::status.MAC);
sdCardBuf.fill(aux,strlen(aux));
if(!sdCard::arquivoAberto()){
sdCard::insereDadosArquivo(&sdCard::armazenamento,sdCardBuf.get(),sdCardBuf.getLength());
}
}
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(serverAddress,"/drome/Parser/",&sdCard::envio);
break;
case dadosStatus:
result = modemCom::postFileCommandMode(serverAddress,"/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!
//application/octet-stream
sprintf(header,"--xxBOUNDARYxx\r\nContent-Type: text/plain\r\nContent-Disposition: form-data; name=\"IMEI\"\r\n\r\n%s\r\n--xxBOUNDARYxx\r\nContent-Type: application/octet-stream\r\nContent-Disposition: form-data; name=\"file\"; filename=\"%s\"\r\n\r\n",modemCom::status.MAC,arquivo->nome);
dataTam = strlen(header);
dataTam+=arquivo->bytes;
dataTam+= strlen("\r\n--xxBOUNDARYxx--");
//"/drome/parser/index.php" uri drome
sprintf(header,"POST %s HTTP/1.1\r\nHost: %s\r\nContent-Type: multipart/form-data; boundary=xxBOUNDARYxx\r\nContent-Length: %lu\r\n\r\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\r\nContent-Type: text/plain\r\nContent-Disposition: form-data; name=\"IMEI\"\r\n\r\n%s\r\n--xxBOUNDARYxx\r\nContent-Type: application/octet-stream\r\nContent-Disposition: form-data; name=\"file\"; filename=\"%s\"\r\n\r\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;
pc.printf("Cabecalho http nao enviado.\n");
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);
}
pc.printf("Numero de bytes por envio = %lu.\r\n",numeroDeBytesPorEnvio);
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+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)) {
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("\r\n--xxBOUNDARYxx--\r\n\r\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,5);
}
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,"favicon.ico")){
//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><link rel=\"icon\" href=\"http://vitaesolucoes.com.br/drome/assets/local/images/favicon/favicon.ico\" type=\"image/x-icon\"></html>");
if(cipSend(connID,buf,0)==1){
printf("Requisicao enviada!\n");
}else{
printf("Requisicao nao enviada 1!!\n");
}
encontrado = 1;
}
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
pc.printf("Antes <%s>.\r\n",modemCom::status.ssid);
diversos::strReplace(modemCom::status.ssid,"%20"," ");
pc.printf("Tirado %%20 <%s>.\r\n",modemCom::status.ssid);
diversos::strReplace(modemCom::status.ssid,"+"," ");
pc.printf("Tirado + <%s>.\r\n",modemCom::status.ssid);
if((modemCom::status.ssid[0]!=0) && (modemCom::status.password[0]!=0)){
sprintf(buf,"HTTP/1.1 200 OK\n\nACK");
mudaRede = true;
}else{
sprintf(buf,"HTTP/1.1 200 OK\n\nNACK");
}
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,"erro");
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");
}
}
modemCom::closeConnection(connID);
/*sprintf(buf,"AT+CIPCLOSE=%u\r\n",connID);
sendToModem(buf,1,&modemCom::status.OK,300,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();
}
}
}
int16_t modemCom::getRSSI(void){
/*char *ptr;
int16_t RSSI = 0;
if(modemCom::sendToModem("AT+CWLAP\r\n",1,&modemCom::status.OK,1000,1)){
ptr = strstr(modemCom::bufIn,(const char*)modemCom::status.ssid);
if(ptr){
ptr = strtok(ptr,",");
ptr = strtok(NULL,",");
RSSI = atoi(ptr);
}
}
return RSSI;*/
return -50;
}
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 = strstr(modemCom::status.ssid,"SSID");
if(ptr!=NULL){
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);
}else{
strcpy(modemCom::status.ssid,"VSA");
strcpy(modemCom::status.password,"vitaeBBYP");
strcpy(modemCom::status.port,"80");
}
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");
}else{
strcpy(modemCom::status.ssid,"VSA");
strcpy(modemCom::status.password,"vitaeBBYP");
strcpy(modemCom::status.port,"80");
}
//Mudando mode para AP e Station
if(modemCom::sendToModem("AT+CWMODE=3\r\n",1,&modemCom::status.OK,10000,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)) {
pc.printf("WiFi Conectado.\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");
}
}
void modemCom::processaPacote(void const *args){
char *ptr,*scanPtr;
bool naoCompreendido=true;
uint16_t bufInLength = bufModem.getLength();
modemCom::bufIn = bufModem.get();
//pc.printf("Entrada do modem<\n\n%s\n\n>\n",modemCom::bufIn);
/*
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);
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;
}
}
//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;
}