Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of rastreador_satelital_2 by
main.cpp
- Committer:
- satelite
- Date:
- 2016-05-25
- Revision:
- 0:e48cba9116f6
- Child:
- 1:e72724565122
File content as of revision 0:e48cba9116f6:
/*Tarea_GSM_GPS
Sistema de ubicacion basado en un receptor GPS y un celular siemens a56
como modem GSM.
El sistema recibe un mensaje de texto, lo procesa y si el mensaje recibido corresponde
con el codigo almacenado en el microcontrolador, este procede a enviar un mensaje de texto
con la ubicacion actual.
*/
#include "mbed.h"
#include "iostream"
#include "GPS.h"
// Configuracion de los puertos del microcontrolador
Serial gsm(PTE0, PTE1); // puerto serie para la comunicacíón GSM
Serial pc(USBTX, USBRX); // puerto serie para debug
GPS gps(PTD7, PTD6); // puerto para comunicacion GPS
// Declaracion de variables globales
char buffer[200], pdu[] = "", vector1[] = "", vector2[] = "", 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], Xnumero[10]; // Variables para almacenar las cadenas de caracteres
int i, k, c, w, r, ta, tam, lenOUT, lenIN; // variables auxiliares
float lon, lat; // variables para almacenar coordenadas
char link[]= {"http://maps.google.com/?q="}; // inicio trama mensaje
// Rutina principal
int main()
{
pc.printf("######################### INICIO DEL PROGRAMA #########################"); // mensaje de bienvenida debug
// Establecimiento de la comunicacion con el modem del telefono movil
pc.printf("\r\n>>>>>>>>>>>>>>>>>>>>>> Configurando SIEMENS A56i <<<<<<<<<<<<<<<<<<<<<<\r\n"); // mensaje debug
gsm.baud(9600);
gsm.format(8,Serial::None,1);
std::string strOK ("OK");
pc.printf("\r\n Enviamos AT \r\n"); // prueba comunicacion con el movil
gsm.printf("AT\r\n");
gsm.scanf("%s",buffer);
gsm.scanf("%s",buffer);
pc.printf("%s\n",buffer);
if(strOK.compare(buffer) != 0) {
pc.printf("\r\nModem GSM no responde\r\n");
}
gsm.printf("\n AT+CNMI=1,1\r\n"); // Selecciona la memoria de la simcard
pc.printf("AT+CNMI=1,1\r\n");
gsm.scanf("%s",buffer);
gsm.scanf("%s",buffer);
pc.printf(">%s\n",buffer);
if(strOK.compare(buffer) != 0) {
pc.printf("\r\nModem GSM no responde\r\n");
}
gsm.printf("\n AT+CPMS= \"SM\",\"SM\",\"SM\"\r\n"); //
pc.printf("AT+CPMS= \"SM\",\"SM\",\"SM\"\n");
gsm.scanf("%s",buffer);
gsm.scanf("%s",buffer);
gsm.scanf("%s",buffer);
pc.printf(">%s\n",buffer);
wait(1);
gsm.printf("\n AT+CMGF=0\r\n"); // Configura modo PDU
pc.printf("AT+CMGF=0\r\n");
gsm.scanf("%s",buffer);
gsm.scanf("%s",buffer);
pc.printf(">%s\n",buffer);
if(strOK.compare(buffer) != 0) {
pc.printf("\r\nModem GSM no responde\r\n");
}
pc.printf("\n CBST=0,0,1\r\n");
gsm.printf("CBST=0,0,1\r\n"); // en espera de mensajes entrantes
if(gps.sample()) {
pc.printf("Estamos en %f, %f\r\n", gps.latitude, gps.longitude+50); // muestro la ubicacion actual, para saber si el GPS esta recibiendo
} else {
pc.printf("no se donde!:(\r\n");
}
// Ciclo infinito
while(1) {
pc.printf("\r\n>>>>>>>>>>>>>>>>>> Esperando nuevo mensaje de texto <<<<<<<<<<<<<<<<<<<\r\n");
gsm.scanf("%s",buffer);
pc.printf("%s",buffer);
i = strlen(buffer);
if(i>3) { // si reciba un mensaje
pc.printf("\r\n>>>>>>>>>>>>>>>>>>>>>>>>>>>> Nuevo mensaje <<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n");
gsm.printf("AT+CMGR=1\r\n"); // lee menjsae en la primera posicion de memoria
gsm.scanf("%s",buffer);
gsm.scanf("%s",buffer);
gsm.scanf("%s",buffer);
gsm.scanf("%s",buffer);
pc.printf(">%s \r\n",buffer); // imprime la cadena PDU del mensaje
tam = strlen(buffer); // longitud del mensaje leido
pc.printf("\r\nLectura de la trama PDU: %d\r\n", tam); // separa la trama pdu para extraer informacion necesaria
Ctamanosms[0] = buffer[0]; // tamaño en septetos de toda la trama pdu
Ctamanosms[1] = buffer[1];
pc.printf("\r\nLongitud del mensaje en septetos %c%c en septetos \n", Ctamanosms[0], Ctamanosms[1]);
Ctiposmsc[0] = buffer[2];
Ctiposmsc[1] = buffer[3];
pc.printf("\r\nTipo de direccion SMSC %c%c \r\n", Ctiposmsc[0], Ctiposmsc[1]);
Csmscnumber[0] = buffer[4];
Csmscnumber[1] = buffer[5];
Csmscnumber[2] = buffer[6];
Csmscnumber[3] = buffer[7];
Csmscnumber[4] = buffer[8];
Csmscnumber[5] = buffer[9];
Csmscnumber[6] = buffer[10];
Csmscnumber[7] = buffer[11];
Csmscnumber[8] = buffer[12];
Csmscnumber[9] = buffer[13];
Csmscnumber[10] = buffer[14];
Csmscnumber[11] = buffer[15];
pc.printf("\r\nNumero del SMSC %s \r\n", Csmscnumber);
Cdeliver[0] = buffer[16];
Cdeliver[1] = buffer[17];
Ctamanoaddress[0] = buffer[18];
Ctamanoaddress[1] = buffer[19];
Ctipoaddress[0] = buffer[20];
Ctipoaddress[1] = buffer[21];
Cnumero[0] = buffer[22]; // Numero del usuario
Cnumero[1] = buffer[23];
Cnumero[2] = buffer[24];
Cnumero[3] = buffer[25];
Cnumero[4] = buffer[26];
Cnumero[5] = buffer[27];
Cnumero[6] = buffer[28];
Cnumero[7] = buffer[29];
Cnumero[8] = buffer[30];
Cnumero[9] = buffer[31];
Cnumero[10] = buffer[32];
Cnumero[11] = buffer[33];
Xnumero[0] = buffer[23];
Xnumero[1] = buffer[22];
Xnumero[2] = buffer[25];
Xnumero[3] = buffer[24];
Xnumero[4] = buffer[27];
Xnumero[5] = buffer[26];
Xnumero[6] = buffer[29];
Xnumero[7] = buffer[28];
Xnumero[8] = buffer[31];
Xnumero[9] = buffer[30];
pc.printf("\r\nNumero del usuario %s \r\n", Xnumero);
Cprotocolo[0] = buffer[34]; // protocolo
Cprotocolo[1] = buffer[35];
Cencoding[0] = buffer[36]; // cifrado
Cencoding[1] = buffer[37];
Ctime[0] = buffer[38]; // Tiempo envio mensaje
Ctime[1] = buffer[39];
Ctime[2] = buffer[40];
Ctime[3] = buffer[41];
Ctime[4] = buffer[42];
Ctime[5] = buffer[43];
Ctime[6] = buffer[44];
Ctime[7] = buffer[45];
Ctime[8] = buffer[46];
Ctime[9] = buffer[47];
Ctime[10] = buffer[48];
Ctime[11] = buffer[49];
Ctime[12] = buffer[50];
Ctime[13] = buffer[51];
Ctamano[0]= buffer[50]; // longitud de la parte legible
Ctamano[1]= buffer[51];
ta = (Ctamano[0]-48)*16+(Ctamano[1]-48);
pc.printf("\r\nNumero de caracteres del mensaje entrante %d \r\n", ta);
pc.printf("\r\nPosicion de los datos en el mensaje PDU %d \r\n", tam-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] = buffer[52+i];
}
// Inicia la convercion de PDU a Texto
pc.printf("\r\n>>>>>>>>>>>>>>>>>>>>> Convirtiendo de PDU a texto <<<<<<<<<<<<<<<<<<<<<\r\n");
lenIN = strlen(Cdato)/2;
w = 0;
pc.printf("\r\nTamano de los datos %d \r\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];
pc.printf("\r\nDatos en hexagesimal DE[%d] %2X \r\n", w, dE[w]); // Se guarda la dupla en el vector dE
w++;
}
}
lenOUT = lenIN*8/7;
k = 7;
c = 0;
dS[0] = dE[0] & 0x7F;
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;
pc.printf("%2X,%d,%d\r\n",dS[i],i,k);
if (k==0) {
k = 8;
c++;
}
k--;
}
pc.printf("\r\nMensaje entrante: ");
for (i = 0; i < lenOUT; i++) {
pc.printf("%c",dS[i]);
}
pc.printf("\r\n>>>>>>>>>>> Termina convercion de los datos de PDU a texto <<<<<<<<<<<<\r\n");
}
std::string strC ("Coordenada"); // cadenas para comparar el mensaje recibido
if(strC.compare(dS) == 0) { // En caso de que se pidan las coordenadas
pc.printf("\r\n>>>>>>>>>>>>>>>>>>>>>>>> Recibido: Coordenada <<<<<<<<<<<<<<<<<<<<<<<<<\n");
pc.printf("\r\nEsperando GPS \r\n");
while(1) {
i = 0;
if(gps.sample() && i == 0) {
pc.printf("\r\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Leyendo GPS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n");
//Toma de datos del gps y concatenacion para armar los datos.
lon = gps.longitude+50;
lat = gps.latitude;
sprintf(vector1, "%f", lat);
strcat(link,vector1);
strcat(link,",");
sprintf(vector2, "%f", lon);
strcat(link,vector2);
strcat(dEs,link);
pc.printf("%s\n",link);
// Conversion de los datos "link" a formato 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;
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));
pc.printf("\r\n>>>>>>>>>>>>>>>>> Comienza el envio del mensaje SMS <<<<<<<<<<<<<<<<<<\r\n");
if(lenOUT%2==0) {
w = 27;
} else {
w = 26;
}
gsm.printf("AT+CMGS=%d\r\n", ((2*lenOUT)+w)/2); // Inicia 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 de destino
gsm.printf("%c", Cnumero[i]);
pc.printf("%c", Cnumero[i]);
}
gsm.printf("000AA"); // segundo relleno
pc.printf("000AA");
gsm.printf("%2X",lenIN); // longitud de los datos
pc.printf("%2X",lenIN);
for (i = 0; i < lenOUT; i++) {
gsm.printf("%02X",dSs[i]&0x000000FF);
pc.printf("%02X",dSs[i]&0x000000FF);
wait(0.1);
}
gsm.putc((char)0x1A);
gsm.scanf("%s",buffer); // lectura respuesta del modem
gsm.scanf("%s",buffer);
pc.printf("\r\nRespuesta movil: %s \r\n",buffer);
i = 1;
gsm.printf("AT+CMGD=1\r\n");
for(i = 26; i <= strlen(link); i++) {
link[i] = NULL;
}
for(i = 0; i <= 255; i++) {
dSs[i] = NULL;
dEs[i] = NULL;
}
pc.printf("\r\n Se sale de while para la lectura de gps \r\n ");
gsm.scanf("%s",buffer);
pc.printf(">%s",buffer);
goto xt;
}
}
}
if(strC.compare(dS) != 0) {
pc.printf("\r\nMensaje no valido\r\n");
gsm.printf("AT+CMGD=1\r\n"); // Borrar el mensaje
gsm.scanf("%s",buffer);
pc.printf("\n%s\n",buffer);
}
xt:
gsm.scanf("%s",buffer);
pc.printf("%s",buffer);
}
}
