envia Cord responde con link
Dependencies: DebouncedIn GPS7 mbed
Fork of send by
Diff: main.cpp
- Revision:
- 2:ffcd0494ec92
- Parent:
- 1:6b506dde0a6e
- Child:
- 3:75c530fb1140
--- a/main.cpp Tue Dec 02 03:41:43 2014 +0000 +++ b/main.cpp Wed May 27 23:19:02 2015 +0000 @@ -1,7 +1,7 @@ // Programa para enviar desde la FRDMKL25Z un mensaje de texto en formatp PDU // Como modem usa un celular SIEMENS a56i // ENVIAR -----la palabra "ALARMA 1" -// +// // OJO CON ESTO // conector del siemens cable verde es RX conectelo a PTE0 cable blanco es TX conectelo a PTE1 @@ -9,49 +9,52 @@ #include "DebouncedIn.h" #include "stdio.h" #include "string.h" +#include "math.h" +#include "gprs.h" +#include "GPS.h" Timer t; -DigitalOut LedVerde(LED2); -DigitalOut LedRojo(LED1); -DigitalOut LedAzul(LED3); -DebouncedIn button1(PTC12); //señal que inicia el envio del mensaje -Serial GSM(PTE0,PTE1); //Configura puerto UART de la FRDMKL25Z -Serial pc(USBTX,USBRX);//Configura puerto USB a la consola serial del PC conectado. +DigitalOut on_off(PTC17); //señal que inicia el envio del mensaje +Serial pc(USBTX,USBRX); //Configura puerto UART de la FRDMKL25Z +GPS gps(PTE22, PTE23); +//Serial GSM(USBTX,USBRX); +//serial (PTA2,PTA1);/////////////////USBTX,USBRX PTE0,PTE1 +Serial GSM(PTE0,PTE1);//Configura puerto USB a la consola serial del PC conectado. +//void leer(void); void Rx_interrupt(); int position=0; int lenpack=6; int longi=0; +char lat1[9]; +char lon1[12]; char tel[11]; -char DE[50]; char buffer[100]; +char buffer1[13]; char datos[100]; -char NUMBER[13]; +char NUMBER[13]; int index; -int count; +char buffermsg[100]; +int count1=0; int i = 0; int j = 0; -int c=0; +char c; unsigned char CtrlZ = 0x1A; // comodin de emision controlZ -bool Flag = false; // bandera +bool Flag = false; // bandera char r[]=""; //Cadena de recepcion de la trama PDU si se usa!! char msg[256]; +int z=0,g=0; char char1; -//Flush serial para el buffer -void FlushGSM(void) { -char1 = 0; - while (GSM.readable()){ - char1 = GSM.getc();} - return;} +char DE[255]={"http://maps.google.com/maps?q="}; -void callback() { - // Note: you need to actually read from the serial to clear the RX interrupt - pc.printf("%c\n", GSM.getc()); - -} - +char DS[255]; +int K,C,LENOUT,LENIN; +int frac_long, frac_lat,ent_long,ent_lat; + + + int readBuffer(char *buffer,int count) { int i=0; - t.start(); // start timer + t.start(); while(1) { while (GSM.readable()) { char c = GSM.getc(); @@ -67,261 +70,116 @@ } } wait(0.5); - while(GSM.readable()) { // display the other thing.. + while(GSM.readable()) { char c = GSM.getc(); } return 0; } -/* esta funcion de abajo limpia o borra todo un "buffer" de tamaño "count" -lo revisa uno por un elemento y le mete el caracter null que indica fin de cadena -no retorna nada -*/ -//*************************************************************************************** -void cleanBuffer(char *buffer, int count) -{ - for(int i=0; i < count; i++) { - buffer[i] = '\0'; - } -} -/* esta funcion de abajo envia un comando parametrizado como cadena -*/ -//*************************************************************************************** -void sendCmd(char *cmd) -{ - GSM.puts(cmd); -} -/* esta funcion de abajo espera la respuesta de un comando que debe ser identica a la cadena "resp" y un tiempo timeout" -si todo sale bien retorna un cero que en la programacion hay que validar -si algo sale mal ( no se parece o se demora mucho )retorna -1 que debera validarse con alguna expresion logica -*/ -//*************************************************************************************** -int waitForResp(char *resp, int timeout) -{ - int len = strlen(resp); - int sum=0; - t.start(); - - while(1) { - if(GSM.readable()) { - char c = GSM.getc(); - sum = (c==resp[sum]) ? sum+1 : 0;// esta linea de C# sum se incrementa o se hace cero segun c - if(sum == len)break; //ya acabo se sale - } - if(t.read() > timeout) { // time out chequea el tiempo minimo antes de salir perdiendo - t.stop(); - t.reset(); - return -1; - } - } - t.stop(); // stop timer antes de retornar - t.reset(); // clear timer - while(GSM.readable()) { // display the other thing.. - char c = GSM.getc(); - } - - return 0; -} -/* esta funcion de abajo es muy completa e util se encarga de enviar el comando y esperar la respuesta -si todo sale bien retorna un cero(herencia de las funciones contenedoras) que en la programacion hay que validar -con alguna expresion logica -*/ -//*************************************************************************************** -int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout) -{ - sendCmd(cmd); - return waitForResp(resp,timeout); -} -/* esta funcion de abajo chequea que el modem este vivo envia AT y le contesta con OK y espera 2 segundos -*/ -//*************************************************************************************** -int powerCheck(void)// este comando se manda para verificar si el modem esta vivo o conectado -{ - return sendCmdAndWaitForResp("AT\r\n", "OK", 2); -} -/* esta funcion de abajo chequea el estado de la sim card -y si todo sale bien retorna un cero que en la programacion hay que validar -con alguna expresion logica -*/ -//*************************************************************************************** -int checkSIMStatus(void) -{ - char gprsBuffer[30]; - int count = 0; - cleanBuffer(gprsBuffer,30); - while(count < 3) { - sendCmd("AT+CPIN?\r\n"); - readBuffer(gprsBuffer,30); - if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) { - break; - } - count++; - wait(1); - } - - if(count == 3) { - return -1; - } - return 0; -} -/* esta funcion de abajo chequea la calidad de la señal -y si todo sale bien retorna cun el valor de señal util o un -1 si nop es aceptable, en la programacion hay que validar -con alguna expresion logica -*/ -//*************************************************************************************** -int checkSignalStrength(void) -{ - char gprsBuffer[100]; - int index,count = 0; - cleanBuffer(gprsBuffer,100); - while(count < 3) { - sendCmd("AT+CSQ\r\n"); - readBuffer(gprsBuffer,25); - if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) { - break; - } - count++; - wait(1); - } - if(count == 3) { - return -1; - } - return index; -} -/* esta funcion de abajo configura el modem de forma inicial con comandas AT -y si todo sale bien retorna un cero que en la programacion hay que validar -con alguna expresion logica pero si algo sale mal retorna un -1 -*/ -//*************************************************************************************** -/*int settingSMS() //esta funcion se invoca para configurar el modem al principio -{ - if(0 != sendCmdAndWaitForResp("AT\r\n", "OK", 1)) { - return -1; - } - if(0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 1)) { - return -1; - } - if(0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 1)) { - return -1; - } - if(0 != sendCmdAndWaitForResp("ATE\r\n", "OK", 1)) { - return -1; - } - if(0 != sendCmdAndWaitForResp("CBST=0,0,1\r\n", "OK", 1)) { - return -1; - } - return 0; -} -*/ - - -/* esta funcion de abajo inicaliza el modem se compone de un grupo de subfunciones ya definidas previamente -primero chequea que este vivo -segundo chequea el estado de la simcard -tercero chequea la intencidad de señal celular -cuarto aplica la configuracion -y si todo sale bien retorna un cero que en la programacion hay que validar -con alguna expresion logica -*/ -//*************************************************************************************** -int init() -{ - for(int i = 0; i < 3; i++){ - sendCmdAndWaitForResp("AT\r\n", "OK", 1); - wait(0.5); - } - if(0 != checkSIMStatus()) { - return -1; - } - if(checkSignalStrength()<1) { - return -1; - } - - GSM.attach(&Rx_interrupt, Serial::RxIrq); - return 0; -} -/* esta funcion de abajo intenta leer un mensaje de texto en formato PDU o HEX -y si todo sale bien retorna un cero que en la programacion hay que validar -con alguna expresion logica -*/ -//*************************************************************************************** -int readSMSpdu(char *message, int index) -{ - int i = 0; - char gprsBuffer[100]; - char *p,*s; - GSM.printf("AT+CMGR=%d\r\n",index); - cleanBuffer(gprsBuffer,100); - readBuffer(gprsBuffer,100); - if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) { - return -1; - } - if(NULL != ( s = strstr(gprsBuffer,"+32"))) { - p = s + 6; - while((*p != '$')&&(i < 5)) { - message[i++] = *(p++); - } - message[i] = '\0'; - } - return 0; -} -/* esta funcion de abajo borra mensajes SMS del modem -y si todo sale bien retorna un cero que en la programacion hay que validar -con alguna expresion logica -*/ -//*************************************************************************************** -int deleteSMS(int index) -{ - char cmd[32]; - snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index); - sendCmd(cmd); - return 0; -} -//***0********************************************************************************* - -// Interupt Routine to read in data from serial port -void Rx_interrupt(){ - } - /* - readBuffer(buffer,6); - if(strncmp(buffer, "+CMTI", 5)){ - wait(1); - GSM.printf("AT+CMGL=%d\r\n",0); - readBuffer(buffer,100);} - if(strncmp(buffer, "+CMGL:", 5)){ - for (i=0;i<31;i++){ - buffer[5+i]=c; // 32 de basura - } - } - for (i=0;i<10;i++){ - buffer[36+i]=tel[i]; // numero telefonico - } - for (i=0;i<18;i++){ - buffer[46+i]=c; // 18 de basura - } - for (i=0;i<2;i++){ - buffer[64+i]=tel[i]; // tamaño de septetos - } - for (i=0;i<30;i++){ - buffer[66+i]=DE[i]; // datos en octetos hex - if (buffer[i]=='\0'){ - } - */ - int main(void) - { - - //NVIC_DisableIRQ(UART1_IRQn); - //apagamos los 3 leds - LedVerde=1; - LedRojo=1; - LedAzul=1; - lenpack=6; //tamaño de "ALARMA" - GSM.baud(9600);//configura los baudios de la FRDMKL25Z en 9600 - GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART - //configuro modem GSM - GSM.printf("AT\r\n"); +{ + + GSM.baud(9600);//configura los baudios de la FRDMKL25Z en 9600 + GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART + + while(1) { + //wait(2); + + + + if (GSM.readable()) { + readBuffer(buffer,100); + + if(buffer[10]=='S'&& buffer[11]=='M'){ + pc.printf("Llego mensaje\n\r "); + buffer[10]=' '; + buffer[11]=' '; + GSM.printf("AT+CMGR=%c\r\n",buffer[14]); + pc.printf("AT+CMGR=%c\r\n",buffer[14]); + } + + if(buffer[68]=='C'&& buffer[69]=='3'&&buffer[70]=='B'&& buffer[71]=='7'&&buffer[72]=='1'&& buffer[73]=='C')//recibe mensaje Cor + { + + pc.printf("El mensaje es Cor\n"); + buffer[68]=' '; + buffer[69]=' '; + buffer[70]=' '; + buffer[71]=' '; + buffer[72]=' '; + buffer[73]=' '; + + + if(gps.sample()) { + frac_long=(int)abs(1000000*gps.longitude-(int)gps.longitude); + ent_long=(int)gps.longitude; + frac_lat=(int)abs(1000000*gps.latitude-(int)gps.latitude); + ent_lat=(int)gps.latitude; + // pc.printf("%d.%d,%d.%d\n",ent_long,frac_long,ent_lat,frac_lat); + + lat1[0]=ent_lat+48; + lat1[1]='.'; + + for(z=6;z>=0;z--) + { + g= pow(10,0.0+z); + lat1[8-z]=(frac_lat/g)+48; + frac_lat=frac_lat%g; + } + + + lon1[0]='-'; + ent_long=ent_long*-1; + lon1[1]=(ent_long/10)+48; + lon1[2]=(ent_long%10)+48; + lon1[3]='.'; + for(z=7;z>=0;z--) + { + g= pow(10,0.0+z); + lon1[11-z]=(frac_long/g)+48; + frac_long=frac_long%g; + } + + + + + } + + + LENIN=30; + + for(i=LENIN;i<(LENIN+9);i++) + { + DE[i]=lat1[i-LENIN]; + } + + LENIN=LENIN+9; + + DE[i]=','; + + LENIN=LENIN+1; + + for(i=LENIN;i<(LENIN+12);i++) + { + DE[i]=lon1[i-LENIN]; + } + LENIN=LENIN+12; + + + + K=0;C=0; + for (i=0;i < LENIN;i++){ + DS[i]=DE[i+C]>>K | DE[i+C+1]<<(7-K); + if (DS[i]==0x00) {LENOUT=i; goto salir;} + K++; + if (K==7) {K=0;C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion. + } + + //-------------------------------------------------------------- +salir: + + GSM.printf("AT\r\n");//envia link con coordenadas wait(0.5); GSM.printf("AT+CNMI=1,1\r\n"); wait(0.5); @@ -331,50 +189,108 @@ wait(0.5); GSM.printf("CBST=0,0,1\r\n"); wait(0.5); - LedVerde=0; - - //if(0!= init()){ //se configura y chequea el modem GSM - // LedRojo=0; - //} - while(1){ - if (button1.falling()) - { LedVerde=1; - wait(2); - if (!button1) - {LedVerde=0; - index=20; - //GSM.printf("AT+CNMI=1,1\r\n"); //configuracion inicial del MODEM! - GSM.printf("AT+CMGS=%d\r\n",index); - wait(0.2); - GSM.printf("0011000A9113223717370000AA08416650DA0C8262"); //esto es "ALARMA 1" + GSM.printf("at+cmgs=%d\r\n",13+LENIN); + pc.printf("at+cmgs=%d\r\n",13+LENIN); + wait(0.5); + GSM.printf("0011000A9113315442760000AA"); //12 octetos + los octetos del mensaje + pc.printf("0011000A9113315442760000AA"); //12 octetos + los octetos del mensaje + //3113452467 + if(LENIN<=15) + { + pc.printf("0"); + GSM.printf("0"); + pc.printf("%X",LENIN); + GSM.printf("%X",LENIN); + } + else{ + pc.printf("%2X",LENIN); + GSM.printf("%2X",LENIN); + } + + for (i=0;i < LENIN;i++){ + if(DS[i]<=15) + { + pc.printf("0"); + GSM.printf("0"); + pc.printf("%X",DS[i]); + GSM.printf("%X",DS[i]); + } + else{ + pc.printf("%2X",DS[i]&0x000000FF); + GSM.printf("%2X",DS[i]&0x000000FF); + } + } + //GSM.printf("%X",68); //12 octetos + los octetos del mensaje + //GSM.printf("9");//GSM.printf("%u",30); + wait(0.5); + GSM.putc(0x1A); + + } + + + } + + if(buffer[68]=='4'&& buffer[69]=='F'&&buffer[70]=='3'&& buffer[71]=='7')//recibe mensaje On + { + on_off=1; + pc.printf("El mensaje es On\n"); + buffer[68]=' '; + buffer[69]=' '; + buffer[70]=' '; + buffer[71]=' '; + GSM.printf("AT\r\n");//proto0colo envio de mensaje + wait(0.5); + GSM.printf("AT+CNMI=1,1\r\n"); wait(0.5); - GSM.putc((char)0x1A); //esto es controlZ - LedVerde=1; - LedRojo=0; //lo prendo - wait(3); - LedRojo=1; //lo apago - LedVerde=0; - } - -} - if(GSM.readable()) { //USE ESTE FRAGMENTO DE CODIGO PARA LEER LO QUE EL CELULAR RESPONDE - while(GSM.readable()) { - char c = GSM.getc(); - buffer[count++] = c; - if(count == 64) break; - } - pc.puts(buffer); - - - for(int i = 0; i < count; i++) { - buffer[i] = NULL; - } - - count = 0; - - } - + GSM.printf("AT+CMGF=0\r\n"); + wait(0.5); + GSM.printf("ATE\r\n"); + wait(0.5); + GSM.printf("CBST=0,0,1\r\n"); + wait(0.5); + GSM.printf("at+cmgs=%d\r\n",21); + pc.printf("at+cmgs=%d\r\n",21); + wait(0.5); + GSM.printf("0011000A9113315442760000AA0945F7B8EC26A7C96F"); //12 octetos + los octetos del mensaje---devuelve mensaje encendido enciende un led que esta en PTC17 + pc.printf("0011000A9113315442760000AA0945F7B8EC26A7C96F"); + wait(0.5); + GSM.putc(0x1A); + + } + + if(buffer[68]=='4'&& buffer[69]=='F'&&buffer[70]=='B'&& buffer[71]=='3'&&buffer[72]=='1'&& buffer[73]=='9')//recibe mensaje Off + { + on_off=0; + pc.printf("El mensaje es Off\n");// se borra el mensaje + buffer[68]=' '; + buffer[69]=' '; + buffer[70]=' '; + buffer[71]=' '; + buffer[72]=' '; + buffer[73]=' '; + GSM.printf("AT\r\n");//protocolo de envio de mensaje + wait(0.5); + GSM.printf("AT+CNMI=1,1\r\n"); + wait(0.5); + GSM.printf("AT+CMGF=0\r\n"); + wait(0.5); + GSM.printf("ATE\r\n"); + wait(0.5); + GSM.printf("CBST=0,0,1\r\n"); + wait(0.5); + GSM.printf("at+cmgs=%d\r\n",20); + pc.printf("at+cmgs=%d\r\n",20); + wait(0.5); + GSM.printf("0011000A9113315442760000AA074178F81C26BF01"); //12 octetos + los octetos del mensaje----devuelve mensaje apagado--apaga el led de PTC17 + pc.printf("0011000A9113315442760000AA074178F81C26BF01"); + wait(0.5); + GSM.putc(0x1A); + + } + + } -} + +} // buffer[i] contiene lo que regresa \ No newline at end of file