![](/media/cache/profiles/c9d3ff0123ea1ee9f0a6e0b475d39352.jpg.50x50_q85.png)
Tarea GSM GPS
Dependencies: GPS7 TextLCD mbed
main.cpp
- Committer:
- caarbelaezg
- Date:
- 2015-06-18
- Revision:
- 0:3171e1737767
File content as of revision 0:3171e1737767:
#include "mbed.h" #include "stdio.h" #include "string.h" #include "iostream" #include "TextLCD.h" #include "GPS.h" #include "stdlib.h" Serial gsm(PTE0,PTE1); // Se declaran puertos para la comunicacíón GSM Serial pc(USBTX,USBRX); // Puerto seríal de la Freescale para el envio de datos GPS gps(PTD7, PTD6); DigitalOut myled(LED1); char buf[200], pdu[]="", vect1[]="", vect2[]="", DE[255], DS[255], DEs[255], DSs[255], Ctamanosms[1], Ctiposmsc[1], Csmscnumber[12], Cdeliver[1], Ctamanoaddress[1], Ctipoaddress[1], Cnumero[11], Cprotocolo[1], Cencoding[1], Ctime[14], Ctamano[1], Cdato[30];; // Variables para almacenar las cadenas de caracteres int i,K,C,LENOUT,LENIN, w, r, ta; // Auxiliares float lo,la; // Variables para almacenar corrdenadas char LINK[]= {"http://maps.google.com/?q="}; // Trama base int main() { pc.printf("************************** INICIO DEL PROGRAMA ***********************"); // Configuración para la comunicacion con el celular pc.printf("\n ---------------------- Configuracion para la comunicacion con el celular---------------\n"); gsm.baud(9600); // Configuracion de los baudios gsm.format(8,Serial::None,1); // 8 Bits sin paridad std::string strOK ("OK"); // para comparar con las respuestas AT pc.printf("\n Enviamos AT \n"); // Apreton de manos con el gsm gsm.printf("AT\r\n"); gsm.scanf("%s",buf); gsm.scanf("%s",buf); pc.printf("%s\n",buf); if(strOK.compare(buf) != 0){ pc.printf("Aborten comunicacion"); } gsm.printf("\n AT+CNMI=1,1\r\n"); // Configuracion para trabjar sobre la memoria de la simcard pc.printf("AT+CNMI=1,1\r\n"); gsm.scanf("%s",buf); gsm.scanf("%s",buf); pc.printf(">%s\n",buf); if(strOK.compare(buf) != 0){ pc.printf("Aborten comunicacion"); } gsm.printf("\n AT+CPMS= \"SM\",\"SM\",\"SM\"\r\n"); // pc.printf("AT+CPMS= \"SM\",\"SM\",\"SM\"\n"); gsm.scanf("%s",buf); gsm.scanf("%s",buf); gsm.scanf("%s",buf); pc.printf(">%s\n",buf); wait(1); gsm.printf("\n AT+CMGF=0\r\n"); // Configuracion para trabajar en modo PDU pc.printf("AT+CMGF=0\r\n"); gsm.scanf("%s",buf); gsm.scanf("%s",buf); pc.printf(">%s\n",buf); if(strOK.compare(buf) != 0){ pc.printf("Aborten comunicacion"); } pc.printf("\n CBST=0,0,1\r\n"); gsm.printf("CBST=0,0,1\r\n"); // para dejar en espera de mensajes entrantes while(1) { pc.printf("\n ----------- En espera de Mensaje entrante -------------------\n"); // En espera de mensaje entrante gsm.scanf("%s",buf); pc.printf("%s",buf); i = strlen(buf); if(i>3) { // En caso de que se reciba un mensaje se entra al este if pc.printf("\n ------------- Llego un Mensaje ------------------- \n"); gsm.printf("AT+CMGR=1\r\n"); // Se lee el menjsae que ente en el indice 1. gsm.scanf("%s",buf); gsm.scanf("%s",buf); gsm.scanf("%s",buf); gsm.scanf("%s",buf); pc.printf(">%s \n",buf); //Mostrar la cadena en PDU del mensaje leido. int T = strlen(buf); // Se toma la longitud del mensaje leido pc.printf("\n ----------------- Comiensa lectura de la trama PDU entrante : %d -------\n", T); // Se comiensa a separar la trama pdu para extraer informacion especifica Ctamanosms[0]=buf[0]; // Se toma el tamaño en septetos de toda la trama pdu Ctamanosms[1]=buf[1]; pc.printf("Longitud del mensaje en septetos %c%c en septetos \n", Ctamanosms[0], Ctamanosms[1]); Ctiposmsc[0]=buf[2]; // Tipo de mensaje Ctiposmsc[1]=buf[3]; pc.printf("Tipo de direccion SMSC %c%c \n", Ctiposmsc[0], Ctiposmsc[1]); Csmscnumber[0]=buf[4]; // numero del sms Csmscnumber[1]=buf[5]; Csmscnumber[2]=buf[6]; Csmscnumber[3]=buf[7]; Csmscnumber[4]=buf[8]; Csmscnumber[5]=buf[9]; Csmscnumber[6]=buf[10]; Csmscnumber[7]=buf[11]; Csmscnumber[8]=buf[12]; Csmscnumber[9]=buf[13]; Csmscnumber[10]=buf[14]; Csmscnumber[11]=buf[15]; pc.printf("Numero del SMSC %s \n", Csmscnumber); Cdeliver[0]=buf[16]; Cdeliver[1]=buf[17]; Ctamanoaddress[0]=buf[18]; Ctamanoaddress[1]=buf[19]; Ctipoaddress[0]=buf[20]; Ctipoaddress[1]=buf[21]; Cnumero[0]=buf[22]; // Numero del usuario Cnumero[1]=buf[23]; Cnumero[2]=buf[24]; Cnumero[3]=buf[25]; Cnumero[4]=buf[26]; Cnumero[5]=buf[27]; Cnumero[6]=buf[28]; Cnumero[7]=buf[29]; Cnumero[8]=buf[30]; Cnumero[9]=buf[31]; Cnumero[10]=buf[32]; Cnumero[11]=buf[33]; pc.printf("Numero del usuario %s \n", Cnumero); Cprotocolo[0]=buf[34]; // Protocolo utilizado Cprotocolo[1]=buf[35]; Cencoding[0]=buf[36]; // Tipo de cifrado Cencoding[1]=buf[37]; Ctime[0]=buf[38]; // Tiempo en el que se envio el menaje Ctime[1]=buf[39]; Ctime[2]=buf[40]; Ctime[3]=buf[41]; Ctime[4]=buf[42]; Ctime[5]=buf[43]; Ctime[6]=buf[44]; Ctime[7]=buf[45]; Ctime[8]=buf[46]; Ctime[9]=buf[47]; Ctime[10]=buf[48]; Ctime[11]=buf[49]; Ctime[12]=buf[50]; Ctime[13]=buf[51]; Ctamano[0]=buf[50]; // Tamaño de los datos (longitud de la parte legible) Ctamano[1]=buf[51]; ta=(Ctamano[0]-48)*16+(Ctamano[1]-48); // Suponiendo que son mensajes no muy grandes como solo se espera recibir cor, on y off es suficiente se transforman de caracter a su valor numerico y luego se ponderan pc.printf("Numero de carcteres del mensaje entrante %d \n", ta); pc.printf(" Posicion de los datos en el mensaje PDU %d \n", T-2*ta); // posicion de los datos en la trama pdu for(i=0; i<2*ta; i++){ //Toma de los datos o mensaje Cdato[i]=buf[52+i]; } ///// Se comeinsa la convercion de PDU a Texto pc.printf("\n------------- Comienza la convercion de PDU a texto ------------------\n"); LENIN=strlen(Cdato)/2; w=0; pc.printf(" Tamano de los datos %d \n", strlen(Cdato)); for(i=0; i<=strlen(Cdato); i++){ if(i%2==0){ if(Cdato[i]>47 & Cdato[i]<58){ // primero se asigna el valor numerico de cada caracter en caso de ser 0-9 se le resta 48 en caso de ser letra se le resta 55 Cdato[i]= Cdato[i]-48; } if(Cdato[i]>65 & Cdato[i]<71){ Cdato[i]=Cdato[i]-55; } } else{ if(Cdato[i]>47 & Cdato[i]<58){ Cdato[i]= Cdato[i]-48; } if(Cdato[i]>65 & Cdato[i]<71){ Cdato[i]=Cdato[i]-55; } DE[w]= Cdato[i-1]*16+Cdato[i]; // aqui se pondera cada caracter y se suma con su predecesor par dar el peso de la tupla pc.printf("Datos en hexagesimal DE[%d] %2X \n", w, DE[w]); // Se guarda la dupla en el vector DE w=w+1; } } //----------------------------------- --------------------------- LENOUT= LENIN*8/7; K=7; C=0; DS[0]=DE[0] & 0x7F; // la primera sola pc.printf("%2X,%d,%d\r\n",DS[0],i,K); for (i=1;i < LENOUT;i++){ // inicia el algoritmo DS[i]=(DE[i-1-C]>>K | DE[i-C]<<(8-K))& 0x7F; //valido para todos pc.printf("%2X,%d,%d\r\n",DS[i],i,K); if (K==0) {K=8;C++;} K--; } pc.printf("\n El Mensaje de llegada es: "); for (i=0;i < LENOUT;i++){ pc.printf("%c",DS[i]); } pc.printf("\n ------ Fin de la convercion de de los datos desde PDU a texto \n"); } std::string str1 ("cor"); // Cadenas par comparar el tipo de mensaje entrante std::string str2 ("on"); std::string str3 ("off"); if(str2.compare(DS) == 0) { // En caso de que llegue on pc.printf("\n--------------- LLego on ----------------"); myled = 0; gsm.printf("AT+CMGD=1\r\n"); gsm.scanf("%s",buf); pc.printf("\n%s\n",buf); }//if de on if(str3.compare(DS) == 0) { // En caso de que llegue off pc.printf("\n---------- LLego off --------------- \n"); myled = 1; gsm.printf("AT+CMGD=1\r\n"); gsm.scanf("%s",buf); pc.printf("\n%s\n",buf); }//if de off if(str1.compare(DS) == 0) { // En caso de que se pidan las coordenadas pc.printf("\n ----------------- LLego cor ------------\n"); pc.printf("Esperando GPS \n"); // Se espera hasta que el gps entregue datos while(1) { i=0; if(gps.sample()& i==0) { pc.printf("--- Comienza la lectura del gps \n"); //Toma de datos del gps y concatenacion para armar los datos. la=gps.longitude; lo=gps.latitude; sprintf(vect1, "%f", lo); strcat(LINK,vect1); strcat(LINK,","); sprintf(vect2, "%f", la); strcat(LINK,vect2); strcat(DEs,LINK); pc.printf("%s\n",LINK); //Conversion de los datos"LINK" a formatdo PDU LENIN=strlen(DEs); K=0; C=0; for (i=0; i < LENIN; i++) { DSs[i]=DEs[i+C]>>K | DEs[i+C+1]<<(7-K); if (DSs[i]==0x00) { LENOUT=i; goto salir; } K++; if (K==7) { K=0; // se chequea que ya se acabaron los bits en un ciclo de conversion. C++; } } //-------------------------------------------------------------- salir: pc.printf("DEs\n"); for (i=0; i < LENIN; i++) { pc.printf("%X",DEs[i]); } pc.printf("\n DSs \n"); for (i=0; i<LENOUT; i++) { pc.printf("%02X",DSs[i]&0x000000FF); } pc.printf("\n LENOUT:%d,LENIN:%d\r\n",LENOUT,strlen(DEs)); // Enviamos el mensaje pc.printf("\n ------------- Comienza el envio del mensaje SMS ---------- \n"); if(LENOUT%2==0){ // ponderacion para cuadrar el tamaño del mensaje a enviar w=27; } else{ w=26; } gsm.printf("AT+CMGS=%d\r\n", ((2*LENOUT)+w)/2); // Inicio real del envio del mensaje pc.printf("\n AT+CMGS=%d\r\n", ((2*LENOUT)+w)/2); wait(0.5); gsm.printf("0011000A91"); // relleno inicial pc.printf("0011000A91"); for(i=0; i<11; i++){ // NUMERO TELEFONICO DEL USUARIO gsm.printf("%c", Cnumero[i]); pc.printf("%c", Cnumero[i]); } gsm.printf("000AA"); // segundo relleno pc.printf("000AA"); gsm.printf("%2X",LENOUT); // longitud de los datos pc.printf("%2X",LENOUT); for (i=0; i < LENOUT; i++) { // imprimir los datos gsm.printf("%02X",DSs[i]&0x000000FF); pc.printf("%02X",DSs[i]&0x000000FF); wait(0.1); } gsm.putc((char)0x1A); // Punto final del envio de datos gsm.scanf("%s",buf); // Se lee la respuesta del gsm gsm.scanf("%s",buf); pc.printf("\n Lo que devuelve el cel %s \n",buf); i=1; gsm.printf("AT+CMGD=1\r\n"); //Limpieza de variables for(i=26; i<=strlen(LINK); i++){ LINK[i]=NULL; } for(i=0; i<=255; i++){ DSs[i]=NULL; DEs[i]=NULL; } pc.printf("\n Se sale de while para la lectura de gps \n "); gsm.scanf("%s",buf); pc.printf(">%s",buf); goto s; // salida del if de la llegada de cor y de la espera del gps } }//if de coord }// if de llegada de SMS if(str1.compare(DS) != 0 && str2.compare(DS) != 0 && str3.compare(DS) != 0){ pc.printf("El mensaje de llegada no es valido"); gsm.printf("AT+CMGD=1\r\n"); // Borrar el mensaje gsm.scanf("%s",buf); pc.printf("\n%s\n",buf); } s: gsm.scanf("%s",buf); pc.printf("%s",buf); }// while }// Main