Código para hacer un GPS usando un celular como modem.

Dependencies:   GPS7 TextLCD mbed

.

Files at this revision

API Documentation at this revision

Comitter:
gjusecheo
Date:
Wed Jun 01 15:39:31 2016 +0000
Commit message:
Tarea_GPS

Changed in this revision

GPS_G.lib Show annotated file Show diff for this revision Revisions of this file
TextLCD.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
diff -r 000000000000 -r bf62ef1297ce GPS_G.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS_G.lib	Wed Jun 01 15:39:31 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/tony63/code/GPS7/#8d7c7165ffe2
diff -r 000000000000 -r bf62ef1297ce TextLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Wed Jun 01 15:39:31 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/lcorralesc1/code/TextLCD/#0e0132807662
diff -r 000000000000 -r bf62ef1297ce main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jun 01 15:39:31 2016 +0000
@@ -0,0 +1,407 @@
+#include "mbed.h"
+#include "stdio.h"
+#include "string.h"
+#include  "iostream"  //libreria que nos permite utilizar operaciones de entrada y salida  se utilizara mas adelante para identificar la cadena a comparar.
+#include "GPS.h"
+#include "stdlib.h"
+
+
+Serial gsm(PTE22,PTE23);   // Se declaran puertos para la comunicacíón GSM
+Serial pc(USBTX,USBRX);    // Puerto seríal de la Freescale para el envio de datos
+GPS gps(PTE0, PTE1);       // Puertos del GPS para la obtencion de las coodenadas
+DigitalOut myled(LED1);
+
+
+char buf[200], pdu[]="", vect1[]="", vect2[]="", DE[255], DS[255], DEs[255], DSs[255], Ctamanosms[1], Ctiposmsc[1],  Csmscnumber[12], Cdeliver[1], Ctamanoaddress[1], Ctipoaddress[1], Cnumero[11], Cprotocolo[1], Cencoding[1], Ctime[14], Ctamano[1], Cdato[30];
+// Variables para almacenar las cadenas de caracteres
+int i,K,C,LENOUT,LENIN, w, r, ta;              // Auxiliares
+float lo,la;                                   // Variables para almacenar coordenadas
+char LINK[]= {"http://maps.google.com/?q="};  // Trama base
+
+
+int main()
+{   pc.printf("************************** INICIO DEL PROGRAMA ***********************");
+    // Configuración para la comunicacion con el celular
+    pc.printf("\n ----------------------Configuracion para la comunicacion con el celular---------------\n");
+    gsm.baud(9600);                // Configuracion de los baudios
+    gsm.format(8,Serial::None,1);  // 8 Bits sin paridad
+    std::string strOK ("OK");       // para comparar con las respuestas AT
+    pc.printf("\n ----------------------Verificando conectividad con el celular---------------\n");
+    pc.printf("\n Enviamos AT \n");   // Apreton de manos con el gsm
+    gsm.printf("AT\r\n");
+    gsm.scanf("%s",buf);
+    gsm.scanf("%s",buf);
+    pc.printf("%s\n",buf);
+             
+        if(strOK.compare(buf) != 0){
+        pc.printf("Aborten comunicacion");
+        }
+
+    
+
+    gsm.printf("\n AT+CNMI=1,1\r\n");     // Configuracion para trabjar sobre la memoria de la simcard
+    pc.printf("AT+CNMI=1,1\r\n");
+    gsm.scanf("%s",buf);
+    gsm.scanf("%s",buf);
+    pc.printf(">%s\n",buf);
+    if(strOK.compare(buf) != 0){
+        pc.printf("Aborten comunicacion");
+     }
+
+
+
+    gsm.printf("\n AT+CPMS= \"SM\",\"SM\",\"SM\"\r\n");  //
+    pc.printf("AT+CPMS= \"SM\",\"SM\",\"SM\"\n");
+    gsm.scanf("%s",buf);
+    gsm.scanf("%s",buf);
+    gsm.scanf("%s",buf);
+    pc.printf(">%s\n",buf);
+    wait(1);
+
+
+    gsm.printf("\n AT+CMGF=0\r\n");  // Configuracion para trabajar en modo PDU
+    pc.printf("AT+CMGF=0\r\n");
+    gsm.scanf("%s",buf);
+    gsm.scanf("%s",buf);
+    pc.printf(">%s\n",buf);
+    
+      if(strOK.compare(buf) != 0){
+        pc.printf("Aborten comunicacion");
+        }
+
+    pc.printf("\n CBST=0,0,1\r\n"); 
+    gsm.printf("CBST=0,0,1\r\n");     // para dejar en espera de mensajes entrantes
+
+  
+   
+    while(1) {
+
+        pc.printf("\n ----------- En espera de Mensaje entrante -------------------\n"); // En espera de mensaje entrante
+        gsm.scanf("%s",buf);
+        pc.printf("%s",buf);
+        i = strlen(buf);
+        
+        
+        
+        if(i>3) {  // En caso de que se reciba un mensaje se entra al este if
+            
+            
+            
+            pc.printf("\n -------------   Llego un Mensaje  ------------------- \n");
+            gsm.printf("AT+CMGR=1\r\n");  // Se lee el mensaje que entre en el indice 1.
+            
+            gsm.scanf("%s",buf);
+            gsm.scanf("%s",buf);
+            gsm.scanf("%s",buf);
+            gsm.scanf("%s",buf);
+            pc.printf(">%s \n",buf);        //Mostrar la cadena en PDU del mensaje leido.
+  
+
+            int T = strlen(buf);           // Se toma la longitud del mensaje leido
+            
+            pc.printf("\n -----------------  Comienza lectura de la trama PDU entrante : %d -------\n", T);  // Se comiensa a separar la trama pdu para extraer informacion especifica
+           
+            Ctamanosms[0]=buf[0];     // Se toma el tamaño en septetos de toda la trama pdu
+            Ctamanosms[1]=buf[1];
+            pc.printf("Longitud del mensaje en septetos %c%c en septetos \n", Ctamanosms[0], Ctamanosms[1]);
+            
+            Ctiposmsc[0]=buf[2];    // Tipo de mensaje
+            Ctiposmsc[1]=buf[3];
+            pc.printf("Tipo de direccion SMSC %c%c   \n",  Ctiposmsc[0], Ctiposmsc[1]);
+            
+            Csmscnumber[0]=buf[4];     // numero del sms
+            Csmscnumber[1]=buf[5];
+            Csmscnumber[2]=buf[6];
+            Csmscnumber[3]=buf[7];
+            Csmscnumber[4]=buf[8];
+            Csmscnumber[5]=buf[9];
+            Csmscnumber[6]=buf[10];
+            Csmscnumber[7]=buf[11];
+            Csmscnumber[8]=buf[12];
+            Csmscnumber[9]=buf[13];
+            Csmscnumber[10]=buf[14]; 
+            Csmscnumber[11]=buf[15];
+            
+            pc.printf("Numero del SMSC %s \n",  Csmscnumber);
+            Cdeliver[0]=buf[16];
+            Cdeliver[1]=buf[17];
+            
+            Ctamanoaddress[0]=buf[18];
+            Ctamanoaddress[1]=buf[19];
+            
+            Ctipoaddress[0]=buf[20];
+            Ctipoaddress[1]=buf[21];
+            
+            Cnumero[0]=buf[22];   // Numero del usuario
+            Cnumero[1]=buf[23];
+            Cnumero[2]=buf[24];
+            Cnumero[3]=buf[25];
+            Cnumero[4]=buf[26];
+            Cnumero[5]=buf[27];
+            Cnumero[6]=buf[28];
+            Cnumero[7]=buf[29];
+            Cnumero[8]=buf[30];
+            Cnumero[9]=buf[31];
+            Cnumero[10]=buf[32];
+            Cnumero[11]=buf[33];
+            
+           pc.printf("Numero del usuario %s \n",  Cnumero); 
+         
+         
+         Cprotocolo[0]=buf[34];  // Protocolo utilizado
+         Cprotocolo[1]=buf[35];
+         
+         Cencoding[0]=buf[36];   // Tipo de cifrado
+         Cencoding[1]=buf[37];
+          
+          Ctime[0]=buf[38];  // Tiempo en el que se envio el menaje
+          Ctime[1]=buf[39];
+          Ctime[2]=buf[40];
+          Ctime[3]=buf[41];
+          Ctime[4]=buf[42];
+          Ctime[5]=buf[43];
+          Ctime[6]=buf[44];
+          Ctime[7]=buf[45];
+          Ctime[8]=buf[46];
+          Ctime[9]=buf[47];
+          Ctime[10]=buf[48];
+          Ctime[11]=buf[49];
+          Ctime[12]=buf[50];
+          Ctime[13]=buf[51];       
+          
+          Ctamano[0]=buf[50]; // Tamaño de los datos (longitud de la parte legible)
+          Ctamano[1]=buf[51];
+          
+        
+         ta=(Ctamano[0]-48)*16+(Ctamano[1]-48); // Suponiendo que son  mensajes no muy grandes como solo se espera recibir cor, on y off es suficiente se transforman de caracter a su valor numerico y luego se ponderan
+         
+         pc.printf("Numero de carcteres del mensaje entrante %d \n", ta);
+
+         pc.printf(" Posicion de los datos en el mensaje PDU  %d \n", T-2*ta);  // posicion de los datos en la trama pdu
+         
+         for(i=0; i<2*ta; i++){     //Toma de los datos o mensaje
+             Cdato[i]=buf[52+i];
+             }
+    
+         ///// Se comienza la convercion de PDU a Texto
+         
+         pc.printf("\n------------- Comienza la convercion  de PDU a texto ------------------\n");  
+
+          LENIN=strlen(Cdato)/2; 
+          w=0;
+          pc.printf(" Tamano de los datos %d \n", strlen(Cdato));
+          for(i=0; i<=strlen(Cdato); i++){
+                if(i%2==0){
+                  if(Cdato[i]>47 & Cdato[i]<58){    // primero se asigna el valor numerico de cada caracter en caso de ser 0-9 se le resta 48 en caso de ser letra se le resta 55
+                    Cdato[i]= Cdato[i]-48;
+                  }
+                  
+               if(Cdato[i]>65 & Cdato[i]<71){
+                   Cdato[i]=Cdato[i]-55;
+                    
+                   }
+                  
+                   }
+              else{
+                    if(Cdato[i]>47 & Cdato[i]<58){
+                    Cdato[i]= Cdato[i]-48;
+                  }
+                  
+               if(Cdato[i]>65 & Cdato[i]<71){
+                   Cdato[i]=Cdato[i]-55;
+                    
+                   }
+                   
+                   DE[w]= Cdato[i-1]*16+Cdato[i];     // aqui se pondera cada caracter y se suma con su predecesor par dar el peso de la tupla
+                   pc.printf("Datos en hexagesimal DE[%d] %2X \n", w,  DE[w]);  // Se guarda la dupla en el vector DE
+                   w=w+1;
+                   }
+              }   
+         
+    
+       //----------------------------------- ---------------------------
+         LENOUT= LENIN*8/7;
+         K=7;
+         C=0;
+         DS[0]=DE[0] & 0x7F;  // la primera sola
+         pc.printf("%2X,%d,%d\r\n",DS[0],i,K);
+         for (i=1;i < LENOUT;i++){  // inicia el algoritmo
+         DS[i]=(DE[i-1-C]>>K | DE[i-C]<<(8-K))& 0x7F;  //valido para todos
+         pc.printf("%2X,%d,%d\r\n",DS[i],i,K);
+         if (K==0) {K=8;C++;}
+         K--;
+         }
+         pc.printf("\n El  Mensaje de llegada es: ");
+         for (i=0;i < LENOUT;i++){
+         pc.printf("%c",DS[i]);
+         }
+         pc.printf("\n  ------ Fin de la convercion de de los datos desde PDU a texto \n");
+         
+      }
+
+              std::string str1 ("coordenada");  // Cadenas par comparar el tipo de mensaje entrante
+              //std::string str2 ("on");
+              //std::string str3 ("off");
+
+              
+            /*if(str2.compare(DS) == 0) {  // En caso de que llegue on
+                pc.printf("\n--------------- LLego on ----------------");
+                myled = 0;
+                gsm.printf("AT+CMGD=1\r\n");
+                gsm.scanf("%s",buf);
+                pc.printf("\n%s\n",buf);
+
+            }//if de on*/
+
+            /* if(str3.compare(DS) == 0) { // En caso de que llegue off
+                pc.printf("\n---------- LLego off --------------- \n");
+                myled = 1;
+                gsm.printf("AT+CMGD=1\r\n");
+                gsm.scanf("%s",buf);
+                pc.printf("\n%s\n",buf);
+
+            }//if de off*/
+
+            if(str1.compare(DS) == 0) { // En caso de que se pidan las coordenadas
+               
+                pc.printf("\n ----------------- LLego coordenada ------------\n");
+                pc.printf("Esperando GPS \n");  // Se espera hasta que el gps entregue datos
+
+                while(1) {
+                    i=0;
+                    if(gps.sample()& i==0) {
+
+                        pc.printf("--- Comienza la lectura del gps \n");
+                        //Toma de datos del gps y concatenacion para armar los datos.
+
+                        la=gps.longitude-0.2398;
+                        lo=gps.latitude+0.0837;
+                        sprintf(vect1, "%f", lo);
+                        strcat(LINK,vect1);
+                        strcat(LINK,",");
+
+                        
+                        sprintf(vect2, "%f", la);
+                        strcat(LINK,vect2);
+                        strcat(DEs,LINK);
+                        pc.printf("%s\n",LINK);
+
+
+                        //Conversion de los datos"LINK" a formatdo PDU
+
+                        LENIN=strlen(DEs);
+
+                        K=0;
+                        C=0;
+                        for (i=0; i < LENIN; i++) {
+                            DSs[i]=DEs[i+C]>>K | DEs[i+C+1]<<(7-K);
+                            if (DSs[i]==0x00) {
+                                LENOUT=i;
+                                goto salir;
+                            }
+                            K++;
+                            if (K==7) {
+                                K=0;    // se chequea que ya se acabaron los bits en un ciclo de conversion.
+                                C++;
+                            }
+                        }
+
+                        //--------------------------------------------------------------
+salir:
+                        pc.printf("DEs\n");
+                        for (i=0; i < LENIN; i++) {
+                            pc.printf("%X",DEs[i]);
+                        }
+                        pc.printf("\n DSs \n");
+                        for (i=0; i<LENOUT; i++) {
+                            pc.printf("%02X",DSs[i]&0x000000FF);
+                        }
+
+                        pc.printf("\n LENOUT:%d,LENIN:%d\r\n",LENOUT,strlen(DEs));
+
+
+                        // Enviamos el mensaje
+
+                        pc.printf("\n -------------  Comienza el envio del mensaje SMS ---------- \n");
+
+                         if(LENOUT%2==0){ // ponderacion para cuadrar el tamaño del mensaje a enviar
+                             w=27;
+                             }
+                        else{
+                            w=26;
+                            }
+                        gsm.printf("AT+CMGS=%d\r\n", ((2*LENOUT)+w)/2); // Inicio real del envio del mensaje
+                        pc.printf("\n AT+CMGS=%d\r\n", ((2*LENOUT)+w)/2);
+                        wait(0.5);
+
+                        gsm.printf("0011000A91"); // relleno inicial
+                        pc.printf("0011000A91");
+                        
+                                           
+                        for(i=0; i<11; i++){  // NUMERO TELEFONICO DEL USUARIO
+                        gsm.printf("%c", Cnumero[i]);
+                        pc.printf("%c", Cnumero[i]);
+                         
+                            }
+                        
+                        gsm.printf("000AA"); // segundo relleno
+                        pc.printf("000AA");
+                        
+                        gsm.printf("%2X",LENOUT);  // longitud de los datos
+                        pc.printf("%2X",LENOUT);
+
+
+                        for (i=0; i < LENOUT; i++) {  // imprimir los datos 
+                            gsm.printf("%02X",DSs[i]&0x000000FF);
+                            pc.printf("%02X",DSs[i]&0x000000FF);
+                            wait(0.1);
+                        }
+                        gsm.putc((char)0x1A); // Punto final del envio de datos
+
+
+                        gsm.scanf("%s",buf);  // Se lee la respuesta del gsm
+                        gsm.scanf("%s",buf);
+
+                        pc.printf("\n Lo que devuelve el cel %s \n",buf);
+                        i=1;
+                        gsm.printf("AT+CMGD=1\r\n");
+                        
+                        //Limpieza de variables
+                        
+                        for(i=26; i<=strlen(LINK); i++){
+                            LINK[i]=NULL;
+                            
+                            }
+                        
+                         for(i=0; i<=255; i++){
+                             DSs[i]=NULL;
+                             DEs[i]=NULL;
+                             }
+                        
+                        pc.printf("\n Se sale de while  para la lectura de gps \n ");
+                        gsm.scanf("%s",buf);
+                        pc.printf(">%s",buf);
+                        goto s; // salida del if de la llegada de cor  y de la espera del gps
+                    }
+
+
+
+                }//if de coordenada
+                
+
+            }// if de llegada de SMS
+            
+                if(str1.compare(DS) != 0 /*&& str2.compare(DS) != 0 && str3.compare(DS) != 0*/){
+                pc.printf("El mensaje de llegada no es valido");
+                gsm.printf("AT+CMGD=1\r\n"); // Borrar el mensaje
+                gsm.scanf("%s",buf);
+                pc.printf("\n%s\n",buf);
+                    }
+
+
+s:
+            gsm.scanf("%s",buf);
+            pc.printf("%s",buf);
+
+        }// while
+    }// Main
diff -r 000000000000 -r bf62ef1297ce mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Jun 01 15:39:31 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/7cff1c4259d7
\ No newline at end of file