En este programa se presenta un localizador satelital, el cual requiere para su funcionamiento un celular Siemens A56, el cual funciona como módem GSM,un GPS (en este caso se tiene una simulación en el software Proteus) y un pulsador sencillo.

Dependencies:   mbed DebouncedIn GPS_G

Committer:
AndresTovar96
Date:
Wed Apr 10 22:21:24 2019 +0000
Revision:
0:f115f80141ca
Localizador satelital con boton de panico

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndresTovar96 0:f115f80141ca 1 /*
AndresTovar96 0:f115f80141ca 2 Esta tarea se realizó con base en los programas del repositorio del profesor Gustavo Ramírez (tony63)
AndresTovar96 0:f115f80141ca 3 Algunos de los programas utilizados fueron:
AndresTovar96 0:f115f80141ca 4 - ALARMA_FINCA_GSM7
AndresTovar96 0:f115f80141ca 5 - GoogleMapa
AndresTovar96 0:f115f80141ca 6 - gsmrecibe1
AndresTovar96 0:f115f80141ca 7 - pdu2
AndresTovar96 0:f115f80141ca 8
AndresTovar96 0:f115f80141ca 9 Para la implementación del programa, se requiere un celular Siemens A56 (el cual
AndresTovar96 0:f115f80141ca 10 debe tener una SIM con saldo disponible para el envío de mensajes) y un GPS virtual
AndresTovar96 0:f115f80141ca 11 cuya simulación se realiza mediante el software Proteus.
AndresTovar96 0:f115f80141ca 12 Con este programa, el usuario podrá conocer la ubicación del dispositivo (la cual
AndresTovar96 0:f115f80141ca 13 será proporcionada por el GPS virtual) realizando el envío de un mensaje de texto
AndresTovar96 0:f115f80141ca 14 a dicho dispositivo. La ubicación llegará al usuario en un mensaje de texto con
AndresTovar96 0:f115f80141ca 15 un enlace que lo dirigirá a la página de Google Maps, con el mapa centrado en la
AndresTovar96 0:f115f80141ca 16 ubicación del dispositivo.
AndresTovar96 0:f115f80141ca 17 Además de esto, el programa permite la implementación de un botón de pánico, cuyo
AndresTovar96 0:f115f80141ca 18 funcionamiento es sencillo por medio de un pulsador. Cuando este se acciona, se
AndresTovar96 0:f115f80141ca 19 envía un mensaje de texto a un número previamente definido con la palabra SOS.
AndresTovar96 0:f115f80141ca 20 */
AndresTovar96 0:f115f80141ca 21 //Declaración de librerías a usar en el programa
AndresTovar96 0:f115f80141ca 22 #include "mbed.h"
AndresTovar96 0:f115f80141ca 23 #include "DebouncedIn.h"
AndresTovar96 0:f115f80141ca 24 #include "stdio.h"
AndresTovar96 0:f115f80141ca 25 #include "string.h"
AndresTovar96 0:f115f80141ca 26 #include "GPS.h"
AndresTovar96 0:f115f80141ca 27
AndresTovar96 0:f115f80141ca 28 DigitalIn sw(PTD6,PullUp); // Se declara un pulsador sw como entrada digital, además se incluye la resistencia PullUp para evitar un cortocircuito en el accionamiento
AndresTovar96 0:f115f80141ca 29
AndresTovar96 0:f115f80141ca 30 //Indicadores de estado
AndresTovar96 0:f115f80141ca 31 Timer t;
AndresTovar96 0:f115f80141ca 32 DigitalOut LedVerde(LED2);
AndresTovar96 0:f115f80141ca 33 DigitalOut LedRojo(LED1);
AndresTovar96 0:f115f80141ca 34 DigitalOut LedAzul(LED3);
AndresTovar96 0:f115f80141ca 35
AndresTovar96 0:f115f80141ca 36 //Declaración de puertos
AndresTovar96 0:f115f80141ca 37 Serial GSM(PTE0,PTE1); // Módem GSM
AndresTovar96 0:f115f80141ca 38 Serial pc(USBTX,USBRX); // Terminal en el PC
AndresTovar96 0:f115f80141ca 39 GPS gps(PTE22, PTE23); // GPS (Virtual corriendo en Proteus)
AndresTovar96 0:f115f80141ca 40
AndresTovar96 0:f115f80141ca 41 // Declaración de variables
AndresTovar96 0:f115f80141ca 42 // Cadenas
AndresTovar96 0:f115f80141ca 43 char DE[255];
AndresTovar96 0:f115f80141ca 44 char DS[255];
AndresTovar96 0:f115f80141ca 45 char buffer[512]; //
AndresTovar96 0:f115f80141ca 46 char resp[6];
AndresTovar96 0:f115f80141ca 47 char tam[2];
AndresTovar96 0:f115f80141ca 48 char mensaje[100];
AndresTovar96 0:f115f80141ca 49
AndresTovar96 0:f115f80141ca 50 //Variables y caracteres
AndresTovar96 0:f115f80141ca 51 int count;
AndresTovar96 0:f115f80141ca 52 int i, K, LENIN, LENOUT, C;
AndresTovar96 0:f115f80141ca 53 int c=0;
AndresTovar96 0:f115f80141ca 54 char r[]="";
AndresTovar96 0:f115f80141ca 55 char msg[256];
AndresTovar96 0:f115f80141ca 56 int ind;
AndresTovar96 0:f115f80141ca 57 int ret = 1;
AndresTovar96 0:f115f80141ca 58
AndresTovar96 0:f115f80141ca 59 // Esta cadena almacenará el número desde el cual fue enviado el mensaje
AndresTovar96 0:f115f80141ca 60 char tel[15];
AndresTovar96 0:f115f80141ca 61
AndresTovar96 0:f115f80141ca 62 // Coordenadas del GPS virtual
AndresTovar96 0:f115f80141ca 63 float lo,la;
AndresTovar96 0:f115f80141ca 64 char clo[255], cla[255];
AndresTovar96 0:f115f80141ca 65 char la_lo[255];
AndresTovar96 0:f115f80141ca 66
AndresTovar96 0:f115f80141ca 67 // Formato enlace Google Maps
AndresTovar96 0:f115f80141ca 68 char http2[255];
AndresTovar96 0:f115f80141ca 69 char http[] = "http://maps.google.com/maps?q=";
AndresTovar96 0:f115f80141ca 70 char buf[100];
AndresTovar96 0:f115f80141ca 71
AndresTovar96 0:f115f80141ca 72 // Secciones de relleno en la cadena del mensaje
AndresTovar96 0:f115f80141ca 73 char relleno1[] = "0011000A91";
AndresTovar96 0:f115f80141ca 74 char relleno2[] = "0000AA";
AndresTovar96 0:f115f80141ca 75
AndresTovar96 0:f115f80141ca 76 // Funciones
AndresTovar96 0:f115f80141ca 77 void callback(){
AndresTovar96 0:f115f80141ca 78 // Note: you need to actually read from the serial to clear the RX interrupt
AndresTovar96 0:f115f80141ca 79 pc.printf("%c\n", GSM.getc());
AndresTovar96 0:f115f80141ca 80 }
AndresTovar96 0:f115f80141ca 81
AndresTovar96 0:f115f80141ca 82 // Esta funcion de abajo lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de
AndresTovar96 0:f115f80141ca 83 // $, count es lo que va a leer. Lo leido lo mete en buffer que es una cadena previamente definida
AndresTovar96 0:f115f80141ca 84 // incorpora medida de tiempo si se demora mas de tres segundos retorna fracaso con -1
AndresTovar96 0:f115f80141ca 85 int readBuffer(char *buffer,int count){
AndresTovar96 0:f115f80141ca 86 int i=0;
AndresTovar96 0:f115f80141ca 87 t.start(); // start timer
AndresTovar96 0:f115f80141ca 88 while(1) {
AndresTovar96 0:f115f80141ca 89 while (GSM.readable()) {
AndresTovar96 0:f115f80141ca 90 char c = GSM.getc();
AndresTovar96 0:f115f80141ca 91 if (c == '\r' || c == '\n') c = '$';
AndresTovar96 0:f115f80141ca 92 buffer[i++] = c;
AndresTovar96 0:f115f80141ca 93 if(i > count)break;
AndresTovar96 0:f115f80141ca 94 }
AndresTovar96 0:f115f80141ca 95 if(i > count)break;
AndresTovar96 0:f115f80141ca 96 if(t.read() > 3) {
AndresTovar96 0:f115f80141ca 97 t.stop();
AndresTovar96 0:f115f80141ca 98 t.reset();
AndresTovar96 0:f115f80141ca 99 break;
AndresTovar96 0:f115f80141ca 100 }
AndresTovar96 0:f115f80141ca 101 }
AndresTovar96 0:f115f80141ca 102 wait(0.5);
AndresTovar96 0:f115f80141ca 103 while(GSM.readable()){ // display the other thing..
AndresTovar96 0:f115f80141ca 104 char c = GSM.getc();
AndresTovar96 0:f115f80141ca 105 }
AndresTovar96 0:f115f80141ca 106 return 0;
AndresTovar96 0:f115f80141ca 107 }
AndresTovar96 0:f115f80141ca 108
AndresTovar96 0:f115f80141ca 109 // Esta función de abajo limpia o borra todo un "buffer" de tamaño "count",
AndresTovar96 0:f115f80141ca 110 // lo revisa elemento por elemento y le mete el caracter null que indica fin de cadena.
AndresTovar96 0:f115f80141ca 111 // No retorna nada.
AndresTovar96 0:f115f80141ca 112 void cleanBuffer(char *buffer, int count){
AndresTovar96 0:f115f80141ca 113 for(int i=0; i < count; i++) {
AndresTovar96 0:f115f80141ca 114 buffer[i] = '\0';
AndresTovar96 0:f115f80141ca 115 }
AndresTovar96 0:f115f80141ca 116 }
AndresTovar96 0:f115f80141ca 117
AndresTovar96 0:f115f80141ca 118 // Esta función de abajo envia un comando parametrizado como cadena
AndresTovar96 0:f115f80141ca 119 // puede ser un comando tipo AT.
AndresTovar96 0:f115f80141ca 120 void sendCmd(char *cmd){
AndresTovar96 0:f115f80141ca 121 GSM.puts(cmd);
AndresTovar96 0:f115f80141ca 122 }
AndresTovar96 0:f115f80141ca 123
AndresTovar96 0:f115f80141ca 124 // Esta función de abajo espera la respuesta de un comando que debe ser idéntica a la cadena "resp" y un tiempo "timeout",
AndresTovar96 0:f115f80141ca 125 // si todo sale bien retorna un cero que en la programacion hay que validar,
AndresTovar96 0:f115f80141ca 126 // si algo sale mal (no se parece o se demora mucho) retorna -1 que debera validarse con alguna expresion logica.
AndresTovar96 0:f115f80141ca 127 int waitForResp(char *resp, int timeout){
AndresTovar96 0:f115f80141ca 128 int len = strlen(resp);
AndresTovar96 0:f115f80141ca 129 int sum=0;
AndresTovar96 0:f115f80141ca 130 t.start();
AndresTovar96 0:f115f80141ca 131
AndresTovar96 0:f115f80141ca 132 while(1) {
AndresTovar96 0:f115f80141ca 133 if(GSM.readable()) {
AndresTovar96 0:f115f80141ca 134 char c = GSM.getc();
AndresTovar96 0:f115f80141ca 135 sum = (c==resp[sum]) ? sum+1 : 0;// esta linea de C# sum se incrementa o se hace cero segun c
AndresTovar96 0:f115f80141ca 136 if(sum == len)break; //ya acabo se sale
AndresTovar96 0:f115f80141ca 137 }
AndresTovar96 0:f115f80141ca 138 if(t.read() > timeout) { // time out chequea el tiempo minimo antes de salir perdiendo
AndresTovar96 0:f115f80141ca 139 t.stop();
AndresTovar96 0:f115f80141ca 140 t.reset();
AndresTovar96 0:f115f80141ca 141 return -1;
AndresTovar96 0:f115f80141ca 142 }
AndresTovar96 0:f115f80141ca 143 }
AndresTovar96 0:f115f80141ca 144 t.stop(); // stop timer antes de retornar
AndresTovar96 0:f115f80141ca 145 t.reset(); // clear timer
AndresTovar96 0:f115f80141ca 146 while(GSM.readable()) { // display the other thing..
AndresTovar96 0:f115f80141ca 147 char c = GSM.getc();
AndresTovar96 0:f115f80141ca 148 }
AndresTovar96 0:f115f80141ca 149 return 0;
AndresTovar96 0:f115f80141ca 150 }
AndresTovar96 0:f115f80141ca 151
AndresTovar96 0:f115f80141ca 152 // Esta función es muy completa y útil, se encarga de enviar el comando y esperar la respuesta.
AndresTovar96 0:f115f80141ca 153 // Si todo sale bien retorna un cero
AndresTovar96 0:f115f80141ca 154 int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout){
AndresTovar96 0:f115f80141ca 155 sendCmd(cmd);
AndresTovar96 0:f115f80141ca 156 return waitForResp(resp,timeout);
AndresTovar96 0:f115f80141ca 157 }
AndresTovar96 0:f115f80141ca 158
AndresTovar96 0:f115f80141ca 159 // Esta función verifica si el módem GSM está activo o conectado
AndresTovar96 0:f115f80141ca 160 int powerCheck(void){
AndresTovar96 0:f115f80141ca 161 return sendCmdAndWaitForResp("AT\r\n", "OK", 2);
AndresTovar96 0:f115f80141ca 162 }
AndresTovar96 0:f115f80141ca 163
AndresTovar96 0:f115f80141ca 164 // Esta función revisa el estado de la tarjeta SIM
AndresTovar96 0:f115f80141ca 165 int checkSIMStatus(void){
AndresTovar96 0:f115f80141ca 166 char gprsBuffer[30];
AndresTovar96 0:f115f80141ca 167 int count = 0;
AndresTovar96 0:f115f80141ca 168 cleanBuffer(gprsBuffer, 30);
AndresTovar96 0:f115f80141ca 169 while(count < 3){
AndresTovar96 0:f115f80141ca 170 sendCmd("AT+CPIN?\r\n");
AndresTovar96 0:f115f80141ca 171 readBuffer(gprsBuffer,30);
AndresTovar96 0:f115f80141ca 172 if((NULL != strstr(gprsBuffer,"+CPIN: READY"))){
AndresTovar96 0:f115f80141ca 173 break;
AndresTovar96 0:f115f80141ca 174 }
AndresTovar96 0:f115f80141ca 175 count++;
AndresTovar96 0:f115f80141ca 176 wait(1);
AndresTovar96 0:f115f80141ca 177 }
AndresTovar96 0:f115f80141ca 178
AndresTovar96 0:f115f80141ca 179 if(count == 3){
AndresTovar96 0:f115f80141ca 180 return -1;
AndresTovar96 0:f115f80141ca 181 }
AndresTovar96 0:f115f80141ca 182 return 0;
AndresTovar96 0:f115f80141ca 183 }
AndresTovar96 0:f115f80141ca 184
AndresTovar96 0:f115f80141ca 185 // Esta función verifica la calidad de la señal
AndresTovar96 0:f115f80141ca 186 int checkSignalStrength(void){
AndresTovar96 0:f115f80141ca 187 char gprsBuffer[100];
AndresTovar96 0:f115f80141ca 188 int index, count = 0;
AndresTovar96 0:f115f80141ca 189 cleanBuffer(gprsBuffer,100);
AndresTovar96 0:f115f80141ca 190 while(count < 3){
AndresTovar96 0:f115f80141ca 191 sendCmd("AT+CSQ\r\n");
AndresTovar96 0:f115f80141ca 192 readBuffer(gprsBuffer,25);
AndresTovar96 0:f115f80141ca 193 if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) {
AndresTovar96 0:f115f80141ca 194 break;
AndresTovar96 0:f115f80141ca 195 }
AndresTovar96 0:f115f80141ca 196 count++;
AndresTovar96 0:f115f80141ca 197 wait(1);
AndresTovar96 0:f115f80141ca 198 }
AndresTovar96 0:f115f80141ca 199 if(count == 3){
AndresTovar96 0:f115f80141ca 200 return -1;
AndresTovar96 0:f115f80141ca 201 }
AndresTovar96 0:f115f80141ca 202 return index;
AndresTovar96 0:f115f80141ca 203 }
AndresTovar96 0:f115f80141ca 204
AndresTovar96 0:f115f80141ca 205 // Esta funcion permite configurar el módem para la recepción/envío de mensajes
AndresTovar96 0:f115f80141ca 206 // Si alguno de estos códigos tarda más de 3 segundos en ejecutarse, arrojará un error
AndresTovar96 0:f115f80141ca 207 int init(){
AndresTovar96 0:f115f80141ca 208 if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3)){ //Verifica que haya conexión con el módem GSM
AndresTovar96 0:f115f80141ca 209 return -1;
AndresTovar96 0:f115f80141ca 210 }
AndresTovar96 0:f115f80141ca 211 if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 3)){ //Establece que los mensajes sean enviados a la SIM
AndresTovar96 0:f115f80141ca 212 return -1;
AndresTovar96 0:f115f80141ca 213 }
AndresTovar96 0:f115f80141ca 214 if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 3)){ //Da formato a los mensajes como PDU, no como texto
AndresTovar96 0:f115f80141ca 215 return -1;
AndresTovar96 0:f115f80141ca 216 }
AndresTovar96 0:f115f80141ca 217 if (0 != sendCmdAndWaitForResp("AT+CBST=7,0,1\r\n", "OK", 3)){ //Velocidad de transmisión: 9600
AndresTovar96 0:f115f80141ca 218 return -1;
AndresTovar96 0:f115f80141ca 219 }
AndresTovar96 0:f115f80141ca 220 if (0 != sendCmdAndWaitForResp("ATE\r\n", "OK", 3)){ //Asociado al eco en el módem GSM
AndresTovar96 0:f115f80141ca 221 return -1;
AndresTovar96 0:f115f80141ca 222 }
AndresTovar96 0:f115f80141ca 223 LedVerde=0; //Indicador de configuración correcta
AndresTovar96 0:f115f80141ca 224 return 0;
AndresTovar96 0:f115f80141ca 225 }
AndresTovar96 0:f115f80141ca 226
AndresTovar96 0:f115f80141ca 227 // Esta función se encarga de leer un mensaje, el cual tiene una ubicación en la memoria determinada por el índice index
AndresTovar96 0:f115f80141ca 228 int readSMSpdu(char *message, int index){
AndresTovar96 0:f115f80141ca 229 int i = 0;
AndresTovar96 0:f115f80141ca 230 char gprsBuffer[100];
AndresTovar96 0:f115f80141ca 231 char *p,*s;
AndresTovar96 0:f115f80141ca 232 GSM.printf("AT+CMGR=%d\r\n",index);
AndresTovar96 0:f115f80141ca 233 cleanBuffer(gprsBuffer,100);
AndresTovar96 0:f115f80141ca 234 readBuffer(gprsBuffer,100);
AndresTovar96 0:f115f80141ca 235 if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) {
AndresTovar96 0:f115f80141ca 236 return -1;
AndresTovar96 0:f115f80141ca 237 }
AndresTovar96 0:f115f80141ca 238 if(NULL != ( s = strstr(gprsBuffer,"+32"))) {
AndresTovar96 0:f115f80141ca 239 p = s + 6;
AndresTovar96 0:f115f80141ca 240 while((*p != '$')&&(i < 5)) {
AndresTovar96 0:f115f80141ca 241 message[i++] = *(p++);
AndresTovar96 0:f115f80141ca 242 }
AndresTovar96 0:f115f80141ca 243 message[i] = '\0';
AndresTovar96 0:f115f80141ca 244 }
AndresTovar96 0:f115f80141ca 245 return 0;
AndresTovar96 0:f115f80141ca 246 }
AndresTovar96 0:f115f80141ca 247
AndresTovar96 0:f115f80141ca 248 // Esta función elimina los mensajes del módem GSM
AndresTovar96 0:f115f80141ca 249 int deleteSMS(int index){
AndresTovar96 0:f115f80141ca 250 char cmd[32];
AndresTovar96 0:f115f80141ca 251 snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index);
AndresTovar96 0:f115f80141ca 252 sendCmd(cmd);
AndresTovar96 0:f115f80141ca 253 return 0;
AndresTovar96 0:f115f80141ca 254 }
AndresTovar96 0:f115f80141ca 255
AndresTovar96 0:f115f80141ca 256 // Configuración de la comunicación de los puertos
AndresTovar96 0:f115f80141ca 257 int main(){
AndresTovar96 0:f115f80141ca 258 GSM.baud(9600);//Velocidad de transmisión
AndresTovar96 0:f115f80141ca 259 GSM.format(8,Serial::None,1);
AndresTovar96 0:f115f80141ca 260 LedVerde = 1; //Apaga LED verde
AndresTovar96 0:f115f80141ca 261 LedRojo = 1; //Apaga LED rojo
AndresTovar96 0:f115f80141ca 262 LedAzul = 1; //Apaga LED azul
AndresTovar96 0:f115f80141ca 263 LedRojo = 0; // Enciende LED rojo
AndresTovar96 0:f115f80141ca 264
AndresTovar96 0:f115f80141ca 265 // Configuración del módem GSM
AndresTovar96 0:f115f80141ca 266 inicio1:
AndresTovar96 0:f115f80141ca 267 ret = init();
AndresTovar96 0:f115f80141ca 268 if(ret==0){
AndresTovar96 0:f115f80141ca 269 LedRojo = 1;
AndresTovar96 0:f115f80141ca 270 LedVerde = 0; //Se enciende LED verde
AndresTovar96 0:f115f80141ca 271 pc.printf("La configuracion del modem es correcta\n");
AndresTovar96 0:f115f80141ca 272 }
AndresTovar96 0:f115f80141ca 273 else{
AndresTovar96 0:f115f80141ca 274 wait(1);
AndresTovar96 0:f115f80141ca 275 goto inicio1;
AndresTovar96 0:f115f80141ca 276 }
AndresTovar96 0:f115f80141ca 277
AndresTovar96 0:f115f80141ca 278 while(1){
AndresTovar96 0:f115f80141ca 279 if (GSM.readable()){
AndresTovar96 0:f115f80141ca 280 readBuffer(buffer,110); //Lee el búfer
AndresTovar96 0:f115f80141ca 281 for(i=0; i<5; i++){
AndresTovar96 0:f115f80141ca 282 resp[i] = buffer[i]; //Almacena la lectura del búfer en resp
AndresTovar96 0:f115f80141ca 283 }
AndresTovar96 0:f115f80141ca 284
AndresTovar96 0:f115f80141ca 285 if(strcmp("$$+CM", resp) == 0){ //Verifica la llegada de nuevos mensajes comparando la lectura del búfer con el comando AT
AndresTovar96 0:f115f80141ca 286 pc.printf("\nMensaje recibido\r\n"); //Se muestra el aviso de mensaje nuevo
AndresTovar96 0:f115f80141ca 287 cleanBuffer(buffer,10); //Limpia el búfer
AndresTovar96 0:f115f80141ca 288 GSM.printf("AT+CMGL=0\r\n"); //Este comando realiza la extracción del mensaje desde el módem GSM
AndresTovar96 0:f115f80141ca 289 readBuffer(buffer,110); //Lee el búfer nuevamente
AndresTovar96 0:f115f80141ca 290
AndresTovar96 0:f115f80141ca 291 // Esta sección del programa reorganiza los números del teléfono desde el cual se envía el mensaje y muestra dicho número
AndresTovar96 0:f115f80141ca 292 for(i=0; i<10; i++){
AndresTovar96 0:f115f80141ca 293 tel[i] = buffer[i+40];
AndresTovar96 0:f115f80141ca 294 }
AndresTovar96 0:f115f80141ca 295 pc.printf("\nNumero desde el cual se envio el mensaje: %c%c%c%c%c%c%c%c%c%c\r\n", tel[1], tel[0], tel[3], tel[2], tel[5], tel[4], tel[7], tel[6], tel[9], tel[8]);
AndresTovar96 0:f115f80141ca 296
AndresTovar96 0:f115f80141ca 297 // En esta sección se lee el tamaño del mensaje
AndresTovar96 0:f115f80141ca 298 for(i=0;i<2;i++){
AndresTovar96 0:f115f80141ca 299 tam[i] = buffer[i+68]; //Lee el tamaño del mensaje a partir de la posición 68 del búfer
AndresTovar96 0:f115f80141ca 300 }
AndresTovar96 0:f115f80141ca 301
AndresTovar96 0:f115f80141ca 302 // En esta sección se lee el mensaje
AndresTovar96 0:f115f80141ca 303 for(i=0;i<26;i++){
AndresTovar96 0:f115f80141ca 304 msg[i] = buffer[i+70]; // Lee un mensaje de máximo 26 caracteres a partir la posición 70 del búfer
AndresTovar96 0:f115f80141ca 305 }
AndresTovar96 0:f115f80141ca 306
AndresTovar96 0:f115f80141ca 307 deleteSMS(1); //Elimina los mensajes que estén almacenados en el índice especificado de la memoria, en este caso 1
AndresTovar96 0:f115f80141ca 308 readBuffer(buffer, 200); //Se lee el búfer nuevamente
AndresTovar96 0:f115f80141ca 309 /*
AndresTovar96 0:f115f80141ca 310 En esta sección del programa se compara el mensaje que llegó al
AndresTovar96 0:f115f80141ca 311 teléfono con el mensaje deseado, el cual es "Donde estas?"
AndresTovar96 0:f115f80141ca 312 El código para el mensaje deseado es "C4B79B5C0695E7F4F0FC07"
AndresTovar96 0:f115f80141ca 313 */
AndresTovar96 0:f115f80141ca 314 if(strncmp("C4B79B5C0695E7F4F0FC07", msg, 22) == 0){
AndresTovar96 0:f115f80141ca 315
AndresTovar96 0:f115f80141ca 316 LedVerde = 1;
AndresTovar96 0:f115f80141ca 317 LedAzul = 0; //Enciende el LED azul, indicando que el mensaje esperado es igual al mensaje recibido
AndresTovar96 0:f115f80141ca 318 LedRojo = 1;
AndresTovar96 0:f115f80141ca 319 wait(3);
AndresTovar96 0:f115f80141ca 320 // Como el mensaje esperado es igual al recibido, se realiza la lectura de las coordenadas del GPS para enviarlas
AndresTovar96 0:f115f80141ca 321 if(gps.sample()){ //
AndresTovar96 0:f115f80141ca 322 la = gps.latitude; //Coordenada de latitud
AndresTovar96 0:f115f80141ca 323 lo = gps.longitude; //Coordenada de longitud
AndresTovar96 0:f115f80141ca 324
AndresTovar96 0:f115f80141ca 325 // Latitud
AndresTovar96 0:f115f80141ca 326 sprintf (cla, "%f", la);
AndresTovar96 0:f115f80141ca 327 pc.printf ( "\nLatitud = %s\n",cla); //Se muestra la latitud obtenida en el GPS
AndresTovar96 0:f115f80141ca 328
AndresTovar96 0:f115f80141ca 329 //Longitud
AndresTovar96 0:f115f80141ca 330 sprintf (clo, "%f", lo);
AndresTovar96 0:f115f80141ca 331 pc.printf ("\nLongitud = %s\n",clo); //Se muestra la longitud obtenida en el GPS
AndresTovar96 0:f115f80141ca 332
AndresTovar96 0:f115f80141ca 333
AndresTovar96 0:f115f80141ca 334 // Se concatenan las coordenadas
AndresTovar96 0:f115f80141ca 335 strcpy(la_lo,cla);
AndresTovar96 0:f115f80141ca 336 strcat(la_lo,",");
AndresTovar96 0:f115f80141ca 337 strcat(la_lo,clo);
AndresTovar96 0:f115f80141ca 338
AndresTovar96 0:f115f80141ca 339 //Ajuste de la cadena al formato del enlace de Google Maps
AndresTovar96 0:f115f80141ca 340 strcpy(DE,http);
AndresTovar96 0:f115f80141ca 341 strcat(DE,la_lo);
AndresTovar96 0:f115f80141ca 342 pc.printf("\nUbicacion en Google Maps: %s\n",DE);
AndresTovar96 0:f115f80141ca 343 pc.printf("\n");
AndresTovar96 0:f115f80141ca 344 LENIN = strlen(DE);
AndresTovar96 0:f115f80141ca 345
AndresTovar96 0:f115f80141ca 346 //En esta sección se realiza la conversión de la cadena a octetos
AndresTovar96 0:f115f80141ca 347 K = 0;
AndresTovar96 0:f115f80141ca 348 C = 0;
AndresTovar96 0:f115f80141ca 349 for (i = 0; i < LENIN; i++){
AndresTovar96 0:f115f80141ca 350 DS[i] = DE[i + C] >> K | DE[i + C + 1] << (7 - K);
AndresTovar96 0:f115f80141ca 351 if(DS[i] == 0x00) {LENOUT = i; goto salir1;}
AndresTovar96 0:f115f80141ca 352 K++;
AndresTovar96 0:f115f80141ca 353 if (K == 7) {K = 0; C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
AndresTovar96 0:f115f80141ca 354 }
AndresTovar96 0:f115f80141ca 355
AndresTovar96 0:f115f80141ca 356 salir1:
AndresTovar96 0:f115f80141ca 357 for (i = 0; i < LENIN; i++){
AndresTovar96 0:f115f80141ca 358 pc.printf("%X", DE[i]);
AndresTovar96 0:f115f80141ca 359 }
AndresTovar96 0:f115f80141ca 360
AndresTovar96 0:f115f80141ca 361 pc.printf(":\r\n");
AndresTovar96 0:f115f80141ca 362 for (i = 0; i < LENOUT; i++){
AndresTovar96 0:f115f80141ca 363 pc.printf("%2X", DS[i]&0x000000FF);
AndresTovar96 0:f115f80141ca 364 }
AndresTovar96 0:f115f80141ca 365 pc.printf("\r\nLENOUT GPS: %d, LENIN GPS: %2X\r\n", LENOUT, LENIN);
AndresTovar96 0:f115f80141ca 366
AndresTovar96 0:f115f80141ca 367 //Se concatena el mensaje en formato PDU para poder enviarlo
AndresTovar96 0:f115f80141ca 368 ind = 14 + LENOUT - 1;
AndresTovar96 0:f115f80141ca 369
AndresTovar96 0:f115f80141ca 370 //En esta sección se utiliza el comando AT para enviar el mensaje y se muestra en la terminal del PC y en el módem GSM
AndresTovar96 0:f115f80141ca 371 GSM.printf("AT+CMGS=%d\r\n",ind);
AndresTovar96 0:f115f80141ca 372 pc.printf("AT+CMGS=%d\r\n",ind);
AndresTovar96 0:f115f80141ca 373 pc.printf(relleno1);
AndresTovar96 0:f115f80141ca 374 GSM.printf(relleno1);
AndresTovar96 0:f115f80141ca 375
AndresTovar96 0:f115f80141ca 376 for (i=0 ;i<=9; i++) {
AndresTovar96 0:f115f80141ca 377 pc.printf("%c",tel[i]);
AndresTovar96 0:f115f80141ca 378 GSM.printf("%c",tel[i]);
AndresTovar96 0:f115f80141ca 379 }
AndresTovar96 0:f115f80141ca 380
AndresTovar96 0:f115f80141ca 381 pc.printf(relleno2);
AndresTovar96 0:f115f80141ca 382 GSM.printf(relleno2);
AndresTovar96 0:f115f80141ca 383 pc.printf("%2X", LENIN);
AndresTovar96 0:f115f80141ca 384 GSM.printf("%2X", LENIN);
AndresTovar96 0:f115f80141ca 385
AndresTovar96 0:f115f80141ca 386 for (i = 0; i < LENOUT; i++){
AndresTovar96 0:f115f80141ca 387 pc.printf("%02X", DS[i]&0x000000FF);
AndresTovar96 0:f115f80141ca 388 GSM.printf("%02X", DS[i]&0x000000FF);
AndresTovar96 0:f115f80141ca 389 }
AndresTovar96 0:f115f80141ca 390 wait(1);
AndresTovar96 0:f115f80141ca 391 GSM.putc((char)0x1A); // Ctrl + Z
AndresTovar96 0:f115f80141ca 392 GSM.scanf("%s",buf); //Devuelve el estado del mensaje (Enviado o no enviado)
AndresTovar96 0:f115f80141ca 393 pc.printf("\n>%s\n",buf);
AndresTovar96 0:f115f80141ca 394 }
AndresTovar96 0:f115f80141ca 395
AndresTovar96 0:f115f80141ca 396 wait(1);
AndresTovar96 0:f115f80141ca 397 LedAzul = 1;
AndresTovar96 0:f115f80141ca 398 LedRojo = 1;
AndresTovar96 0:f115f80141ca 399 LedVerde = 0;
AndresTovar96 0:f115f80141ca 400 GSM.printf("AT+CMGD=0\r\n"); // Borra el mensaje actual (Índice 0 en la memoria).
AndresTovar96 0:f115f80141ca 401 pc.printf("%s\n\n", "El mensaje ha sido borrado del celular");
AndresTovar96 0:f115f80141ca 402 goto inicio1; // Vuelve a la configuración inicial, a la espera de otro mensaje
AndresTovar96 0:f115f80141ca 403 }
AndresTovar96 0:f115f80141ca 404 }
AndresTovar96 0:f115f80141ca 405 }
AndresTovar96 0:f115f80141ca 406 // Esta función permite la implementación del botón de pánico
AndresTovar96 0:f115f80141ca 407 if (sw==0){ // Si se pulsa el botón, envía el siguiente mensaje
AndresTovar96 0:f115f80141ca 408 GSM.printf("AT+CMGS=16\n\r");
AndresTovar96 0:f115f80141ca 409 wait_ms(200);
AndresTovar96 0:f115f80141ca 410 GSM.printf("0011000A9113874094780000AA03D3E714"); // Mensaje SOS
AndresTovar96 0:f115f80141ca 411 wait_ms(200);
AndresTovar96 0:f115f80141ca 412 GSM.putc((char)0x1A); // Ctrl + Z, indicando el final del mensaje
AndresTovar96 0:f115f80141ca 413 wait(10);
AndresTovar96 0:f115f80141ca 414 }
AndresTovar96 0:f115f80141ca 415 else {
AndresTovar96 0:f115f80141ca 416 }
AndresTovar96 0:f115f80141ca 417
AndresTovar96 0:f115f80141ca 418 }
AndresTovar96 0:f115f80141ca 419 }