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.
Diff: main.cpp
- Revision:
- 2:ea6275d1222f
- Parent:
- 1:e2bd083802c0
- Child:
- 3:8aef67673965
--- a/main.cpp Fri Jun 03 01:03:02 2016 +0000
+++ b/main.cpp Fri Nov 18 21:27:40 2016 +0000
@@ -1,79 +1,164 @@
-///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
+// Programa para establecer la comunicación con un módem Siemens A56 por una de las UART.
+// Por otra UART se envían datos de GPS de una región seleccionada de la aplicación de
+// Google Earth en formato .kml leídos por el programa SatGen de NMEA por un puerto COM
+// del Micro hacia un Dongle USB. Se deberá enviar un mensaje de texto al módem el cual
+// podrá ser la palabra "coordenadas" o "voltaje". Si se envía "coordenadas" el programa
+// calcula la latitud y la longitud de la coordenada actual de GPS y envía un mensaje de
+// texto al mismo número con las coordenadas en formato de Google Maps. Si se envía
+// "voltaje" se lee el voltaje de un puerto que se puede variar con un potenciómetro y
+// envía un mensaje de texto con la medida. Los mensajes de texto recibidos se interpretan
+// y decodifican de formato PDU a caracteres y los mensajes enviados se codifican de
+// caracteres a formato PDU para ser enviados.
+
+// Oswaldo Andrés Giraldo Giraldo - C.C.: 1152458465
+// Héctor Andrés Hoyos Ceballos - C.C.: 1039466317
+// Jose Fernando Montoya Vargas - C.C.: 1039468676
+// María Fernanda Villa Tamayo - C.C.: 1152457490
+
#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
+// Entrada análoga
+AnalogIn v(PTB0);
+float medi;
+
+// Declaración de los puertos de la FRDM, Módem y GPS.
+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
-
-//Declaración de variables
+GPS gps(PTE22, PTE23); // Puerto del FDRM para el GPS.
-//Cadenas de caracteres con las que se va a trabajar
-short DE[255];
-short DS[255];
+// Declaración de variables
+// Cadenas de caracteres con las que se va a trabajar.
+char DE1[255];
+char DS1[255];
+char DE2[255];
+char DS2[255];
char buffer[512];
-char buffermsg[100];
-char buffer1[13];
+char resp[6];
+char tam[2];
char mensaje[100];
+
//Variables enteras y caracteres
int count;
-int i,K,LENOUT,LENIN,C;
+int i, K, LENOUT1, LENIN1, LENOUT2, LENIN2, 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
+int ind;
+float med;
+char outmed[16], outmedn[16];
+int ret = 1;
+
+// Adquisición de números de teléfono, emisor - receptor
+char tel[15];
-//El GPS entregará al celular coordenadas expresadas en latitud y longitud según la ubicación que encuentre
-// por tanto se declaran estas variables:
-
+// El GPS entregará al celular coordenadas expresadas en latitud y longitud
+// según la ubicación que encuentre, por lo 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 clo[255], cla[255]; // Cadenas a capturar para latitud y longitud.
+char la_lo[255], volt[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
+// Relleno de datos propio del protocolo de SMS.
+char relle1[] = "0011000A91";
+char relle2[] = "0000AA";
-char relle1[]= "0011000A91";
-char relle2[]= "10000AA";
-char relle3[]= "68";
+// Reverses a string 'str' of length 'len'
+// driver program to test above funtion.
+void reverse(char *str, int len)
+{
+ int i=0, j=len-1, temp;
+ while (i<j)
+ {
+ temp = str[i];
+ str[i] = str[j];
+ str[j] = temp;
+ i++; j--;
+ }
+}
+
+ // Converts a given integer x to string str[]. d is the number
+ // of digits required in output. If d is more than the number
+ // of digits in x, then 0s are added at the beginning.
+int intToStr(int x, char str[], int d)
+{
+ int i = 0;
+ while (x)
+ {
+ str[i++] = (x%10) + '0';
+ x = x/10;
+ }
+
+ // If number of digits required is more, then
+ // add 0s at the beginning
+ while (i < d)
+ str[i++] = '0';
+
+ reverse(str, i);
+ str[i] = '\0';
+ return i;
+}
-//Funciones del programa
+// Converts a floating point number to string.
+void ftoa(float n, char *res, int afterpoint)
+{
+ // Extract integer part
+ int ipart = (int)n;
+
+ // Extract floating part
+ float fpart = n - (float)ipart;
+
+ // convert integer part to string
+ int i = intToStr(ipart, res, 0);
+
+ // check for display option after point
+ if (afterpoint != 0)
+ {
+ res[i] = '.'; // add dot
-int readBuffer(char *buffer,int count)
-{
+ // Get the value of fraction part upto given no.
+ // of points after dot. The third parameter is needed
+ // to handle cases like 233.007
+ float fp=10;
+ fpart =fpart * pow(fp,afterpoint);
+
+ intToStr((int)fpart, res + i + 1, afterpoint);
+ }
+}
+
+void FlushGSM(void) {
+ char1 = 0;
+ while (GSM.readable()){
+ char1 = GSM.getc();
+ }
+ return;
+}
+
+void callback(){
+ // Note: you need to actually read from the serial to clear the RX interrupt
+ pc.printf("%c\n", GSM.getc());
+}
+
+// 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();
+ t.start(); // start timer
while(1) {
while (GSM.readable()) {
char c = GSM.getc();
@@ -81,241 +166,436 @@
buffer[i++] = c;
if(i > count)break;
}
- if(i > count)break; // ojooo
+ if(i > count)break;
if(t.read() > 3) {
t.stop();
t.reset();
break;
}
}
-
wait(0.5);
- while(GSM.readable()) {
+ 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;
}
-//Programas a ejecutar
+// 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;
+}
+
+// Esta funcion de abajo inicaliza el módem. 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 expresión lógica.
+int init(){
+ if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3)){
+ return -1;
+ }
+ if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 3)){
+ return -1;
+ }
+ if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 3)){
+ return -1;
+ }
+ if (0 != sendCmdAndWaitForResp("AT+CBST=7,0,1\r\n", "OK", 3)){ //velocidad fija a 9600, modem asincronico no transparente
+ return -1;
+ }
+ if (0 != sendCmdAndWaitForResp("ATE\r\n", "OK", 3)){ //se le quita el eco al modem GSM
+ return -1;
+ }
+ LedVerde=0;
+ 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 expresión lógica.
+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 función 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;
+}
+
+// Esta función devuelve la confirmacion del mensaje a quien lo envio.
+int recibe_ok(){
+ GSM.printf("AT+CMGS=27\n\r");
+ pc.printf("AT+CMGS=27\n\r");
+ wait_ms(100);
+ GSM.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF",tel);
+ pc.printf("0011000A91%s0000AA10CDB27B1E569741F2F2382D4E93DF",tel);
+ wait_ms(100);
+ GSM.putc((char)0x1A);
+ return 0;
+}
+
+// Programas a ejecutar.
+int main(){
+ //configuramos los puertos seriales
+ 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
+ LedVerde = 1; // APAGO LOS LEDS
+ LedRojo = 1;
+ LedAzul = 1;
+ LedRojo = 0; // PRENDO EL LED ROJO
+ // Quito el eco del modem
-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);
+ // CONFIGURACIÓN DEL MODEM GSM (TELEFONO CELULAR SIEMENS A56i).
+ inicio1:
+ ret = init();
+ if(ret==0){
+ LedRojo = 1;
+ LedVerde = 0; // Apagar LED Verde para confirmar la comunicación con el módem.
+ pc.printf("Modem configurado\n");
+ }
+ else{
+ wait(1);
+ goto inicio1;
+ }
+
+ while(1){
+ if (GSM.readable()){
+ readBuffer(buffer,110);
+ pc.printf("%s\r\n",buffer);
+ for(i=0; i<5; i++){
+ resp[i] = buffer[i];
+ }
+
+ pc.printf("%s\r\n", resp);
+ if(strcmp("$$+CM", resp) == 0){ //COMPARA resp con "+CMTI"
+ pc.printf("Llego MSG\r\n");
+ cleanBuffer(buffer,10);
+ GSM.printf("AT+CMGL=0\r\n"); // Envío comando para leer mensaje
+ pc.printf("AT+CMGL=0\r\n");
+ //GSM.printf("AT+CMGD=0\r\n"); // Envío comando para borrar el mensaje.
+ readBuffer(buffer,110);
+ pc.printf("%s\r\n",buffer);
- 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]);
+ // Lectura el teléfono emisor
+ for(i=0; i<10; i++){
+ tel[i] = buffer[i+40];
+ }
+ pc.printf("Telefono: %c%c%c%c%c%c%c%c%c%c\r\n", tel[1], tel[0], tel[3], tel[2], tel[5], tel[4], tel[7], tel[6], tel[9], tel[8]);
+
+ // Lectura del tamaño
+ for(i=0;i<2;i++){
+ tam[i] = buffer[i + 68];
+ }
+ pc.printf("%s-\r\n", tam);
+
+ // Lectura del mensaje
+ for(i=0;i<26;i++){
+ msg[i] = buffer[i+70]; // Lee un mensaje de 26 caracteres máximo desde la posición 70 del buffer.
+ }
+ pc.printf("%s-\r\n", msg);
+
+ // Decodificación del mensaje
+
+ // Comparar el mensaje
+ deleteSMS(1); // Se borran los mensajes por medio de una función
+ readBuffer(buffer, 200);
+ // COMPARA resp con "E3F75B4E2EBBC3E4F01C" que es "coordenadas", o "C3F75B4E2EBBC3E4F01C" que es "Coordenadas".
+ if((strncmp("E3F75B4E2EBBC3E4F01C", msg, 20) == 0) || (strncmp("C3F75B4E2EBBC3E4F01C", msg, 20) == 0)){
+ //recibe_ok();
+ LedVerde = 1; // Encender LED azul.
+ LedAzul = 0;
+ wait(2);
+
+ if(gps.sample()){
+ lo = gps.longitude;
+ la = gps.latitude;
+ pc.printf("\nLongitud entera = %f, Latitud entera = %f\n", lo, la);
+ //wait(0.5);
+
+ //LONGITUD
+ sprintf (clo, "%f", lo);
+ pc.printf ("\nLongitud = %s\n",clo);
+ //wait(0.5);
+
+ // LATITUD
+ sprintf (cla, "%f", la);
+ pc.printf ( "\nLatitud = %s\n",cla);
+ //wait(0.5);
+
+ // Concatenando las cadenas de Latitud y Longitud
+ strcpy(la_lo,cla);
+ strcat(la_lo,",");
+ strcat(la_lo,clo);
+ pc.printf("\nLatitud, Longitud: %s\n",la_lo);
- if (K==0) {K=8;C++;}
- K--;
+ //Ahora se juntan las cadenas obtenidas y se agrega el protocolo de transferencia de hipertextos http
+ strcpy(DE1,http);
+ strcat(DE1,la_lo);
+ pc.printf("\nDireccion: %s\n",DE1);
+ pc.printf("\n");
+ LENIN1 = strlen(DE1);
+
+ //Conversión a octetos.
+ K = 0;
+ C = 0;
+ for (i = 0; i < LENIN1; i++){
+ DS1[i] = DE1[i + C] >> K | DE1[i + C + 1] << (7 - K);
+ if(DS1[i] == 0x00) {LENOUT1 = i; goto salir1;}
+ K++;
+ if (K == 7) {K = 0; C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
+ }
+
+ salir1:
+ for (i = 0; i < LENIN1; i++){
+ pc.printf("%X", DE1[i]);
+ }
+
+ pc.printf(":\r\n");
+ for (i = 0; i < LENOUT1; i++){
+ pc.printf("%2X", DS1[i]&0x000000FF);
+ }
+ pc.printf("\r\nLENOUT GPS: %d, LENIN GPS: %2X\r\n", LENOUT1, LENIN1);
+
+ // Concatenación del mensaje en formato PDU y envío del mismo.
+ ind = 14 + LENOUT1 - 1;
+
+ GSM.printf("AT+CMGS=%d\r\n",ind);
+ pc.printf("AT+CMGS=%d\r\n",ind);
+ pc.printf(relle1);
+ GSM.printf(relle1);
+
+ for (i=0 ;i<=9; i++) {
+ pc.printf("%c",tel[i]);
+ GSM.printf("%c",tel[i]);
+ }
+
+ pc.printf(relle2);
+ GSM.printf(relle2);
+ pc.printf("%2X", LENIN1);
+ GSM.printf("%2X", LENIN1);
+
+ for (i = 0; i < LENOUT1; i++){
+ pc.printf("%02X", DS1[i]&0x000000FF);
+ GSM.printf("%02X", DS1[i]&0x000000FF);
+ }
+ wait(1);
+ GSM.putc((char)0x1A); // Ctrl - Z.
+ GSM.scanf("%s",buf); // Estado del mensaje (Envió o Error).
+ pc.printf(">%s\n",buf);
+ pc.printf("\n");
}
- for (i=0 ;i<=9;i++)
- {
- Tel[i] = buffermsg[40+i];
- }
-//Lectura del número de teléfono
+ wait(2);
+ LedAzul = 1;
+ LedVerde = 0;
+ GSM.printf("AT+CMGD=0\r\n"); // Borra el mensaje actual (Posición "0").
+ //pc.printf("\n%s\n\n", "Borro mensaje");
+ }
+
+ // COMPARA resp con "F6379B1E569701" que es "voltaje", o "F6379B1E569701" que es "Voltaje".
+ if((strncmp("F6379B1E569701", msg, 14) == 0) || (strncmp("D6379B1E569701", msg, 14) == 0)){
+ //recibe_ok();
+ LedRojo = 0; // Encender LED amarillo.
+ LedVerde = 0;
+ LedAzul = 1;
+ wait(2);
+
+ med = v.read()*3.3;
+ medi = v.read();
+ pc.printf("\n%f\n", medi);
+
+ cleanBuffer(outmed, 16);
+ if (med < 1){ // Se convierte la Medida a caracter.
+ strcat(outmed, "0");
+ ftoa(med, outmedn, 5);
+ strcat(outmed, outmedn);
+ }
+ else{
+ ftoa(med, outmed, 5);
+ }
+ strcpy(DE2,"Voltaje: ");
+ strcat(DE2,outmed);
+ pc.printf("\n%s\n\n", DE2);
+ LENIN2 = strlen(DE2);
+
+ //Conversión a octetos.
+ K = 0;
+ C = 0;
+ for (i = 0; i < LENIN2; i++){
+ DS2[i] = DE2[i + C] >> K | DE2[i + C + 1] << (7 - K);
+ if(DS2[i] == 0x00) {LENOUT2 = i; goto salir2;}
+ K++;
+ if (K == 7) {K = 0; C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
+ }
+
+ salir2:
+ for (i = 0; i < LENIN2; i++){
+ pc.printf("%X", DE2[i]);
+ }
+
+ pc.printf(":\r\n");
+ for (i = 0; i < LENOUT2; i++){
+ pc.printf("%2X", DS2[i]&0x000000FF);
+ }
+ pc.printf("\r\nLENOUT VOLTAJE: %d, LENIN VOLTAJE: %2X\r\n", LENOUT2, LENIN2);
+
+ // Concatenación del mensaje en formato PDU y envío del mismo.
+ ind = 14 + LENOUT2 - 1;
+
+ GSM.printf("AT+CMGS=%d\r\n",ind);
+ pc.printf("AT+CMGS=%d\r\n",ind);
+ pc.printf(relle1);
+ GSM.printf(relle1);
+
+ for (i=0; i <= 9; i++) {
+ pc.printf("%c",tel[i]);
+ GSM.printf("%c",tel[i]);
+ }
+
+ pc.printf(relle2);
+ GSM.printf(relle2);
+ pc.printf("%2X", LENIN2);
+ GSM.printf("%2X", LENIN2);
+ /*pc.printf("0F");
+ GSM.printf("0F");*/
+
+ for (i = 0; i < LENOUT2; i++){
+ pc.printf("%02X", DS2[i]&0x000000FF);
+ GSM.printf("%02X", DS2[i]&0x000000FF);
+ }
+
+ wait(1);
+ GSM.putc((char)0x1A); // Ctrl - Z
+ GSM.scanf("%s",buf); // Estado del mensaje (Envió o Error).
+ pc.printf(">%s\n\n",buf);
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;
- }
- }
-}
+ wait(2);
+ LedRojo=1;
+ LedVerde=0;
+ GSM.printf("AT+CMGD=0\r\n"); // Borra el mensaje actual (Posición "0").
+ //pc.printf("\n%s\n\n", "Borro mensaje");
+ }
+ }
+ }
+ }
}
\ No newline at end of file