Este programa cumple la función de devolver una ubicación seleccionada en el GPS usado en proteus al momento de enviar un mensaje de texto preguntando "donde estas?" desde el celular responderá enviando al emisor la ubicación seleccionada.

Dependencies:   DebouncedIn GPS_G mbed

Committer:
Alex_Arenas
Date:
Tue Jun 05 14:49:44 2018 +0000
Revision:
0:55b583763afc
Este programa cumple la funci?n de devolver una ubicaci?n  seleccionada en el GPS  usado en proteus al momento de enviar un mensaje de texto preguntando "donde estas?" desde el celular responder? enviando al emisor la ubicaci?n seleccionada.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Alex_Arenas 0:55b583763afc 1 #include "mbed.h"
Alex_Arenas 0:55b583763afc 2 #include "DebouncedIn.h"
Alex_Arenas 0:55b583763afc 3 #include "stdio.h"
Alex_Arenas 0:55b583763afc 4 #include "string.h"
Alex_Arenas 0:55b583763afc 5 #include "GPS.h"
Alex_Arenas 0:55b583763afc 6
Alex_Arenas 0:55b583763afc 7 //LEDS PARA VER EL ESTADO DEL PROGRAMA
Alex_Arenas 0:55b583763afc 8 Timer t;
Alex_Arenas 0:55b583763afc 9 DigitalOut LedVerde(LED2);
Alex_Arenas 0:55b583763afc 10 DigitalOut LedRojo(LED1);
Alex_Arenas 0:55b583763afc 11 DigitalOut LedAzul(LED3);
Alex_Arenas 0:55b583763afc 12
Alex_Arenas 0:55b583763afc 13 // PUERTOS PARA LA COMUNICACIÓN SERIAL
Alex_Arenas 0:55b583763afc 14 Serial GSM(PTE0,PTE1); // MODEM
Alex_Arenas 0:55b583763afc 15 Serial pc(USBTX,USBRX); // VISUALIZACIÓN DEL ESTADO DEL PROGRAMA EN EL PC
Alex_Arenas 0:55b583763afc 16 GPS gps(PTE22, PTE23); // RECEPCIÓN DE DATOS GPS.
Alex_Arenas 0:55b583763afc 17
Alex_Arenas 0:55b583763afc 18 // DECLARACIÓN DE VARIABLES
Alex_Arenas 0:55b583763afc 19 // CADENAS QUE SE USARÁN DURANTE EL PROGRAMA
Alex_Arenas 0:55b583763afc 20 char DE1[255];
Alex_Arenas 0:55b583763afc 21 char DS1[255];
Alex_Arenas 0:55b583763afc 22 char DE2[255];
Alex_Arenas 0:55b583763afc 23 char DS2[255];
Alex_Arenas 0:55b583763afc 24 char buffer[512];
Alex_Arenas 0:55b583763afc 25 char resp[6];
Alex_Arenas 0:55b583763afc 26 char tam[2];
Alex_Arenas 0:55b583763afc 27 char mensaje[100];
Alex_Arenas 0:55b583763afc 28
Alex_Arenas 0:55b583763afc 29 //Variables enteras y caracteres
Alex_Arenas 0:55b583763afc 30 int count;
Alex_Arenas 0:55b583763afc 31 int i, K, LENOUT1, LENIN1, LENOUT2, LENIN2, C;
Alex_Arenas 0:55b583763afc 32 int c=0;
Alex_Arenas 0:55b583763afc 33 char r[]="";
Alex_Arenas 0:55b583763afc 34 char msg[256];
Alex_Arenas 0:55b583763afc 35 char char1;
Alex_Arenas 0:55b583763afc 36 int ind;
Alex_Arenas 0:55b583763afc 37 float med;
Alex_Arenas 0:55b583763afc 38 char outmed[16], outmedn[16];
Alex_Arenas 0:55b583763afc 39 int ret = 1;
Alex_Arenas 0:55b583763afc 40
Alex_Arenas 0:55b583763afc 41 // DEDICADA PARA EL TELEFONO QUE ENVIA Y RECIBIRÁ
Alex_Arenas 0:55b583763afc 42 char tel[15];
Alex_Arenas 0:55b583763afc 43
Alex_Arenas 0:55b583763afc 44 // COORDENADAS GPS EN LATITUD Y LONGITUD
Alex_Arenas 0:55b583763afc 45 float lo,la;
Alex_Arenas 0:55b583763afc 46 char clo[255], cla[255]; // CADENAS PARA LATITUD Y LONGITUD
Alex_Arenas 0:55b583763afc 47 char la_lo[255];//
Alex_Arenas 0:55b583763afc 48
Alex_Arenas 0:55b583763afc 49 // LINK DE GOOGLE MAPS
Alex_Arenas 0:55b583763afc 50 char http2[255];
Alex_Arenas 0:55b583763afc 51 char http[] = "http://maps.google.com/maps?q=";
Alex_Arenas 0:55b583763afc 52 char buf[100];
Alex_Arenas 0:55b583763afc 53
Alex_Arenas 0:55b583763afc 54 // DATOS DE RELLENO PROPIOS DEL SMS.
Alex_Arenas 0:55b583763afc 55 char relle1[] = "0011000A91";
Alex_Arenas 0:55b583763afc 56 char relle2[] = "0000AA";
Alex_Arenas 0:55b583763afc 57
Alex_Arenas 0:55b583763afc 58 // DEFINICIÓN DE FUNCIONES
Alex_Arenas 0:55b583763afc 59 void callback(){
Alex_Arenas 0:55b583763afc 60 // Note: you need to actually read from the serial to clear the RX interrupt
Alex_Arenas 0:55b583763afc 61 pc.printf("%c\n", GSM.getc());
Alex_Arenas 0:55b583763afc 62 }
Alex_Arenas 0:55b583763afc 63
Alex_Arenas 0:55b583763afc 64 // Esta funcion de abajo lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de
Alex_Arenas 0:55b583763afc 65 // $, count es lo que va a leer. Lo leido lo mete en buffer que es una cadena previamente definida
Alex_Arenas 0:55b583763afc 66 // incorpora medida de tiempo si se demora mas de tres segundos retorna fracaso con -1
Alex_Arenas 0:55b583763afc 67 int readBuffer(char *buffer,int count){
Alex_Arenas 0:55b583763afc 68 int i=0;
Alex_Arenas 0:55b583763afc 69 t.start(); // start timer
Alex_Arenas 0:55b583763afc 70 while(1) {
Alex_Arenas 0:55b583763afc 71 while (GSM.readable()) {
Alex_Arenas 0:55b583763afc 72 char c = GSM.getc();
Alex_Arenas 0:55b583763afc 73 if (c == '\r' || c == '\n') c = '$';
Alex_Arenas 0:55b583763afc 74 buffer[i++] = c;
Alex_Arenas 0:55b583763afc 75 if(i > count)break;
Alex_Arenas 0:55b583763afc 76 }
Alex_Arenas 0:55b583763afc 77 if(i > count)break;
Alex_Arenas 0:55b583763afc 78 if(t.read() > 3) {
Alex_Arenas 0:55b583763afc 79 t.stop();
Alex_Arenas 0:55b583763afc 80 t.reset();
Alex_Arenas 0:55b583763afc 81 break;
Alex_Arenas 0:55b583763afc 82 }
Alex_Arenas 0:55b583763afc 83 }
Alex_Arenas 0:55b583763afc 84 wait(0.5);
Alex_Arenas 0:55b583763afc 85 while(GSM.readable()){ // display the other thing..
Alex_Arenas 0:55b583763afc 86 char c = GSM.getc();
Alex_Arenas 0:55b583763afc 87 }
Alex_Arenas 0:55b583763afc 88 return 0;
Alex_Arenas 0:55b583763afc 89 }
Alex_Arenas 0:55b583763afc 90
Alex_Arenas 0:55b583763afc 91 // Esta función de abajo limpia o borra todo un "buffer" de tamaño "count",
Alex_Arenas 0:55b583763afc 92 // lo revisa elemento por elemento y le mete el caracter null que indica fin de cadena.
Alex_Arenas 0:55b583763afc 93 // No retorna nada.
Alex_Arenas 0:55b583763afc 94 void cleanBuffer(char *buffer, int count){
Alex_Arenas 0:55b583763afc 95 for(int i=0; i < count; i++) {
Alex_Arenas 0:55b583763afc 96 buffer[i] = '\0';
Alex_Arenas 0:55b583763afc 97 }
Alex_Arenas 0:55b583763afc 98 }
Alex_Arenas 0:55b583763afc 99
Alex_Arenas 0:55b583763afc 100 // Esta función de abajo envia un comando parametrizado como cadena
Alex_Arenas 0:55b583763afc 101 // puede ser un comando tipo AT.
Alex_Arenas 0:55b583763afc 102 void sendCmd(char *cmd){
Alex_Arenas 0:55b583763afc 103 GSM.puts(cmd);
Alex_Arenas 0:55b583763afc 104 }
Alex_Arenas 0:55b583763afc 105
Alex_Arenas 0:55b583763afc 106 // Esta función de abajo espera la respuesta de un comando que debe ser idéntica a la cadena "resp" y un tiempo "timeout",
Alex_Arenas 0:55b583763afc 107 // si todo sale bien retorna un cero que en la programacion hay que validar,
Alex_Arenas 0:55b583763afc 108 // si algo sale mal (no se parece o se demora mucho) retorna -1 que debera validarse con alguna expresion logica.
Alex_Arenas 0:55b583763afc 109 int waitForResp(char *resp, int timeout){
Alex_Arenas 0:55b583763afc 110 int len = strlen(resp);
Alex_Arenas 0:55b583763afc 111 int sum=0;
Alex_Arenas 0:55b583763afc 112 t.start();
Alex_Arenas 0:55b583763afc 113
Alex_Arenas 0:55b583763afc 114 while(1) {
Alex_Arenas 0:55b583763afc 115 if(GSM.readable()) {
Alex_Arenas 0:55b583763afc 116 char c = GSM.getc();
Alex_Arenas 0:55b583763afc 117 sum = (c==resp[sum]) ? sum+1 : 0;// esta linea de C# sum se incrementa o se hace cero segun c
Alex_Arenas 0:55b583763afc 118 if(sum == len)break; //ya acabo se sale
Alex_Arenas 0:55b583763afc 119 }
Alex_Arenas 0:55b583763afc 120 if(t.read() > timeout) { // time out chequea el tiempo minimo antes de salir perdiendo
Alex_Arenas 0:55b583763afc 121 t.stop();
Alex_Arenas 0:55b583763afc 122 t.reset();
Alex_Arenas 0:55b583763afc 123 return -1;
Alex_Arenas 0:55b583763afc 124 }
Alex_Arenas 0:55b583763afc 125 }
Alex_Arenas 0:55b583763afc 126 t.stop(); // stop timer antes de retornar
Alex_Arenas 0:55b583763afc 127 t.reset(); // clear timer
Alex_Arenas 0:55b583763afc 128 while(GSM.readable()) { // display the other thing..
Alex_Arenas 0:55b583763afc 129 char c = GSM.getc();
Alex_Arenas 0:55b583763afc 130 }
Alex_Arenas 0:55b583763afc 131 return 0;
Alex_Arenas 0:55b583763afc 132 }
Alex_Arenas 0:55b583763afc 133
Alex_Arenas 0:55b583763afc 134 // Esta función es muy completa y útil, se encarga de enviar el comando y esperar la respuesta.
Alex_Arenas 0:55b583763afc 135 // Si todo sale bien retorna un cero
Alex_Arenas 0:55b583763afc 136 int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout){
Alex_Arenas 0:55b583763afc 137 sendCmd(cmd);
Alex_Arenas 0:55b583763afc 138 return waitForResp(resp,timeout);
Alex_Arenas 0:55b583763afc 139 }
Alex_Arenas 0:55b583763afc 140
Alex_Arenas 0:55b583763afc 141 // Esta función chequea que el módem este vivo, envia AT, le contesta con OK y espera 2 segundos.
Alex_Arenas 0:55b583763afc 142 int powerCheck(void){ // Este comando se manda para verificar si el módem esta vivo o conectado.
Alex_Arenas 0:55b583763afc 143 return sendCmdAndWaitForResp("AT\r\n", "OK", 2);
Alex_Arenas 0:55b583763afc 144 }
Alex_Arenas 0:55b583763afc 145
Alex_Arenas 0:55b583763afc 146 // Esta función de abajo chequea el estado de la sim card
Alex_Arenas 0:55b583763afc 147 // y si todo sale bien retorna un cero que en la programacion hay que validar
Alex_Arenas 0:55b583763afc 148 // con alguna expresión lógica.
Alex_Arenas 0:55b583763afc 149 int checkSIMStatus(void){
Alex_Arenas 0:55b583763afc 150 char gprsBuffer[30];
Alex_Arenas 0:55b583763afc 151 int count = 0;
Alex_Arenas 0:55b583763afc 152 cleanBuffer(gprsBuffer, 30);
Alex_Arenas 0:55b583763afc 153 while(count < 3){
Alex_Arenas 0:55b583763afc 154 sendCmd("AT+CPIN?\r\n");
Alex_Arenas 0:55b583763afc 155 readBuffer(gprsBuffer,30);
Alex_Arenas 0:55b583763afc 156 if((NULL != strstr(gprsBuffer,"+CPIN: READY"))){
Alex_Arenas 0:55b583763afc 157 break;
Alex_Arenas 0:55b583763afc 158 }
Alex_Arenas 0:55b583763afc 159 count++;
Alex_Arenas 0:55b583763afc 160 wait(1);
Alex_Arenas 0:55b583763afc 161 }
Alex_Arenas 0:55b583763afc 162
Alex_Arenas 0:55b583763afc 163 if(count == 3){
Alex_Arenas 0:55b583763afc 164 return -1;
Alex_Arenas 0:55b583763afc 165 }
Alex_Arenas 0:55b583763afc 166 return 0;
Alex_Arenas 0:55b583763afc 167 }
Alex_Arenas 0:55b583763afc 168
Alex_Arenas 0:55b583763afc 169 // Esta función de abajo chequea la calidad de la señal
Alex_Arenas 0:55b583763afc 170 // y si todo sale bien retorna con el valor de señal útil o un -1 si no es aceptable, en la programacion hay que validar
Alex_Arenas 0:55b583763afc 171 // con alguna expresión lógica.
Alex_Arenas 0:55b583763afc 172 int checkSignalStrength(void){
Alex_Arenas 0:55b583763afc 173 char gprsBuffer[100];
Alex_Arenas 0:55b583763afc 174 int index, count = 0;
Alex_Arenas 0:55b583763afc 175 cleanBuffer(gprsBuffer,100);
Alex_Arenas 0:55b583763afc 176 while(count < 3){
Alex_Arenas 0:55b583763afc 177 sendCmd("AT+CSQ\r\n");
Alex_Arenas 0:55b583763afc 178 readBuffer(gprsBuffer,25);
Alex_Arenas 0:55b583763afc 179 if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) {
Alex_Arenas 0:55b583763afc 180 break;
Alex_Arenas 0:55b583763afc 181 }
Alex_Arenas 0:55b583763afc 182 count++;
Alex_Arenas 0:55b583763afc 183 wait(1);
Alex_Arenas 0:55b583763afc 184 }
Alex_Arenas 0:55b583763afc 185 if(count == 3){
Alex_Arenas 0:55b583763afc 186 return -1;
Alex_Arenas 0:55b583763afc 187 }
Alex_Arenas 0:55b583763afc 188 return index;
Alex_Arenas 0:55b583763afc 189 }
Alex_Arenas 0:55b583763afc 190
Alex_Arenas 0:55b583763afc 191 // Esta funcion inicaliza el módem.
Alex_Arenas 0:55b583763afc 192 // Se compone de un grupo de subfunciones ya definidas previamente:
Alex_Arenas 0:55b583763afc 193 // primero chequea que este vivo,
Alex_Arenas 0:55b583763afc 194 // segundo chequea el estado de la simcard,
Alex_Arenas 0:55b583763afc 195 // tercero chequea la intencidad de señal celular,
Alex_Arenas 0:55b583763afc 196 // cuarto aplica la configuracion
Alex_Arenas 0:55b583763afc 197 // y si todo sale bien retorna un cero
Alex_Arenas 0:55b583763afc 198 int init(){
Alex_Arenas 0:55b583763afc 199 if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3)){
Alex_Arenas 0:55b583763afc 200 return -1;
Alex_Arenas 0:55b583763afc 201 }
Alex_Arenas 0:55b583763afc 202 if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 3)){
Alex_Arenas 0:55b583763afc 203 return -1;
Alex_Arenas 0:55b583763afc 204 }
Alex_Arenas 0:55b583763afc 205 if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 3)){
Alex_Arenas 0:55b583763afc 206 return -1;
Alex_Arenas 0:55b583763afc 207 }
Alex_Arenas 0:55b583763afc 208 if (0 != sendCmdAndWaitForResp("AT+CBST=7,0,1\r\n", "OK", 3)){ //velocidad fija a 9600
Alex_Arenas 0:55b583763afc 209 return -1;
Alex_Arenas 0:55b583763afc 210 }
Alex_Arenas 0:55b583763afc 211 if (0 != sendCmdAndWaitForResp("ATE\r\n", "OK", 3)){ //se le quita el eco al modem GSM
Alex_Arenas 0:55b583763afc 212 return -1;
Alex_Arenas 0:55b583763afc 213 }
Alex_Arenas 0:55b583763afc 214 LedVerde=0;
Alex_Arenas 0:55b583763afc 215 return 0;
Alex_Arenas 0:55b583763afc 216 }
Alex_Arenas 0:55b583763afc 217
Alex_Arenas 0:55b583763afc 218 // Esta funcion de abajo intenta leer un mensaje de texto en formato PDU o HEX
Alex_Arenas 0:55b583763afc 219 // y si todo sale bien retorna un cero que en la programacion hay que validar
Alex_Arenas 0:55b583763afc 220 // con alguna expresión lógica.
Alex_Arenas 0:55b583763afc 221 int readSMSpdu(char *message, int index){
Alex_Arenas 0:55b583763afc 222 int i = 0;
Alex_Arenas 0:55b583763afc 223 char gprsBuffer[100];
Alex_Arenas 0:55b583763afc 224 char *p,*s;
Alex_Arenas 0:55b583763afc 225 GSM.printf("AT+CMGR=%d\r\n",index);
Alex_Arenas 0:55b583763afc 226 cleanBuffer(gprsBuffer,100);
Alex_Arenas 0:55b583763afc 227 readBuffer(gprsBuffer,100);
Alex_Arenas 0:55b583763afc 228 if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) {
Alex_Arenas 0:55b583763afc 229 return -1;
Alex_Arenas 0:55b583763afc 230 }
Alex_Arenas 0:55b583763afc 231 if(NULL != ( s = strstr(gprsBuffer,"+32"))) {
Alex_Arenas 0:55b583763afc 232 p = s + 6;
Alex_Arenas 0:55b583763afc 233 while((*p != '$')&&(i < 5)) {
Alex_Arenas 0:55b583763afc 234 message[i++] = *(p++);
Alex_Arenas 0:55b583763afc 235 }
Alex_Arenas 0:55b583763afc 236 message[i] = '\0';
Alex_Arenas 0:55b583763afc 237 }
Alex_Arenas 0:55b583763afc 238 return 0;
Alex_Arenas 0:55b583763afc 239 }
Alex_Arenas 0:55b583763afc 240
Alex_Arenas 0:55b583763afc 241 // Esta función de abajo borra mensajes SMS del modem
Alex_Arenas 0:55b583763afc 242 // y si todo sale bien retorna un cero que en la programacion hay que validar
Alex_Arenas 0:55b583763afc 243 // con alguna expresion logica.
Alex_Arenas 0:55b583763afc 244 int deleteSMS(int index){
Alex_Arenas 0:55b583763afc 245 char cmd[32];
Alex_Arenas 0:55b583763afc 246 snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index);
Alex_Arenas 0:55b583763afc 247 sendCmd(cmd);
Alex_Arenas 0:55b583763afc 248 return 0;
Alex_Arenas 0:55b583763afc 249 }
Alex_Arenas 0:55b583763afc 250
Alex_Arenas 0:55b583763afc 251 ////////////////////////////////////////////// FUNCIÓN PRINCIPAL //////////////////////////////////////////////////////////
Alex_Arenas 0:55b583763afc 252 int main(){
Alex_Arenas 0:55b583763afc 253 //configuramos los puertos seriales
Alex_Arenas 0:55b583763afc 254 GSM.baud(9600);//configura los baudios de la FRDMKL25Z en 9600
Alex_Arenas 0:55b583763afc 255 GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART
Alex_Arenas 0:55b583763afc 256 LedVerde = 1; // APAGO LOS LEDS
Alex_Arenas 0:55b583763afc 257 LedRojo = 1;
Alex_Arenas 0:55b583763afc 258 LedAzul = 1;
Alex_Arenas 0:55b583763afc 259 LedRojo = 0; // PRENDO EL LED ROJO
Alex_Arenas 0:55b583763afc 260
Alex_Arenas 0:55b583763afc 261 // CONFIGURACIÓN DEL MODEM GSM (TELEFONO CELULAR SIEMENS A56i).
Alex_Arenas 0:55b583763afc 262 inicio1:
Alex_Arenas 0:55b583763afc 263 ret = init();
Alex_Arenas 0:55b583763afc 264 if(ret==0){
Alex_Arenas 0:55b583763afc 265 LedRojo = 1;
Alex_Arenas 0:55b583763afc 266 LedVerde = 0; //ENCENDER LED VERDE PARA CONFIRMAR LA CONEXIÓN
Alex_Arenas 0:55b583763afc 267 pc.printf("El Modem se ha configurado correctamente\n");
Alex_Arenas 0:55b583763afc 268 }
Alex_Arenas 0:55b583763afc 269 else{
Alex_Arenas 0:55b583763afc 270 wait(1);
Alex_Arenas 0:55b583763afc 271 goto inicio1;
Alex_Arenas 0:55b583763afc 272 }
Alex_Arenas 0:55b583763afc 273
Alex_Arenas 0:55b583763afc 274 while(1){
Alex_Arenas 0:55b583763afc 275 if (GSM.readable()){
Alex_Arenas 0:55b583763afc 276 readBuffer(buffer,110);
Alex_Arenas 0:55b583763afc 277 for(i=0; i<5; i++){
Alex_Arenas 0:55b583763afc 278 resp[i] = buffer[i];
Alex_Arenas 0:55b583763afc 279 }
Alex_Arenas 0:55b583763afc 280
Alex_Arenas 0:55b583763afc 281 if(strcmp("$$+CM", resp) == 0){ //COMPARA resp CON "+CMTI"
Alex_Arenas 0:55b583763afc 282 pc.printf("\nHa llegado un mensaje!\r\n");
Alex_Arenas 0:55b583763afc 283 cleanBuffer(buffer,10);
Alex_Arenas 0:55b583763afc 284 GSM.printf("AT+CMGL=0\r\n"); // Envío comando para leer mensaje
Alex_Arenas 0:55b583763afc 285 readBuffer(buffer,110);
Alex_Arenas 0:55b583763afc 286
Alex_Arenas 0:55b583763afc 287 // LECTURA DEL TELEFONO QUE ENVIÓ EL MENSAJE
Alex_Arenas 0:55b583763afc 288 for(i=0; i<10; i++){
Alex_Arenas 0:55b583763afc 289 tel[i] = buffer[i+40];
Alex_Arenas 0:55b583763afc 290 }
Alex_Arenas 0:55b583763afc 291 pc.printf("\nTelefono que 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]);
Alex_Arenas 0:55b583763afc 292
Alex_Arenas 0:55b583763afc 293 // LECTURA DEL TAMAÑO
Alex_Arenas 0:55b583763afc 294 for(i=0;i<2;i++){
Alex_Arenas 0:55b583763afc 295 tam[i] = buffer[i + 68];
Alex_Arenas 0:55b583763afc 296 }
Alex_Arenas 0:55b583763afc 297
Alex_Arenas 0:55b583763afc 298 // LECTURA DEL MENSAJE
Alex_Arenas 0:55b583763afc 299 for(i=0;i<26;i++){
Alex_Arenas 0:55b583763afc 300 msg[i] = buffer[i+70]; // Lee un mensaje de 26 caracteres máximo desde la posición 70 del buffer.
Alex_Arenas 0:55b583763afc 301 }
Alex_Arenas 0:55b583763afc 302
Alex_Arenas 0:55b583763afc 303 // DECODIFICACIÓN DEL MENSAJE
Alex_Arenas 0:55b583763afc 304
Alex_Arenas 0:55b583763afc 305 deleteSMS(1); // Se borran los mensajes por medio de una función
Alex_Arenas 0:55b583763afc 306 readBuffer(buffer, 200);
Alex_Arenas 0:55b583763afc 307
Alex_Arenas 0:55b583763afc 308 // COMPARA resp con "E4B79B5C0695E7F4F0FC07" que es "donde estas?", o "C4B79B5C0695E7F4F0FC07" que es "Donde estas?".
Alex_Arenas 0:55b583763afc 309 if((strncmp("E4B79B5C0695E7F4F0FC07", msg, 20) == 0) || (strncmp("C4B79B5C0695E7F4F0FC07", msg, 20) == 0)){
Alex_Arenas 0:55b583763afc 310
Alex_Arenas 0:55b583763afc 311 LedVerde = 1;
Alex_Arenas 0:55b583763afc 312 LedAzul = 0; // ENCENDER LED AZUL
Alex_Arenas 0:55b583763afc 313 LedRojo=0; // ENCENDER LED ROJO
Alex_Arenas 0:55b583763afc 314 wait(2);
Alex_Arenas 0:55b583763afc 315
Alex_Arenas 0:55b583763afc 316 if(gps.sample()){ // SE RECIBEN COORDENADAS DEL GPS
Alex_Arenas 0:55b583763afc 317 lo = gps.longitude;
Alex_Arenas 0:55b583763afc 318 la = gps.latitude;
Alex_Arenas 0:55b583763afc 319
Alex_Arenas 0:55b583763afc 320 //LONGITUD
Alex_Arenas 0:55b583763afc 321 sprintf (clo, "%f", lo);
Alex_Arenas 0:55b583763afc 322 pc.printf ("\nLongitud = %s\n",clo);
Alex_Arenas 0:55b583763afc 323 wait(0.5);
Alex_Arenas 0:55b583763afc 324
Alex_Arenas 0:55b583763afc 325 // LATITUD
Alex_Arenas 0:55b583763afc 326 sprintf (cla, "%f", la);
Alex_Arenas 0:55b583763afc 327 pc.printf ( "\nLatitud = %s\n",cla);
Alex_Arenas 0:55b583763afc 328 wait(0.5);
Alex_Arenas 0:55b583763afc 329
Alex_Arenas 0:55b583763afc 330 // SE CONCATENAN LAS COORDENADAS DE LATITUD Y LONGITUD
Alex_Arenas 0:55b583763afc 331 strcpy(la_lo,cla);
Alex_Arenas 0:55b583763afc 332 strcat(la_lo,",");
Alex_Arenas 0:55b583763afc 333 strcat(la_lo,clo);
Alex_Arenas 0:55b583763afc 334
Alex_Arenas 0:55b583763afc 335 //SE UNEN LAS CADENAS Y SE ARMA EL URL
Alex_Arenas 0:55b583763afc 336 strcpy(DE1,http);
Alex_Arenas 0:55b583763afc 337 strcat(DE1,la_lo);
Alex_Arenas 0:55b583763afc 338 pc.printf("\nDireccion URL que se enviara: %s\n",DE1);
Alex_Arenas 0:55b583763afc 339 pc.printf("\n");
Alex_Arenas 0:55b583763afc 340 LENIN1 = strlen(DE1);
Alex_Arenas 0:55b583763afc 341
Alex_Arenas 0:55b583763afc 342 //CONVERSIÓN A OCTETOS
Alex_Arenas 0:55b583763afc 343 K = 0;
Alex_Arenas 0:55b583763afc 344 C = 0;
Alex_Arenas 0:55b583763afc 345 for (i = 0; i < LENIN1; i++){
Alex_Arenas 0:55b583763afc 346 DS1[i] = DE1[i + C] >> K | DE1[i + C + 1] << (7 - K);
Alex_Arenas 0:55b583763afc 347 if(DS1[i] == 0x00) {LENOUT1 = i; goto salir1;}
Alex_Arenas 0:55b583763afc 348 K++;
Alex_Arenas 0:55b583763afc 349 if (K == 7) {K = 0; C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
Alex_Arenas 0:55b583763afc 350 }
Alex_Arenas 0:55b583763afc 351
Alex_Arenas 0:55b583763afc 352 salir1:
Alex_Arenas 0:55b583763afc 353 for (i = 0; i < LENIN1; i++){
Alex_Arenas 0:55b583763afc 354 pc.printf("%X", DE1[i]);
Alex_Arenas 0:55b583763afc 355 }
Alex_Arenas 0:55b583763afc 356
Alex_Arenas 0:55b583763afc 357 pc.printf(":\r\n");
Alex_Arenas 0:55b583763afc 358 for (i = 0; i < LENOUT1; i++){
Alex_Arenas 0:55b583763afc 359 pc.printf("%2X", DS1[i]&0x000000FF);
Alex_Arenas 0:55b583763afc 360 }
Alex_Arenas 0:55b583763afc 361 pc.printf("\r\nLENOUT GPS: %d, LENIN GPS: %2X\r\n", LENOUT1, LENIN1);
Alex_Arenas 0:55b583763afc 362
Alex_Arenas 0:55b583763afc 363 // Concatenación del mensaje en formato PDU y envío del mismo.
Alex_Arenas 0:55b583763afc 364 ind = 14 + LENOUT1 - 1;
Alex_Arenas 0:55b583763afc 365
Alex_Arenas 0:55b583763afc 366 GSM.printf("AT+CMGS=%d\r\n",ind);
Alex_Arenas 0:55b583763afc 367 pc.printf("AT+CMGS=%d\r\n",ind);
Alex_Arenas 0:55b583763afc 368 pc.printf(relle1);
Alex_Arenas 0:55b583763afc 369 GSM.printf(relle1);
Alex_Arenas 0:55b583763afc 370
Alex_Arenas 0:55b583763afc 371 for (i=0 ;i<=9; i++) {
Alex_Arenas 0:55b583763afc 372 pc.printf("%c",tel[i]);
Alex_Arenas 0:55b583763afc 373 GSM.printf("%c",tel[i]);
Alex_Arenas 0:55b583763afc 374 }
Alex_Arenas 0:55b583763afc 375
Alex_Arenas 0:55b583763afc 376 pc.printf(relle2);
Alex_Arenas 0:55b583763afc 377 GSM.printf(relle2);
Alex_Arenas 0:55b583763afc 378 pc.printf("%2X", LENIN1);
Alex_Arenas 0:55b583763afc 379 GSM.printf("%2X", LENIN1);
Alex_Arenas 0:55b583763afc 380
Alex_Arenas 0:55b583763afc 381 for (i = 0; i < LENOUT1; i++){
Alex_Arenas 0:55b583763afc 382 pc.printf("%02X", DS1[i]&0x000000FF);
Alex_Arenas 0:55b583763afc 383 GSM.printf("%02X", DS1[i]&0x000000FF);
Alex_Arenas 0:55b583763afc 384 }
Alex_Arenas 0:55b583763afc 385 wait(1);
Alex_Arenas 0:55b583763afc 386 GSM.putc((char)0x1A); // Ctrl - Z.
Alex_Arenas 0:55b583763afc 387 GSM.scanf("%s",buf); // Estado del mensaje (Envió o Error).
Alex_Arenas 0:55b583763afc 388 pc.printf("\n>%s\n",buf);
Alex_Arenas 0:55b583763afc 389 }
Alex_Arenas 0:55b583763afc 390
Alex_Arenas 0:55b583763afc 391 wait(1);
Alex_Arenas 0:55b583763afc 392 LedAzul = 1;
Alex_Arenas 0:55b583763afc 393 LedRojo = 1;
Alex_Arenas 0:55b583763afc 394 LedVerde = 0;
Alex_Arenas 0:55b583763afc 395 GSM.printf("AT+CMGD=0\r\n"); // Borra el mensaje actual (Posición "0").
Alex_Arenas 0:55b583763afc 396 pc.printf("%s\n\n", "El mensaje ha sido borrado del celular");
Alex_Arenas 0:55b583763afc 397 goto inicio1; // SE RECONFIGURA EL MODEM PARA ESTAR PENDIENTE A OTRO NUEVO MENSAJE
Alex_Arenas 0:55b583763afc 398 }
Alex_Arenas 0:55b583763afc 399 }
Alex_Arenas 0:55b583763afc 400 }
Alex_Arenas 0:55b583763afc 401 }
Alex_Arenas 0:55b583763afc 402 }