Código para hacer un GPS usando un celular como modem.
Dependencies: GPS7 TextLCD mbed
.
Diff: main.cpp
- Revision:
- 0:bf62ef1297ce
diff -r 000000000000 -r bf62ef1297ce main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Jun 01 15:39:31 2016 +0000 @@ -0,0 +1,407 @@ +#include "mbed.h" +#include "stdio.h" +#include "string.h" +#include "iostream" //libreria que nos permite utilizar operaciones de entrada y salida se utilizara mas adelante para identificar la cadena a comparar. +#include "GPS.h" +#include "stdlib.h" + + +Serial gsm(PTE22,PTE23); // 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(PTE0, PTE1); // Puertos del GPS para la obtencion de las coodenadas +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 coordenadas +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 ----------------------Verificando conectividad con el celular---------------\n"); + 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 mensaje que entre 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 ----------------- Comienza 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 comienza 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 ("coordenada"); // 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 coordenada ------------\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-0.2398; + lo=gps.latitude+0.0837; + 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 coordenada + + + }// 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