programa que envia por mensaje de texto la ubicación con link de google maps, de la ubicación de un modulo(celualr siemens A56i)

Dependencies:   DebouncedIn GPS mbed

Committer:
landresge
Date:
Tue Jun 05 18:05:44 2018 +0000
Revision:
0:a79100ff5b27
programa que envia por mensaje de texto la ubicaci?n con link de google maps, de la ubicaci?n de un modulo(celualr siemens A56i)

Who changed what in which revision?

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