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.
main.cpp
- Committer:
- AaronGonzalez
- Date:
- 2016-06-03
- Revision:
- 1:e2bd083802c0
- Parent:
- 0:b2a6aa7c0c8c
- Child:
- 2:ea6275d1222f
File content as of revision 1:e2bd083802c0:
///Tarea de comunicación celular y módulo GPS
//programa para celular siemens que recibe un mensaje de texto y activa una salida en formato
//pdu hex
#include "mbed.h"
#include "DebouncedIn.h"
#include "stdio.h"
#include "string.h"
#include "GPS.h"
//Salidas digitales
Timer t;
DigitalOut LedVerde(LED2);
DigitalOut LedRojo(LED1);
DigitalOut LedAzul(LED3);
//Declaración de los puertos de la FRDm, modem y GPS
Serial GSM(PTE0,PTE1); //puertos del FRDM para el modem
Serial pc(USBTX,USBRX);
GPS gps(PTE22, PTE23); // Puerto del FDRM para el gps
//Declaración de variables
//Cadenas de caracteres con las que se va a trabajar
short DE[255];
short DS[255];
char buffer[512];
char buffermsg[100];
char buffer1[13];
char mensaje[100];
//Variables enteras y caracteres
int count;
int i,K,LENOUT,LENIN,C;
int c=0;
int cont=0;
unsigned char CtrlZ = 0x1A;
bool Flag = false;
char r[]="";
char msg[256];
char char1;
int index;
//Adquisición de números de teléfono, emisor - receptor
char Tel[15];
char cel[15];
char ojala[15]; // OJO
//El GPS entregará al celular coordenadas expresadas en latitud y longitud según la ubicación que encuentre
// por tanto se declaran estas variables:
float lo,la;
char clo[255], cla[255]; //Cadenas a capturar para latitud y longitud
int LENINlo,LENINla,LENINla_lo;
char la_lo[255];
//Cadena de google maps
char http2[255];
char http[] = "http://maps.google.com/maps?q=";
//Conversión octetos septetos
int iht,Kht,ChtLENOUTht,LENINht;
int ioct,Koct,LENOUToct,LENINoct,Coct;
char DEoct[255];
char DSoct[255];
char buf[100];
//Relleno de datos - con el fin de que tengan el mismo número de caracteres
char relle1[]= "0011000A91";
char relle2[]= "10000AA";
char relle3[]= "68";
//Funciones del programa
int readBuffer(char *buffer,int count)
{
int i=0;
t.start();
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; // ojooo
if(t.read() > 3) {
t.stop();
t.reset();
break;
}
}
wait(0.5);
while(GSM.readable()) {
char c = GSM.getc();
}
return 0;
}
//Programas a ejecutar
int main(void)
{
//LED´S en alto
LedVerde=1;
LedRojo=1;
LedAzul=1;
//Tasa de baudios
GSM.baud(9600);
GSM.format(8,Serial::None,1);
//Lectura del modem
GSM.printf("AT\r\n");
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);
while(1){
//Lectura del buffer
if (GSM.readable()) {
readBuffer(buffer,100);
pc.printf("buffer= %s\n\r ",buffer);
pc.printf("buffer= %c %c\n\r ",buffer[10],buffer[11]);
if(buffer[67]=='A'){for(i=0;i<86;i++)
{buffermsg[i]=buffer[i];}
pc.printf("mensaje= %s\n\r ",buffermsg);
pc.printf("mensaje[72]= %c mensaje[73]=%c\n\r ",buffermsg[72],buffermsg[73]);
buffer[67]='c';
//Si llegan estos tres tipos de mensajes...
if (buffermsg[69] == '2'){ // PARA CUANDO LA CLAVE ES On
LENIN=2; //numero de caracteres de abajo son los octetos
DE[0]=0x47;
DE[1]=0x37;
}
if (buffermsg[69] == '3'&& buffermsg[70] == '4'){ // PARA CUANDO LA CLAVE ES Off
LENIN=3; //numero de caracteres de abajo son los octetos
DE[0]=0x4F;
DE[1]=0xB3;
DE[2]=0x19;
}
//Recepción de las coordenadas otorgadas por el GPS
if (buffermsg[69] == '3'&& buffermsg[70] == 'C'){ // PARA CUANDO LA CLAVE ES Cor
LENIN=3; //numero de caracteres de abajo son los octetos
DE[0]=0xC3;
DE[1]=0xB7;
DE[2]=0x1C;
}
LENOUT= LENIN*8/7;
K=7;
C=0;
DS[0]=DE[0] & 0x7F; // la primera sola
pc.printf("%2X\n",DS[0]);
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\n",DS[i]);
if (K==0) {K=8;C++;}
K--;
}
for (i=0 ;i<=9;i++)
{
Tel[i] = buffermsg[40+i];
}
//Lectura del número de teléfono
pc.printf("\n");
pc.printf("%c%c%c%c%c%c%c%c%c%c",Tel[1],Tel[0],Tel[3],Tel[2],Tel[5],Tel[4],Tel[7],Tel[6],Tel[9],Tel[8]);
}
if(buffer[10]=='S'&& buffer[11]=='M'){
for(i=0;i<5;i++)
{buffer1[i]=buffer[2+i];}
pc.printf("buffer1= %s\n\r ",buffer1);
buffer[10]='c';
buffer[11]='c';
}
if(buffer1[3]=='T'){pc.printf("AT+CMGL=0\n\r");
wait(0.5);
GSM.printf("AT+CMGL=0\r\n");
buffer1[3]='p';
}
if(DS[0]-67 == 0&& DS[1]-111==0) // Cor en octetos es 436f72
{
pc.printf("\n");
LedAzul=0;
DS[0] = '\0';
DS[1] = '\0';
//Entrega los datos de longitud y latitud
if(gps.sample())
{
lo =gps.longitude;
la =gps.latitude;
pc.printf("longitud_entera=%f, Latitud entera=%f\n", lo, la);
wait(0.5);
//LONGITUD/
sprintf (clo, "%f", lo);
pc.printf ( "\nlongitud = %s\n",clo);
LENINlo=strlen(clo);
wait(0.5);
//LATITUD/
sprintf (cla, "%f", la);
pc.printf ( "\nlatitud = %s\n",cla);
LENINla=strlen(cla);
//Concatenando las cadenas de Latitud y Longitud...
strcpy(la_lo,cla);
strcat(la_lo,",");
strcat(la_lo,clo);
pc.printf ( "\nla_lo: %s\n",la_lo);
LENINla_lo=strlen(la_lo);
//Ahora se juntan las cadenas obtenidas y se agrega el protocolo de transferencia de hipertextos http
strcpy(http2,http);
strcat(http2,la_lo);
pc.printf ( "%s\n",http2);
pc.printf ( "\n" );
//Conversión de la cadena de http2 de octetos a septetos
LENINht=strlen(http2);
pc.printf("%d\n",LENINht);
for (iht=0;iht<LENINht;iht++){
pc.printf("%2X",http2[iht]);
}
pc.printf ( "\n" );
LENINoct=strlen(http2);
pc.printf("%d\n",LENINoct);
for (ioct=0;ioct<LENINoct;ioct++)
{
DEoct[ioct]=http2[ioct];
pc.printf("%2X,%d\n",DEoct[ioct],ioct);
}
Koct=0;
Coct=0;
for (ioct=0;ioct < LENINoct;ioct++)
{
DSoct[ioct]=DEoct[ioct+Coct]>>Koct | DEoct[ioct+Coct+1]<<(7-Koct);
if (DSoct[ioct]==0x00){
LENOUToct=ioct;
pc.printf("\n");
pc.printf("%s",DEoct);
pc.printf("out =%d",LENOUToct);
for (ioct=0;ioct<LENOUToct;ioct++){
pc.printf("%2X,%d\r\n",DSoct[ioct]&0x000000FF,ioct);
}
}
Koct++;
if (Koct==7)
{
Koct=0;Coct++;
} // se chequea que ya se acabaron los bits en un ciclo de conversion.
}
//Concatenación de los datos relleno y el número de celular
wait(5);
index=56;
GSM.printf("AT+CMGS=%d\r\n",index);
pc.printf("AT+CMGS=%d\r\n",index);
pc.printf("0011000A91");
GSM.printf("0011000A91");
for (i=0 ;i<=9;i++)
{
pc.printf("%c",Tel[i]);
GSM.printf("%c",Tel[i]);
}
pc.printf("10000AA");
GSM.printf("0000AA");
pc.printf("31");
GSM.printf("31");
for (ioct=0;ioct<=((LENOUToct*7)/8);ioct++)
{
pc.printf("%02X",DSoct[ioct]);
GSM.printf("%02X",DSoct[ioct]);
}
wait(0.5);
GSM.putc((char)0x1A);
GSM.scanf("%s",buf);
GSM.scanf("%s",buf);
GSM.scanf("%s",buf);
//GSM.scanf("%s",buf);
pc.printf(">%s\n",buf);
pc.printf("\n");
}
}
//Si el mensaje recibido fue OFF...
if(DS[0]-79==0 && DS[1]-102==0) // Off en octetos es 4F6666
{
//Secuencia de apagado
LedAzul=1;
LedVerde = 0;
LedRojo=1;
}
//Si el mensaje recibido fue ON...
if(DS[0]-71==0 && DS[1]-110==0) // On en octetos es 476E
{
//Secuencia de apagado
LedAzul=1;
LedRojo =0;
LedVerde = 1;
}
}
}
}