![](/media/cache/profiles/c4661f6669f5f35823f39acb6d6be725.jpg.50x50_q85.jpg)
KL25Z Send COR or VOL , smms Back Coord. or Ang. read data.
Fork of smms by
main.cpp
- Committer:
- deiwidricaurte
- Date:
- 2016-11-28
- Revision:
- 0:c55614493217
- Child:
- 1:b447e3b8fc27
File content as of revision 0:c55614493217:
#include "mbed.h" #include "string.h" #include "math.h" #include "GPS.h" //---Configuraciones--- Timer t; AnalogIn input(PTB3); DigitalOut LedVerde(LED2); DigitalOut LedRojo(LED1); DigitalOut LedAzul(LED3); Serial pc(USBTX,USBRX); //Configura puerto UART de la Serial GSM(PTE0,PTE1);//Configura la entrada serial del celular DigitalOut ledr(PTE29);//Led indicador DigitalIn chan(PTC3);//Pulsador para iniciar la configuración del celular GPS gps(PTE22,PTE23);//configuración de los pines de comunicación con el GPS purto com del pc q envia las coordenadas //---Subrutinas--- int readBuffer(char *buffer,int count);//Subrutina para leer el buffer void enviar(int LENIN1,char *DS,char *numero);//subrutina para enviar mensaje void borrar_todo(void);//subrutina para reiniciar las variables void config(void);//configuración del celular //---Variables para paquetes--- char buffer[100],Bkupbuffer[100];//buffer's de almacenación de mensajes char celular[10]; char ENCA[255]={"http://maps.google.com/maps?q="};//para enviar las coordenadas en google encabezado despues del encabezado char ENCA2[255]={"el voltaje es: "};//para enviar el voltaje char DS[255]; char DS2[255]; int LENIN=0,LENIN1=0,LENOUT=0,LENIN12=0,LENOUT2=0;//Tamaño de los datos de la función de conversión de entrada y salida //---Variables para coordenadas--- char coorden[50]={NULL}; char aux[50]={NULL}; int num; int longi_entera=0,lati_entera=0,longi_decimal=0,lati_decimal=0; //---Variables como contadores--- int i=0,count=0,bandera=0,gh=0,negativo=0,K=0,C=0,p=0,j=0,z=0,ro=0,st=0,sol=0,aa=0; //***************************************************************************************************************************************** //***************************************************************************************************************************************** //es recomendable iniciar siempre oprimiendo el boton de configuración. int main(void) { inicio: LedVerde=0; LedRojo=1; LedAzul=0; borrar_todo();//Ejecuta la rutina que reinicia todas las variables del programaledr=1; GSM.baud(9600);//configura los baudios de la comunicación en 9600 GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART wait(1); pc.printf("conectado al pc \r\n ");//indicador de conexión GSM.printf("AT+CMGD=1\r\n");//Borrar los mensajes del celular while(1) { //________________________________________________________________________________________________________________________________________ if(aa==0)//si se preciona, se procede a cofigurar el celular con comandos AT { config(); num = input*10; //agrando el numero de cero a mil int jj=0; pc.printf("\n spp %d",num); while(num>0) { aux[jj]=(num%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden num=num/10; if(num<1){ break; } pc.printf("\n %c",aux[jj]); jj++; } if(num==0){ aux[jj]==48; } pc.printf("\n sss %c",aux); aa=1; } //________________________________________________________________________________________________________________________________________ if (GSM.readable()) //esperar llegada de mensaje del celular { readBuffer(buffer,100);//guardar el mensaje en el buffer i=0; pc.printf(buffer);//imprimir el mensaje if(buffer[14]=='1'||buffer[6]=='R'){bandera++;} if(bandera==2)//compara si ya llegó el mensaje al celular y hay que borrarlo { for(gh=0;gh<=99;gh++)//guardamos el mensaje almacenado en el buffer en una variable auxiliar { Bkupbuffer[gh]=buffer[gh]; } //pc.printf("\r\n%c\r\n %c\r\n %c\r\n %c\r\n",Bkupbuffer[68],Bkupbuffer[69],Bkupbuffer[70],Bkupbuffer[71]); wait(0.5); GSM.printf("AT+CMGD=1\r\n");//borrar mensaje recibido bandera=0; } } //________________________________________________________________________________________________________________________________________ if((buffer[10]=='S')&& (buffer[11]=='M'))//compara si el mensaje es un mensaje de texto que llegó al celular { pc.printf("\r\n Llego mensaje\r\n "); buffer[10]=' ';//limpia los espacios del Buffer buffer[11]=' '; GSM.printf("AT+CMGR=%c\r\n",buffer[14]);//solicitar mesaje al celular //pc.printf("AT+CMGR=%c\r\n",buffer[14]); buffer[14]=' '; i=0; } //________________________________________________________________________________________________________________________________________ if(Bkupbuffer[68]=='C'&& Bkupbuffer[69]=='3'&&Bkupbuffer[70]=='A'&& Bkupbuffer[71]=='7'&& Bkupbuffer[72]=='1'&& Bkupbuffer[73]=='4')//recibió ELE (Extincion Level Event) { buffer[68]=' '; Bkupbuffer[68]=' '; for(st=68;st<=73;st++) { Bkupbuffer[st]=' ';//limpia el espacio del buffer para evitar ingresar de nuevo, si no ha llegado otro mensaje con la contraseña } pc.printf("Adquiriendo coordenadas del GPS...\r\n");//Adquiriendo coordenadas del GPS... if(gps.sample())//Si las coordenadas se obtienen correctamente: { for(ro=30;ro<=255;ro++) { ENCA[ro]='\0'; } ro=0; longi_entera=(int)gps.longitude;//Adquiere la parte entera de la longitud del GPS lati_entera=(int)gps.latitude;//Adquiere la parte entera de la latitud del GPS longi_decimal=abs((gps.longitude-(int)gps.longitude)*1000000);//Adquiere el valor absoluto de la longitud del GPS lati_decimal=abs((gps.latitude-(int)gps.latitude)*1000000);//Adquiere el valor absoluto de la longitud del GPS pc.printf("http://maps.google.com/maps?q=%f,%f\r\n", gps.latitude,gps.longitude);//encabezado que será impreso en el terminal y luego en el mensaje while(longi_decimal>0) { coorden[j]=(longi_decimal%10)+48;//se toma la parte decimal de la longitud y se pasa a ASCII y guarda en el vector coorden longi_decimal=longi_decimal/10;//se divide por 10 para hacer mas iteracines en caso de que el número de elementos seamayor a uno pc.printf("%c",coorden[j]); j++; } coorden[j]='.';//Se adiciona el punto, para la parte decimal pc.printf("%c",coorden[j]);//se muestra en el terminal la posición j de la longitud j++; if(longi_entera<0)//si la longitud es menor a cero se multiplica por -1 { negativo=1; longi_entera=longi_entera*-1; } while(longi_entera>0) { coorden[j]=(longi_entera%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden longi_entera=longi_entera/10; pc.printf("%c",coorden[j]); j++; } if(negativo==1)//si negativo es 1 al vector de caracteres se le adiciona un '-' { coorden[j]='-'; pc.printf("%c",coorden[j]); j++; } negativo=0;//reinicia la variable para hacer lo mismo con la longitud coorden[j]=','; pc.printf("%c",coorden[j]); j++; while(lati_decimal>0) { coorden[j]=(lati_decimal%10)+48;//se toma la parte decimal de la latitud y se pasa a ASCII y guarda en el vector coorden lati_decimal=lati_decimal/10; pc.printf("%c",coorden[j]); j++; } coorden[j]='.';//adiciona el punto al vector para indicar la parte decimal pc.printf("%c",coorden[j]); j++; if(lati_entera<0) { negativo=1; lati_entera=lati_entera*-1; } while(lati_entera>0) { coorden[j]=(lati_entera%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden lati_entera=lati_entera/10; pc.printf("%c",coorden[j]); j++; } if(negativo==1) { coorden[j]='-'; pc.printf("%c",coorden[j]); j++; } pc.printf("\r\n"); j--; z=strlen(ENCA);//hace z = al tamaño de la variable ENCA for(i=j;i>=0;i--) { ENCA[z]=coorden[i];//guarda las coordenadas en un vector auxiliar ENCA en orden z++; } pc.printf(ENCA); pc.printf("\r\n"); LENIN1=strlen(ENCA);//toma el tamaño del vector ENCA for (i=0;i < LENIN1;i++)//algoritmo para pasar de septetos a octetos { DS[i]=ENCA[i+C]>>K | ENCA[i+C+1]<<(7-K); if (DS[i]==0x00) {LENOUT=i; goto salir;}//cuando K++; if (K==7) {K=0;C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion. } //-------------------------------------------------------------- salir: for(i=38;i<48;i++)//Se extrae el número del celular { celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer }//de respaldo wait(0.5); enviar(LENIN1,DS,celular);//Ejecuta la rutina de envío de mensaje, con el tamaño del mensaje, las coordenadas en septetos y el número del celular wait(14); goto inicio; }//if GPS else { for(i=38;i<48;i++)//Se extrae el número del celular { celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer }//de respaldo wait(0.5); GSM.printf("at+cmgs=%d\r\n",37);//inicio de envío de mensaje pc.printf("at+cmgs=%d\r\n",37); wait(0.5); GSM.printf("0011000A91"); pc.printf("0011000A91"); for(p=0;p<10;p++) { GSM.printf("%c",celular[p]); pc.printf("%c",celular[p]); } GSM.printf("0000AA1B45B9FC2D6781D26E7AD94D2F83DAE139881E9693CB2E970B");//Relleno + Número de octetos + mensaje pc.printf("0000AA1B45B9FC2D6781D26E7AD94D2F83DAE139881E9693CB2E970B");//Error, intente mas tarde... wait(0.5); GSM.putc(0x1A);//fin de envío de mensaje for(ro=0;ro<=100;ro++)//borrar el buffer y el respaldo para habilitar una nueva recepción { buffer[ro]='\0'; Bkupbuffer[ro]='\0'; } ro=0; wait(0.5); } }//if ELE else if(Bkupbuffer[68]=='D'&& Bkupbuffer[69]=='6'&&Bkupbuffer[70]=='2'&& Bkupbuffer[71]=='7'&& Bkupbuffer[72]=='1'&& Bkupbuffer[73]=='3')//compara mensaje para leer voltje { num = input*10; //agrando el numero de cero a mil int jj=0; pc.printf("\n spp %d",num); while(num>0) { aux[jj]=(num%10)+48;//se toma la parte entera de la longitud y se pasa a ASCII y guarda en el vector coorden num=num/10; if(num<1){ break; } pc.printf("\n %c",aux[jj]); jj++; } if(num==0){ aux[jj]==48; } pc.printf("\n sss %c",aux); int z; z=strlen(ENCA2);//hace z = al tamaño de la variable ENCA for(i=j;i>=0;i--) { ENCA2[z]=aux[i];//guarda las coordenadas en un vector auxiliar ENCA en orden z++; } LENIN12=strlen(ENCA2);//toma el tamaño del vector ENCA for (i=0;i < LENIN12;i++)//algoritmo para pasar de septetos a octetos { DS2[i]=ENCA2[i+C]>>K | ENCA2[i+C+1]<<(7-K); if (DS2[i]==0x00) {LENOUT2=i; goto salir2;}//cuando K++; if (K==7) {K=0;C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion. } // // salir2: for(i=38;i<48;i++)//Se extrae el número del celular { celular[i-38]=Bkupbuffer[i];//toma el número del celular trocado en las posiciones del 38 al 48 almacenadas en el buffer }//de respaldo wait(0.5); enviar(LENIN12,DS2,celular);//Ejecuta la rutina de envío de mensaje, con el tamaño del mensaje, las coordenadas en septetos y el número del celular wait(14); goto inicio; } else { for(ro=0;ro<=100;ro++) { buffer[ro]='\0'; } ro=0; } }//while }//main //***************************************************************************************************************************************** //***************************************************************************************************************************************** int readBuffer(char *buffer,int count)//Recepción por comunicación serial con el celular { t.start(); while(1) { while (GSM.readable())//si hay algo que leer en la comunicación { char c = GSM.getc(); if (c == '\r' || c == '\n') c = '$';//remplaza los espacios y saltos de linea por comodín buffer[i++] = c;//almacena la información en una cadena de caracteres "buffer" if(i > count)break; } if(i > count)break; if(t.read() > 3) { t.stop(); t.reset(); break; } } wait(0.5); while(GSM.readable()) { char c = GSM.getc(); } return 0; } //***************************************************************************************************************************************** //***************************************************************************************************************************************** void enviar(int LENIN1,char *DS,char *numero) { GSM.printf("at+cmgs=%d\r\n",13+LENIN1);//Comando para enviar el mensaje, empieza con la longitud total -1 pc.printf("at+cmgs=%d\r\n",13+LENIN1); wait(0.5); GSM.printf("0011000A91");//Envía relleno pc.printf("0011000A91"); for(p=0;p<10;p++)//Envía el número del celular trocado { GSM.printf("%c",celular[p]); pc.printf("%c",celular[p]); } GSM.printf("0000AA");//Envía segundo relleno pc.printf("0000AA"); if(LENIN1<=15)//Si es menor a 15 le adiciona un 0 al comienzo de la dirección { pc.printf("0"); GSM.printf("0"); pc.printf("%X",LENIN1);//Envía la longitud del mensaje GSM.printf("%X",LENIN1); } else { pc.printf("%2X",LENIN1); GSM.printf("%2X",LENIN1); } for (p=0;p < LENIN1;p++)//envía el número de caracteres del mensaje { if(DS[p]<=15)//agrega ceros a cada número menos a 15 en el mensaje { pc.printf("0"); GSM.printf("0"); pc.printf("%X",DS[p]); GSM.printf("%X",DS[p]); } else { pc.printf("%2X",DS[p]&0x000000FF); GSM.printf("%2X",DS[p]&0x000000FF); } } wait(0.5); GSM.putc(0x1A);//culmina el envío del mensaje pc.putc(0x1A); } //***************************************************************************************************************************************** //***************************************************************************************************************************************** void borrar_todo(void)//reinicia todas las varaibles del programa { for(ro=0;ro<=50;ro++) { coorden[ro]='\0'; } ro=0; for(ro=0;ro<=100;ro++) { buffer[ro]='\0'; Bkupbuffer[ro]='\0'; } for(ro=0;ro<=255;ro++) { DS[ro]='\0'; } ro=0; for(ro=0;ro<=10;ro++) { celular[ro]='\0'; } ro=0; LENIN=0;LENIN1=0;LENOUT=0; longi_entera=0;lati_entera=0;longi_decimal=0;lati_decimal=0; i=0;count=0;bandera=0;gh=0;negativo=0;K=0;C=0;p=0;j=0;z=0;ro=0;sol=0;st=0; ledr=0; } //***************************************************************************************************************************************** //***************************************************************************************************************************************** void config(void)//setear la configuración en el celular { GSM.printf("AT\r\n"); pc.printf("AT\r\n"); wait(0.5); GSM.printf("AT+CNMI=1,1\r\n"); pc.printf("AT+CNMI=1,1\r\n"); wait(0.5); GSM.printf("AT+CMGF=0\r\n"); pc.printf("AT+CMGF=0\r\n"); wait(0.5); GSM.printf("ATE\r\n");//eco pc.printf("ATE\r\n"); wait(0.5); GSM.printf("CBST=0,0,1\r\n"); pc.printf("CBST=0,0,1\r\n"); wait(0.5); LedVerde=0; LedRojo=0; LedAzul=1; }