Rastreador satelital por mensajes de texto SMS

Dependencies:   GPS mbed

Revision:
0:e48cba9116f6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed May 25 23:20:17 2016 +0000
@@ -0,0 +1,340 @@
+/*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);
+    }
+}
\ No newline at end of file