Se usa un celular Siemens A56i para la comunicación por GSM,la aplicación consiste en esperar un mensaje de texto con la frase "Donde estas?","donde estas" o "donde estas?" que es enviada al Siemens desde cualquier otro celular, para así devolverle al remitente un link de Google Maps con las coordenadas de donde se encuentra en ese momento suministradas por un GPS, que en este caso será un computador que las envía a través de un Dongle conectado,usando el programa de SatGen con un .kml cargado de Google Earth o usando el simulador GPS de Proteus (funciona para ambos casos).

Dependencies:   GPS_G mbed

/media/uploads/seccastanova/whatsapp_image_2018-05-29_at_11.03.46_am.jpeg

Committer:
seccastanova
Date:
Tue May 29 16:03:59 2018 +0000
Revision:
0:deee3793c151
Comunicaci?n GSM

Who changed what in which revision?

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