Santiago muñoz
/
GPS_Celular
Recibe un mensaje de texto con una clave para adquirir y reenviar las coordenadas del GPS
Diff: main.cpp
- Revision:
- 0:996dc36e89b1
diff -r 000000000000 -r 996dc36e89b1 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun May 29 17:46:03 2016 +0000 @@ -0,0 +1,355 @@ +#include "mbed.h" +#include "string.h" +#include "math.h" +#include "GPS.h" +//---Configuraciones--- +Timer t; +Serial pc(USBTX,USBRX); //Configura puerto UART de la +Serial GSM(PTE22, PTE23);//Configura la entrada serial del celular +DigitalOut ledr(PTE29);//Led indicador +DigitalIn chan(PTC3);//Pulsador para iniciar la configuración del celular +GPS gps(PTE0,PTE1);//configuración de los pines de comunicación con el GPS +//---Subrutinas--- +int readBuffer(char *buffer,int count);//Subrutina para leer el buffer +void enviar(int LENIN1,char *DS,char *numero);//subrutina para enviar mensaje +void borrar_todo(void);//subrutina para reiniciar las variables +void config(void);//configuración del celular +//---Variables para paquetes--- +char buffer[100],Bkupbuffer[100];//buffer's de almacenación de mensajes +char celular[10]; +char ENCA[255]={"http://maps.google.com/maps?q="};//para enviar las coordenadas en google +char DS[255]; +int LENIN=0,LENIN1=0,LENOUT=0;//Tamaño de los datos de la función de conversión de entrada y salida +//---Variables para coordenadas--- +char coorden[50]={NULL}; +int longi_entera=0,lati_entera=0,longi_decimal=0,lati_decimal=0; +//---Variables como contadores--- +int i=0,count=0,bandera=0,gh=0,negativo=0,K=0,C=0,p=0,j=0,z=0,ro=0,st=0,sol=0; +//***************************************************************************************************************************************** +//***************************************************************************************************************************************** +//es recomendable iniciar siempre oprimiendo el boton de configuración. +int main(void) +{ +inicio: +ledr=1; +borrar_todo();//Ejecuta la rutina que reinicia todas las variables del programaledr=1; +GSM.baud(9600);//configura los baudios de la comunicación en 9600 +GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART +wait(1); +pc.printf("conectado al pc \r\n ");//indicador de conexión +GSM.printf("AT+CMGD=1\r\n");//Borrar los mensajes del celular + while(1) + { + //________________________________________________________________________________________________________________________________________ + if(chan==0)//si se preciona, se procede a cofigurar el celular con comandos AT + { + config(); + } + //________________________________________________________________________________________________________________________________________ + if (GSM.readable()) //esperar llegada de mensaje del celular + { + readBuffer(buffer,100);//guardar el mensaje en el buffer + i=0; + pc.printf(buffer);//imprimir el mensaje + if(buffer[14]=='1'||buffer[6]=='R'){bandera++;} + if(bandera==2)//compara si ya llegó el mensaje al celular y hay que borrarlo + { + for(gh=0;gh<=99;gh++)//guardamos el mensaje almacenado en el buffer en una variable auxiliar + { + Bkupbuffer[gh]=buffer[gh]; + } + //pc.printf("\r\n%c\r\n %c\r\n %c\r\n %c\r\n",Bkupbuffer[68],Bkupbuffer[69],Bkupbuffer[70],Bkupbuffer[71]); + wait(0.5); + GSM.printf("AT+CMGD=1\r\n");//borrar mensaje recibido + bandera=0; + } + } + //________________________________________________________________________________________________________________________________________ + if((buffer[10]=='S')&& (buffer[11]=='M'))//compara si el mensaje es un mensaje de texto que llegó al celular + { + pc.printf("\r\n Llego mensaje\r\n "); + buffer[10]=' ';//limpia los espacios del Buffer + buffer[11]=' '; + GSM.printf("AT+CMGR=%c\r\n",buffer[14]);//solicitar mesaje al celular + //pc.printf("AT+CMGR=%c\r\n",buffer[14]); + buffer[14]=' '; + i=0; + } + //________________________________________________________________________________________________________________________________________ + if(Bkupbuffer[68]=='4'&& Bkupbuffer[69]=='5'&&Bkupbuffer[70]=='6'&& Bkupbuffer[71]=='6'&& Bkupbuffer[72]=='1'&& Bkupbuffer[73]=='1')//recibió ELE (Extincion Level Event) + { + buffer[68]=' '; + Bkupbuffer[68]=' '; + for(st=68;st<=73;st++) + { + Bkupbuffer[st]=' ';//limpia el espacio del buffer para evitar ingresar de nuevo, si no ha llegado otro mensaje con la contraseña + } + + pc.printf("Adquiriendo coordenadas del GPS...\r\n");//Adquiriendo coordenadas del GPS... + if(gps.sample())//Si las coordenadas se obtienen correctamente: + { + for(ro=30;ro<=255;ro++) + { + ENCA[ro]='\0'; + } + ro=0; + + longi_entera=(int)gps.longitude;//Adquiere la parte entera de la longitud del GPS + lati_entera=(int)gps.latitude;//Adquiere la parte entera de la latitud del GPS + longi_decimal=abs((gps.longitude-(int)gps.longitude)*1000000);//Adquiere el valor absoluto de la longitud del GPS + lati_decimal=abs((gps.latitude-(int)gps.latitude)*1000000);//Adquiere el valor absoluto de la longitud del GPS + pc.printf("http://maps.google.com/maps?q=%f,%f\r\n", gps.latitude,gps.longitude);//encabezado que será impreso en el terminal y luego en el mensaje + while(longi_decimal>0) + { + coorden[j]=(longi_decimal%10)+48;//se toma la parte decimal de la longitud y se pasa a ASCII y guarda en el vector coorden + longi_decimal=longi_decimal/10;//se divide por 10 para hacer mas iteracines en caso de que el número de elementos seamayor a uno + pc.printf("%c",coorden[j]); + j++; + } + coorden[j]='.';//Se adiciona el punto, para la parte decimal + pc.printf("%c",coorden[j]);//se muestra en el terminal la posición j de la longitud + j++; + if(longi_entera<0)//si la longitud es menor a cero se multiplica por -1 + { + negativo=1; + longi_entera=longi_entera*-1; + } + while(longi_entera>0) + { + coorden[j]=(longi_entera%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden + longi_entera=longi_entera/10; + pc.printf("%c",coorden[j]); + j++; + } + if(negativo==1)//si negativo es 1 al vector de caracteres se le adiciona un '-' + { + coorden[j]='-'; + pc.printf("%c",coorden[j]); + j++; + } + negativo=0;//reinicia la variable para hacer lo mismo con la longitud + coorden[j]=','; + pc.printf("%c",coorden[j]); + j++; + while(lati_decimal>0) + { + coorden[j]=(lati_decimal%10)+48;//se toma la parte decimal de la latitud y se pasa a ASCII y guarda en el vector coorden + lati_decimal=lati_decimal/10; + pc.printf("%c",coorden[j]); + j++; + } + coorden[j]='.';//adiciona el punto al vector para indicar la parte decimal + pc.printf("%c",coorden[j]); + j++; + if(lati_entera<0) + { + negativo=1; + lati_entera=lati_entera*-1; + } + while(lati_entera>0) + { + coorden[j]=(lati_entera%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden + lati_entera=lati_entera/10; + pc.printf("%c",coorden[j]); + j++; + } + if(negativo==1) + { + coorden[j]='-'; + pc.printf("%c",coorden[j]); + j++; + } + pc.printf("\r\n"); + j--; + z=strlen(ENCA);//hace z = al tamaño de la variable ENCA + for(i=j;i>=0;i--) + { + ENCA[z]=coorden[i];//guarda las coordenadas en un vector auxiliar ENCA en orden + z++; + } + pc.printf(ENCA); + pc.printf("\r\n"); + LENIN1=strlen(ENCA);//toma el tamaño del vector ENCA + for (i=0;i < LENIN1;i++)//algoritmo para pasar de septetos a octetos + { + DS[i]=ENCA[i+C]>>K | ENCA[i+C+1]<<(7-K); + if (DS[i]==0x00) {LENOUT=i; goto salir;}//cuando + K++; + if (K==7) {K=0;C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion. + } +//-------------------------------------------------------------- +salir: for(i=38;i<48;i++)//Se extrae el número del celular + { + celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer + }//de respaldo + wait(0.5); + enviar(LENIN1,DS,celular);//Ejecuta la rutina de envío de mensaje, con el tamaño del mensaje, las coordenadas en septetos y el número del celular + wait(14); + goto inicio; + }//if GPS + else + { + for(i=38;i<48;i++)//Se extrae el número del celular + { + celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer + }//de respaldo + wait(0.5); + GSM.printf("at+cmgs=%d\r\n",37);//inicio de envío de mensaje + pc.printf("at+cmgs=%d\r\n",37); + wait(0.5); + GSM.printf("0011000A91"); + pc.printf("0011000A91"); + for(p=0;p<10;p++) + { + GSM.printf("%c",celular[p]); + pc.printf("%c",celular[p]); + } + GSM.printf("0000AA1B45B9FC2D6781D26E7AD94D2F83DAE139881E9693CB2E970B");//Relleno + Número de octetos + mensaje + pc.printf("0000AA1B45B9FC2D6781D26E7AD94D2F83DAE139881E9693CB2E970B");//Error, intente mas tarde... + wait(0.5); + GSM.putc(0x1A);//fin de envío de mensaje + for(ro=0;ro<=100;ro++)//borrar el buffer y el respaldo para habilitar una nueva recepción + { + buffer[ro]='\0'; + Bkupbuffer[ro]='\0'; + } + ro=0; + wait(0.5); + } + }//if ELE + else + { + for(ro=0;ro<=100;ro++) + { + buffer[ro]='\0'; + } + ro=0; + } + }//while +}//main +//***************************************************************************************************************************************** +//***************************************************************************************************************************************** +int readBuffer(char *buffer,int count)//Recepción por comunicación serial con el celular +{ +t.start(); + while(1) + { + while (GSM.readable())//si hay algo que leer en la comunicación + { + char c = GSM.getc(); + if (c == '\r' || c == '\n') c = '$';//remplaza los espacios y saltos de linea por comodín + buffer[i++] = c;//almacena la información en una cadena de caracteres "buffer" + if(i > count)break; + } + if(i > count)break; + if(t.read() > 3) + { + t.stop(); + t.reset(); + break; + } + } +wait(0.5); + while(GSM.readable()) + { + char c = GSM.getc(); + } +return 0; +} +//***************************************************************************************************************************************** +//***************************************************************************************************************************************** +void enviar(int LENIN1,char *DS,char *numero) +{ +GSM.printf("at+cmgs=%d\r\n",13+LENIN1);//Comando para enviar el mensaje, empieza con la longitud total -1 +pc.printf("at+cmgs=%d\r\n",13+LENIN1); +wait(0.5); +GSM.printf("0011000A91");//Envía relleno +pc.printf("0011000A91"); + for(p=0;p<10;p++)//Envía el número del celular trocado + { + GSM.printf("%c",celular[p]); + pc.printf("%c",celular[p]); + } +GSM.printf("0000AA");//Envía segundo relleno +pc.printf("0000AA"); + if(LENIN1<=15)//Si es menor a 15 le adiciona un 0 al comienzo de la dirección + { + pc.printf("0"); + GSM.printf("0"); + pc.printf("%X",LENIN1);//Envía la longitud del mensaje + GSM.printf("%X",LENIN1); + } + else + { + pc.printf("%2X",LENIN1); + GSM.printf("%2X",LENIN1); + } + for (p=0;p < LENIN1;p++)//envía el número de caracteres del mensaje + { + if(DS[p]<=15)//agrega ceros a cada número menos a 15 en el mensaje + { + pc.printf("0"); + GSM.printf("0"); + pc.printf("%X",DS[p]); + GSM.printf("%X",DS[p]); + } + else + { + pc.printf("%2X",DS[p]&0x000000FF); + GSM.printf("%2X",DS[p]&0x000000FF); + } + } +wait(0.5); +GSM.putc(0x1A);//culmina el envío del mensaje +pc.putc(0x1A); +} +//***************************************************************************************************************************************** +//***************************************************************************************************************************************** +void borrar_todo(void)//reinicia todas las varaibles del programa +{ + for(ro=0;ro<=50;ro++) + { + coorden[ro]='\0'; + } + ro=0; + for(ro=0;ro<=100;ro++) + { + buffer[ro]='\0'; + Bkupbuffer[ro]='\0'; + } + for(ro=0;ro<=255;ro++) + { + DS[ro]='\0'; + } + ro=0; + for(ro=0;ro<=10;ro++) + { + celular[ro]='\0'; + } +ro=0; +LENIN=0;LENIN1=0;LENOUT=0; +longi_entera=0;lati_entera=0;longi_decimal=0;lati_decimal=0; +i=0;count=0;bandera=0;gh=0;negativo=0;K=0;C=0;p=0;j=0;z=0;ro=0;sol=0;st=0; +ledr=0; +} +//***************************************************************************************************************************************** +//***************************************************************************************************************************************** +void config(void)//setear la configuración en el celular +{ + GSM.printf("AT\r\n"); + pc.printf("AT\r\n"); + wait(0.5); + GSM.printf("AT+CNMI=1,1\r\n"); + pc.printf("AT+CNMI=1,1\r\n"); + wait(0.5); + GSM.printf("AT+CMGF=0\r\n"); + pc.printf("AT+CMGF=0\r\n"); + wait(0.5); + GSM.printf("ATE\r\n");//eco + pc.printf("ATE\r\n"); + wait(0.5); + GSM.printf("CBST=0,0,1\r\n"); + pc.printf("CBST=0,0,1\r\n"); + wait(0.5); + +} \ No newline at end of file