tarea 6, geolocalizacion mediante moden GSM y GPS.

Dependencies:   DebouncedIn GPS_G mbed

Committer:
vitigo
Date:
Tue Jun 05 18:33:57 2018 +0000
Revision:
0:0773f6e709b6
tarea 6, geolocalizacion mediante moden GSM y GPS.

Who changed what in which revision?

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