Tarea GSM GPS

Dependencies:   GPS7 TextLCD mbed

main.cpp

Committer:
caarbelaezg
Date:
2015-06-18
Revision:
0:3171e1737767

File content as of revision 0:3171e1737767:

#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