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

Dependencies:   GPS mbed

Files at this revision

API Documentation at this revision

Comitter:
SSJprocesa
Date:
Sun May 29 17:46:03 2016 +0000
Commit message:
Manejo de GPS por mensajes de texto

Changed in this revision

GPS.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS.lib	Sun May 29 17:46:03 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/GPS/#15611c7938a3
--- /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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun May 29 17:46:03 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/6c34061e7c34
\ No newline at end of file