Tarea GSM GPS

Dependencies:   GPS7 TextLCD mbed

Files at this revision

API Documentation at this revision

Comitter:
caarbelaezg
Date:
Thu Jun 18 16:26:15 2015 +0000
Commit message:
Tarea GPS GSM

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 3171e1737767 GPS_G.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS_G.lib	Thu Jun 18 16:26:15 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/tony63/code/GPS7/#8d7c7165ffe2
diff -r 000000000000 -r 3171e1737767 TextLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Thu Jun 18 16:26:15 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/lcorralesc1/code/TextLCD/#0e0132807662
diff -r 000000000000 -r 3171e1737767 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Jun 18 16:26:15 2015 +0000
@@ -0,0 +1,407 @@
+#include "mbed.h"
+#include "stdio.h"
+#include "string.h"
+#include  "iostream"
+#include "TextLCD.h"
+#include "GPS.h"
+#include "stdlib.h"
+
+
+Serial gsm(PTE0,PTE1);   // 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(PTD7, PTD6);
+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 corrdenadas
+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 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 menjsae que ente 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 -----------------  Comiensa 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 comeinsa 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 ("cor");  // 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 cor ------------\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;
+                        lo=gps.latitude;
+                        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 coord
+                
+
+            }// 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 3171e1737767 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Jun 18 16:26:15 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/7cff1c4259d7
\ No newline at end of file