Programa para establecer la comunicación con un módem Siemens A56 y un modulo FRDMKL25Z opera como rastreador satelital para Geolocalizacion. Por la UART (1) se conecta el MODEM y por la uart (2) el GPS (se lee en modo NEMEA) Este sistema genera una cadena de geolocalizacion para GoogleMaps con las coordenadas locales Si previamente se envia el mensaje (Coordenadas o coordenadas) El sistema ademas recibe ordenes de tipo mensaje GSM PDU para accionar cargas

Dependencies:   mbed GPS_G

Conexion propuesta de celular siemens A56i y La FRDMKL25Z /media/uploads/tony63/imgb.jpg Se puede emular un GPS usando una aplicación de Proteus /media/uploads/tony63/imgc.jpg

Revision:
0:b2a6aa7c0c8c
Child:
1:e2bd083802c0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jun 19 17:45:34 2015 +0000
@@ -0,0 +1,375 @@
+//programa para celular siemens que recibe un mensaje de texto t activa una salida en formato
+//pdu hex
+#include "mbed.h"
+#include "DebouncedIn.h"
+#include "stdio.h"
+#include "string.h"
+#include "GPS.h"
+
+
+
+
+Timer t;
+DigitalOut LedVerde(LED2);
+DigitalOut LedRojo(LED1);
+DigitalOut LedAzul(LED3);
+
+///////////////////////////////////////////
+ 
+Serial GSM(PTE0,PTE1);  //puertos del FRDM para el modem
+Serial pc(USBTX,USBRX);
+GPS gps(PTE22, PTE23);   // Puerto del FDRM para el gps 
+
+////////////////////////////
+//PARAMETROS
+////////////////////////////////
+
+
+short DE[255];
+short DS[255];
+
+char buffer[512];
+char buffermsg[100];
+char buffer1[13];
+char mensaje[100];
+int count;
+int i,K,LENOUT,LENIN,C;
+
+char Tel[15];
+char cel[15];
+char ojala[15]; // OJO
+
+int c=0;
+int cont=0;
+unsigned char CtrlZ = 0x1A; 
+bool Flag = false; 
+char r[]=""; 
+char msg[256];
+char char1;
+
+int index;
+
+//////
+//longitud  y latitud 
+////
+
+
+float lo,la;
+char clo[255], cla[255];   //
+int LENINlo,LENINla,LENINla_lo;
+char la_lo[255];
+
+char http2[255];
+char http[] = "http://maps.google.com/maps?q=";
+
+
+
+//////////////
+// convercion oct sept 
+////////////
+
+
+int iht,Kht,ChtLENOUTht,LENINht;
+int ioct,Koct,LENOUToct,LENINoct,Coct;
+char DEoct[255];
+char DSoct[255];
+char buf[100];
+
+/////////////////////////
+//cocanteo rellenos y numero 
+//////////////////////////
+
+char relle1[]=  "0011000A91";
+char relle2[]=  "10000AA";
+char relle3[]=     "68";
+
+/////////////////////////////////////////////
+// funciones  
+////////////////////////////////////////////
+ 
+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;
+}
+
+///////////////////////////////////////////////
+//Programass
+///////////////////////////////////////////////
+    
+int main(void)
+       { 
+       
+       LedVerde=1;
+       LedRojo=1;
+       LedAzul=1;
+ 
+   
+       GSM.baud(9600);
+       GSM.format(8,Serial::None,1); 
+
+       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){ 
+          
+       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';
+                 
+                 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;
+                    }
+                  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];
+                    }   
+                    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';
+           
+           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);  
+            
+            /*  for (ilo=0;ilo<LENINlo;ilo++){
+                pc.printf("%c,",clo[ilo]);       
+            } */        
+            
+           wait(0.5);
+           //LATITUD/
+           sprintf (cla, "%f", la); 
+           pc.printf ( "\nlatitud = %s\n",cla);
+           LENINla=strlen(cla); 
+            
+           /*for (ila1=0;ila1<LENINla1;ila1++){
+                pc.printf("%c,",cla[ila1]);       
+           }*/
+
+          
+        ///////////////////////////////////////////////////            
+        // CONCATENO LONGITUD Y LATITUD
+        ///////////////////////////////////////////////////
+
+           strcpy(la_lo,cla);
+           strcat(la_lo,",");
+           strcat(la_lo,clo);
+               
+           pc.printf ( "\nla_lo: %s\n",la_lo);
+           
+           LENINla_lo=strlen(la_lo);
+
+           /*for (j=0;j<LENINla_lo;j++){
+                pc.printf("%c\n",la_lo[j]);       
+           }*/    
+           
+         ////////////////////////////////////////////////////////      
+        // CONCATENO LONGITUD, LATITUD Y EL http//:
+        ////////////////////////////////////////////////////////
+            strcpy(http2,http);
+            strcat(http2,la_lo);         
+            pc.printf ( "%s\n",http2);
+            pc.printf ( "\n" );
+           
+           
+        //////////////////////////////////////////////////////////////////////
+        // convierto http2 de oct a sep
+        ////////////////////////////////////////////////////////////////////////       
+       
+        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);
+                        }
+                  }
+       //             pc.printf("LENOUT:%d,LENIN:%d\r\n",LENOUToct,strlen(DEoct));
+                  
+                  //}
+                 Koct++;
+                if (Koct==7)
+                {
+                Koct=0;Coct++;
+                } // se chequea que ya se acabaron los bits en un ciclo de conversion.
+         }  
+        
+        /////////////////////////////////////////////////////////
+        // CONCATENO LOS RELLENOS Y EL NUMERO DEL 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");
+          
+           }  // if 
+            
+            
+    
+        }
+
+        if(DS[0]-79==0 && DS[1]-102==0)     // Off en octetos es 4F6666
+        {
+               LedAzul=1; //apaga con Lgeverde
+               LedVerde = 0;
+               LedRojo=1;
+        }   
+        
+        if(DS[0]-71==0 && DS[1]-110==0)  // On en octetos es 476E
+        {
+               LedAzul=1;  //apaga con Lgeverde
+               LedRojo =0;
+               LedVerde = 1;
+        } 
+     }           
+}
+}