PROGRAMA PARA HACER SEGUIMIENTO DE FLOTAS CON GPS Y CONEXION A LA RED GPRS
Dependencies: mbed DebouncedIn GPS_G
Dependents: 61_RASTREO_GPRS_copy
PROGRAMA PARA HACER SEGUIMIENTO DE FLOTAS CON GPS Y CONEXION A LA RED GPRS
Emplea modem gprs SIM900
vea pagina completa del proyecto.:
https://www.unrobotica.com/proyectos/rastreadorgsm.html
se implementa en una FRDMKL25Z y un modulo Bluepill STM32F103.
Diff: main.cpp
- Revision:
- 0:627d6e86a48e
- Child:
- 1:3e0a9c577f09
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Apr 12 05:58:48 2019 +0000 @@ -0,0 +1,314 @@ +/* +PROGRAMA PARA HACER SEGUIMIENTO DE FLOTAS CON GPS Y CONEXION A LA RED GPRS +se pueden simular trayectorias gravando archivos kml en google earth y usando +SatGen +version 1.0, abril 2019 + +se asigna un APN segun el servicio GPRS de la SIMCARD +se asigna un nombre de host de su pagina web +se asigna el path de los archivos y mapas ejecutables en su servidor +se asigna un ciclo de repeticion de lecturas de GPS. + +*/ + +#include "mbed.h" +#include "stdio.h" +#include "string.h" +#include "GPS.h" + +Timer t; +DigitalOut LedVerde(LED2); +DigitalOut LedRojo(LED1); +DigitalOut LedAzul(LED3); +InterruptIn button(PTA13); + + +float lo,la; +char lon[15], lat[15]; // Cadenas a capturar para latitud y longitud. +char gprsBuffer[20]; +char resp[15]; +Serial GSM(PTE0,PTE1); // Puertos del FRDM para el Módem. +Serial pc(USBTX,USBRX); +GPS gps(PTE22, PTE23); // Puerto del FDRM para el GPS. +int result; +int z=0; +int i=0; +int count=0; + +//----------------------------------------------------------------------------------------------------------------------------- +// Esta funcion de abajo lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de +// $, count es lo que va a leer. Lo leido lo mete en buffer que es una cadena previamente definida +// incorpora medida de tiempo si se demora mas de tres segundos retorna fracaso con -1 +int readBuffer(char *buffer,int count){ + int i=0; + t.start(); // start timer + while(1) { + while (GSM.readable()) { + char c = GSM.getc(); + if (c == '\r' || c == '\n') c = '$'; + buffer[i++] = c; + if(i > count)break; + } + if(i > count)break; + if(t.read() > 3) { + t.stop(); + t.reset(); + break; + } + } + wait(0.5); + while(GSM.readable()){ // display the other thing.. + char c = GSM.getc(); + } + return 0; +} +//-------------------------------------------------------------------------------------------------------------- +// Esta función de abajo limpia o borra todo un "buffer" de tamaño "count", +// lo revisa elemento por 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 función de abajo envia un comando parametrizado como cadena +// puede ser un comando tipo AT. +void sendCmd(char *cmd){ + GSM.puts(cmd); +} +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Esta función de abajo espera la respuesta de un comando que debe ser idéntica 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 función de abajo es muy completa y útil, 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 lógica. +int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout){ + sendCmd(cmd); + return waitForResp(resp,timeout); +} +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Esta función de abajo chequea que el módem este vivo, envia AT, le contesta con OK y espera 2 segundos. +int powerCheck(void){ // Este comando se manda para verificar si el módem esta vivo o conectado. + return sendCmdAndWaitForResp("AT\r\n", "OK", 2); +} +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Esta función 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 expresión lógica. +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 función de abajo chequea la calidad de la señal +// 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 +// con alguna expresión lógica. +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; +} + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +// detectar direcion ip +int ip_detect(){ + if (GSM.readable()){ + readBuffer(gprsBuffer,15); + for(i=0;i<15;i++) + { + resp[i]=gprsBuffer[i]; + } + cleanBuffer(gprsBuffer,20); + for(i=0;i<15;i++){ + if(resp[i]== '.'){ + z++; + } + } + if(z==3){ + pc.printf("llego ip=%d\r\n",z); + z=0; + return 0; + } + }//fin check GSM modem + z=0; + return -1; + }//fin funcion + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Esta funcion de abajo inicia la comunicacion GPRS con la red celular, Se compone de un grupo de subfunciones ya definidas previamente +// envia las secuencias de forma ordenada esparando la respuesta adecuada +// si todo sale bien retorna un cero que en la programacion hay que validar +// con alguna expresión lógica. +//********************************************************************************************************* + +int init_gprs(void){ + + if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3)){ + return -1; + } + if (0 != sendCmdAndWaitForResp("ATE0\r\n", "OK", 3)){ //sin eco + return -1; + } + if (0 != sendCmdAndWaitForResp("AT+CGATT=1\r\n", "OK", 3)){//inicia conexion GPRS + return -1; + } + if (0 != sendCmdAndWaitForResp("AT+CSTT=internet.comcel.com.co,comcel,comcel\r\n", "OK", 3)){ //set apn + return -1; + } + if (0 != sendCmdAndWaitForResp("AT+CIICR\r\n", "OK", 3)){ //habilitar conexion inalambrica + return -1; + } + + cleanBuffer(gprsBuffer,25); + sendCmd("AT+CIFSR\r\n"); //obtener direccion ip + if(0 != ip_detect()){ //esperar la llegada de un direccion IP + return -1; + } + wait(1); + LedVerde=0; + return 0; +} + +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +int end_gprs(void){ + if (0 != sendCmdAndWaitForResp("AT+CIPSHUT\r\n", "OK", 3)){ + return -1; + } + if (0 != sendCmdAndWaitForResp("AT+CGATT=0\r\n", "SHUT OK", 3)){ + return -1; + } + LedVerde=0; + LedRojo=1; + return 0; + } + +//++++++++++++++++++++++++++++++++++++++++++++++++++++ +//interupcion perdida de energia +//++++++++++++++++++++++++++++++++++++++++++++++++++++ + +void off_gprs(){ + end_gprs(); + } + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +//inicio del programa principal +//+++++++++++++++++++++++++++++++++++++++++++++++++++++ +int main(){ + +lop1: + if(init_gprs()<0){ + LedRojo=0; + LedVerde=1; + goto lop1; + } + button.fall(&off_gprs);//perdida de alimentacion,apagaron carro + while(1){ //si el GPS tiene conexion y datos se envian coordenadas a pagina web + LedAzul=1; + if(gps.sample()){ + LedAzul=0; + lo = gps.longitude; + la = gps.latitude; + sprintf (lon, "%f", lo);//pasa de flotante a caracter + sprintf (lat, "%f", la);//pasa de flotante a caracter + repetir1:if (0 != sendCmdAndWaitForResp("AT+CIPSTART=TCP,unrobotica.com,80\r\n","OK", 3)){ + wait(3); + LedVerde=1; + LedRojo=0; + goto repetir1; + } + + repetir2:cleanBuffer(gprsBuffer,10); + //sendCmd("AT+CIPSEND\r\n"); + if(0 !=sendCmdAndWaitForResp("AT+CIPSEND\r\n","",3)){ + wait(1); + goto repetir2; + } + //aca el servidor contesta con contol+z y hay que verificar eso. + //readBuffer(gprsBuffer,10); + //if((NULL = strstr(gprsBuffer,""))){ + // wait(1); + // goto repetir2; + GSM.printf("GET /gpstracker/gps1.php?lat=%s&lon=%s HTTP/1.0\r\n",lat,lon); + GSM.printf("Host: unrobotica.com\n\n"); + GSM.printf("\r\n"); + GSM.printf("\n\r"); + //cleanBuffer(gprsBuffer,20); + //leer bufer y encontrar respuesta exitosa devuelve "SEND OK" + + //readBuffer(gprsBuffer,10); + //if((NULL = strstr(gprsBuffer,""))){ + // wait(1); + // goto repetir2; + LedRojo=1; + LedVerde=0; //envio OK + }// del test del gps + LedRojo=0; // hay problemas + LedVerde=1; + + }//del while col 13 + + }//del main col 11 + + + + + \ No newline at end of file