Recibe un mensaje de texto con una clave para adquirir y reenviar las coordenadas del GPS

Dependencies:   GPS mbed

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