Rastreador satelital por mensajes de texto SMS

Dependencies:   GPS mbed

Files at this revision

API Documentation at this revision

Comitter:
satelite
Date:
Wed May 25 23:20:17 2016 +0000
Commit message:
Rastreador satelital por mensajes de texto SMS

Changed in this revision

GPS.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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS.lib	Wed May 25 23:20:17 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/tony63/code/GPS/#653fe36ca211
--- /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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed May 25 23:20:17 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/7c328cabac7e
\ No newline at end of file