rastreador satelital segundo metodo de calculo

Dependencies:   GPS mbed

Fork of Tarea_GSM_GPS by Hernán Maya

main.cpp

Committer:
satelite
Date:
2016-05-25
Revision:
0:e48cba9116f6

File content as of revision 0:e48cba9116f6:

/*Tarea_GSM_GPS
  Sistema de ubicacion basado en un receptor GPS y un celular siemens a56
  como modem GSM.
  El sistema recibe un mensaje de texto, lo procesa y si el mensaje recibido corresponde
  con el codigo almacenado en el microcontrolador, este procede a enviar un mensaje de texto
  con la ubicacion actual.
*/

#include "mbed.h"
#include "iostream"
#include "GPS.h"

// Configuracion de los puertos del microcontrolador
Serial gsm(PTE0, PTE1);                             // puerto serie para la comunicacíón GSM
Serial pc(USBTX, USBRX);                            // puerto serie para debug
GPS gps(PTD7, PTD6);                                // puerto para comunicacion GPS

// Declaracion de variables globales
char buffer[200], pdu[] = "", vector1[] = "", vector2[] = "", 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], Xnumero[10]; // Variables para almacenar las cadenas de caracteres
int i, k, c, w, r, ta, tam, lenOUT, lenIN;          // variables auxiliares
float lon, lat;                                     // variables para almacenar coordenadas
char link[]= {"http://maps.google.com/?q="};        // inicio trama mensaje

// Rutina principal
int main()
{
    pc.printf("######################### INICIO DEL PROGRAMA #########################");                   // mensaje de bienvenida debug
    // Establecimiento de la comunicacion con el modem del telefono movil
    pc.printf("\r\n>>>>>>>>>>>>>>>>>>>>>> Configurando SIEMENS A56i <<<<<<<<<<<<<<<<<<<<<<\r\n");           // mensaje debug
    gsm.baud(9600);
    gsm.format(8,Serial::None,1);
    std::string strOK ("OK");
    pc.printf("\r\n Enviamos AT \r\n");                                                                     // prueba comunicacion con el movil
    gsm.printf("AT\r\n");
    gsm.scanf("%s",buffer);
    gsm.scanf("%s",buffer);
    pc.printf("%s\n",buffer);

    if(strOK.compare(buffer) != 0) {
        pc.printf("\r\nModem GSM no responde\r\n");
    }

    gsm.printf("\n AT+CNMI=1,1\r\n");                                                                       // Selecciona la memoria de la simcard
    pc.printf("AT+CNMI=1,1\r\n");
    gsm.scanf("%s",buffer);
    gsm.scanf("%s",buffer);
    pc.printf(">%s\n",buffer);
    if(strOK.compare(buffer) != 0) {
        pc.printf("\r\nModem GSM no responde\r\n");
    }

    gsm.printf("\n AT+CPMS= \"SM\",\"SM\",\"SM\"\r\n");  //
    pc.printf("AT+CPMS= \"SM\",\"SM\",\"SM\"\n");
    gsm.scanf("%s",buffer);
    gsm.scanf("%s",buffer);
    gsm.scanf("%s",buffer);
    pc.printf(">%s\n",buffer);
    wait(1);

    gsm.printf("\n AT+CMGF=0\r\n");                                                                         // Configura modo PDU
    pc.printf("AT+CMGF=0\r\n");
    gsm.scanf("%s",buffer);
    gsm.scanf("%s",buffer);
    pc.printf(">%s\n",buffer);

    if(strOK.compare(buffer) != 0) {
        pc.printf("\r\nModem GSM no responde\r\n");
    }

    pc.printf("\n CBST=0,0,1\r\n");
    gsm.printf("CBST=0,0,1\r\n");                                                                           // en espera de mensajes entrantes

    if(gps.sample()) {
        pc.printf("Estamos en %f, %f\r\n", gps.latitude, gps.longitude+50);                                 // muestro la ubicacion actual, para saber si el GPS esta recibiendo
    } else {
        pc.printf("no se donde!:(\r\n");
    }
    
// Ciclo infinito
    while(1) {

        pc.printf("\r\n>>>>>>>>>>>>>>>>>> Esperando nuevo mensaje de texto <<<<<<<<<<<<<<<<<<<\r\n");
        gsm.scanf("%s",buffer);
        pc.printf("%s",buffer);
        i = strlen(buffer);

        if(i>3) {                                                                                           // si reciba un mensaje
            pc.printf("\r\n>>>>>>>>>>>>>>>>>>>>>>>>>>>> Nuevo mensaje <<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n");
            gsm.printf("AT+CMGR=1\r\n");                                                                    // lee menjsae en la primera posicion de memoria
            gsm.scanf("%s",buffer);
            gsm.scanf("%s",buffer);
            gsm.scanf("%s",buffer);
            gsm.scanf("%s",buffer);
            pc.printf(">%s \r\n",buffer);                                                                   // imprime la cadena PDU del mensaje
            tam = strlen(buffer);                                                                           // longitud del mensaje leido
            pc.printf("\r\nLectura de la trama PDU: %d\r\n", tam);                                          // separa la trama pdu para extraer informacion necesaria
            Ctamanosms[0] = buffer[0];                                                                      // tamaño en septetos de toda la trama pdu
            Ctamanosms[1] = buffer[1];
            pc.printf("\r\nLongitud del mensaje en septetos %c%c en septetos \n", Ctamanosms[0], Ctamanosms[1]);
            Ctiposmsc[0] = buffer[2];
            Ctiposmsc[1] = buffer[3];
            pc.printf("\r\nTipo de direccion SMSC %c%c   \r\n",  Ctiposmsc[0], Ctiposmsc[1]);
            Csmscnumber[0] = buffer[4];
            Csmscnumber[1] = buffer[5];
            Csmscnumber[2] = buffer[6];
            Csmscnumber[3] = buffer[7];
            Csmscnumber[4] = buffer[8];
            Csmscnumber[5] = buffer[9];
            Csmscnumber[6] = buffer[10];
            Csmscnumber[7] = buffer[11];
            Csmscnumber[8] = buffer[12];
            Csmscnumber[9] = buffer[13];
            Csmscnumber[10] = buffer[14];
            Csmscnumber[11] = buffer[15];
            pc.printf("\r\nNumero del SMSC %s \r\n",  Csmscnumber);
            Cdeliver[0] = buffer[16];
            Cdeliver[1] = buffer[17];
            Ctamanoaddress[0] = buffer[18];
            Ctamanoaddress[1] = buffer[19];
            Ctipoaddress[0] = buffer[20];
            Ctipoaddress[1] = buffer[21];
            Cnumero[0] = buffer[22];                                                                             // Numero del usuario
            Cnumero[1] = buffer[23];
            Cnumero[2] = buffer[24];
            Cnumero[3] = buffer[25];
            Cnumero[4] = buffer[26];
            Cnumero[5] = buffer[27];
            Cnumero[6] = buffer[28];
            Cnumero[7] = buffer[29];
            Cnumero[8] = buffer[30];
            Cnumero[9] = buffer[31];
            Cnumero[10] = buffer[32];
            Cnumero[11] = buffer[33];
            Xnumero[0] = buffer[23];
            Xnumero[1] = buffer[22];
            Xnumero[2] = buffer[25];
            Xnumero[3] = buffer[24];
            Xnumero[4] = buffer[27];
            Xnumero[5] = buffer[26];
            Xnumero[6] = buffer[29];
            Xnumero[7] = buffer[28];
            Xnumero[8] = buffer[31];
            Xnumero[9] = buffer[30];
            pc.printf("\r\nNumero del usuario %s \r\n",  Xnumero);
            Cprotocolo[0] = buffer[34];                                                                          // protocolo
            Cprotocolo[1] = buffer[35];
            Cencoding[0] = buffer[36];                                                                           // cifrado
            Cencoding[1] = buffer[37];
            Ctime[0] = buffer[38];                                                                               // Tiempo envio mensaje
            Ctime[1] = buffer[39];
            Ctime[2] = buffer[40];
            Ctime[3] = buffer[41];
            Ctime[4] = buffer[42];
            Ctime[5] = buffer[43];
            Ctime[6] = buffer[44];
            Ctime[7] = buffer[45];
            Ctime[8] = buffer[46];
            Ctime[9] = buffer[47];
            Ctime[10] = buffer[48];
            Ctime[11] = buffer[49];
            Ctime[12] = buffer[50];
            Ctime[13] = buffer[51];
            Ctamano[0]= buffer[50];                                                                             // longitud de la parte legible
            Ctamano[1]= buffer[51];
            ta = (Ctamano[0]-48)*16+(Ctamano[1]-48);
            pc.printf("\r\nNumero de caracteres del mensaje entrante %d \r\n", ta);
            pc.printf("\r\nPosicion de los datos en el mensaje PDU  %d \r\n", tam-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] = buffer[52+i];
            }
            // Inicia la convercion de PDU a Texto
            pc.printf("\r\n>>>>>>>>>>>>>>>>>>>>> Convirtiendo de PDU a texto <<<<<<<<<<<<<<<<<<<<<\r\n");
            lenIN = strlen(Cdato)/2;
            w = 0;
            pc.printf("\r\nTamano de los datos %d \r\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];
                    pc.printf("\r\nDatos en hexagesimal DE[%d] %2X \r\n", w, dE[w]);                            // Se guarda la dupla en el vector dE
                    w++;
                }
            }
            lenOUT = lenIN*8/7;
            k = 7;
            c = 0;
            dS[0] = dE[0] & 0x7F;
            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;
                pc.printf("%2X,%d,%d\r\n",dS[i],i,k);
                if (k==0) {
                    k = 8;
                    c++;
                }
                k--;
            }
            pc.printf("\r\nMensaje entrante: ");
            for (i = 0; i < lenOUT; i++) {
                pc.printf("%c",dS[i]);
            }
            pc.printf("\r\n>>>>>>>>>>> Termina convercion de los datos de PDU a texto <<<<<<<<<<<<\r\n");
        }

        std::string strC ("Coordenada");                                                                        // cadenas para comparar el mensaje recibido

        if(strC.compare(dS) == 0) {                                                                             // En caso de que se pidan las coordenadas
            pc.printf("\r\n>>>>>>>>>>>>>>>>>>>>>>>> Recibido: Coordenada <<<<<<<<<<<<<<<<<<<<<<<<<\n");
            pc.printf("\r\nEsperando GPS \r\n");

            while(1) {
                i = 0;
                if(gps.sample() && i == 0) {
                    pc.printf("\r\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Leyendo GPS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n");
                    //Toma de datos del gps y concatenacion para armar los datos.
                    lon = gps.longitude+50;
                    lat = gps.latitude;
                    sprintf(vector1, "%f", lat);
                    strcat(link,vector1);
                    strcat(link,",");
                    sprintf(vector2, "%f", lon);
                    strcat(link,vector2);
                    strcat(dEs,link);
                    pc.printf("%s\n",link);
                    // Conversion de los datos "link" a formato 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;
                            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));
                    pc.printf("\r\n>>>>>>>>>>>>>>>>> Comienza el envio del mensaje SMS <<<<<<<<<<<<<<<<<<\r\n");

                    if(lenOUT%2==0) {
                        w = 27;
                    } else {
                        w = 26;
                    }
                    gsm.printf("AT+CMGS=%d\r\n", ((2*lenOUT)+w)/2);                                             // Inicia 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 de destino
                        gsm.printf("%c", Cnumero[i]);
                        pc.printf("%c", Cnumero[i]);

                    }

                    gsm.printf("000AA");                                                                        // segundo relleno
                    pc.printf("000AA");

                    gsm.printf("%2X",lenIN);                                                                    // longitud de los datos
                    pc.printf("%2X",lenIN);


                    for (i = 0; i < lenOUT; i++) {
                        gsm.printf("%02X",dSs[i]&0x000000FF);
                        pc.printf("%02X",dSs[i]&0x000000FF);
                        wait(0.1);
                    }
                    gsm.putc((char)0x1A);
                    gsm.scanf("%s",buffer);                                                                     // lectura respuesta del modem
                    gsm.scanf("%s",buffer);
                    pc.printf("\r\nRespuesta movil: %s \r\n",buffer);
                    i = 1;
                    gsm.printf("AT+CMGD=1\r\n");

                    for(i = 26; i <= strlen(link); i++) {
                        link[i] = NULL;

                    }

                    for(i = 0; i <= 255; i++) {
                        dSs[i] = NULL;
                        dEs[i] = NULL;
                    }

                    pc.printf("\r\n Se sale de while  para la lectura de gps \r\n ");
                    gsm.scanf("%s",buffer);
                    pc.printf(">%s",buffer);
                    goto xt;
                }
            }
        }

        if(strC.compare(dS) != 0) {
            pc.printf("\r\nMensaje no valido\r\n");
            gsm.printf("AT+CMGD=1\r\n");                                                                    // Borrar el mensaje
            gsm.scanf("%s",buffer);
            pc.printf("\n%s\n",buffer);
        }

xt:
        gsm.scanf("%s",buffer);
        pc.printf("%s",buffer);
    }
}