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

Dependencies:   GPS7 TextLCD mbed

.

Revision:
0:bf62ef1297ce
--- /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