⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprs_sms.cpp

📁 通过GPRS的PPP拔号程序,本程序在x86下通过测试
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include "gprs_sms.h"
#include "etr232i.h"
#include "etr_ppp.h"

#define  retries       3        //# A counter for the number of retries

int   ConvertUDStr( char* InStr, char* OutStr );
void  ConvertPhoneNumber( char* InStr, char* OutStr );
int   GetRcvMSG( char* Str );
void  ToPhoneNumber( char* InStr, char* OutStr );
void  ToTime( char* InStr, char* OutStr );
int   Bit8ToStr( char* InStr, char* OutStr );
int   Bit16ToStr( char* InStr, char* OutStr );
int   GetMSGList( struct RcvSMSInfo* Info );

unsigned char str1[20], str2[200], str[200];

int SEND( char* cmdstr )
{
   int i;
   i = SendATCmdString( cmdstr );
   return i;
}

char ReturnStr[2560];
//return 0:  OK
  //     -1: fail
int CHECK( int time, char* ResultStr )
{
   int  i, i1, len, len1;
   long j, NumOf10MS;
   char abyte;

   NumOf10MS = time * 100;

   for(i=0;i<2560;i++)    ReturnStr[i] = '\0';
   len1 = strlen( ResultStr );
   for(len=0, i=0; i<NumOf10MS; i++ )
      {
      NB_Delay( 10 );
      i1 = GetATCmdEcho( );
      if( i1 == -1 )  continue;
      abyte = (char)i1;
      if( abyte == '\r' )      ReturnStr[len] = 'r';
      else if( abyte == '\n' ) ReturnStr[len] = 'n';
      else                     ReturnStr[len] = abyte;
      len++;
      ReturnStr[len] = '\0';
      if( len < len1 ) continue;
      if( strncmpi( &ReturnStr[len-len1], ResultStr, len1 )==0 )  return 0;
      if( len >= 2560 ) break;
      }

   if( i >= NumOf10MS ) return ETIMEDOUT;
   return -1;
}

int StartSerMux( )
{
   int i;
   int num=retries;

_1:
    num--;
    if( num < 0)   return -1;

_2:
   SEND( "AT\\Q3\r" );			//set hardware flow control: RTS/CTS
   i = CHECK( 2, "OKrn" );
   if( i<0 )    goto _1;

_3:
   SEND( "AT+IPR=57600\r" );
   i = CHECK( 2, "OKrn");
   if( i<0 )    goto _1;

_4:
   SEND( "AT+CMUX=0\r" );
   i = CHECK( 2, "OKrn" );
   if( i==0 )
     {
     NB_Delay(2000);
     return 0;
     }
   goto _1;

}

int GPRS_Logon( )
{
   int i, n=0;
   int num=retries;

_1:
    num--;
    if( num < 0)   return -1;

_2:
   SEND( "ATE0\r" );  				//AT command echo off
   i = CHECK( 1, "OKrn" );
   if( i<0 )    goto _7;

_3:
   n++;
   SEND( "AT+CGATT?\r" );		       //check GPRS service states
   i = CHECK( 2, "1" );
   if( i==0 )          goto _5;
   if( n>=retries )    return -2;

_4:
   SEND( "AT+CGATT=1\r" );
   i = CHECK( 10, "OKrn" );
   if( i==0 )    goto _3;
   goto _2;

_5:
   SEND( "AT+CGDCONT=1,\"IP\",\"CMNET\"\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0)     goto _7;

_6:
   NB_Delay( 200 );
   SEND( "ATD*99***1#\r" );
   i = CHECK( 5, "CONNECT" );		// used to be = 10
   if( i==0 )   return 0;

_7:
   SEND( "+++\r" );
   i = CHECK( 1, "OKrn" );
   NB_Delay( 1000 );
   SEND( "ATH\r");       //  # Hang up
   i = CHECK( 1, "OKrn" );
   NB_Delay( 1000 );
   goto _1;
}

int SendSMS( char* Number, char* Content )
{
   int i, i1;
   int num=retries;

_1:
    num--;
    if( num < 0)   return -1;

_2:
   SEND( "ATE0\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )   goto _8;


_3:
   /*SEND( "ATI\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )   goto _8;*/

_4:

/*   SEND( "AT+CMGF=0\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )   goto _8;

_5:
   SEND( "AT+CSCA=?\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )   goto _8;

_6:
   ConvertPhoneNumber( Number,  str1);
   i1 = ConvertUDStr( Content, str2 );
   sprintf(str, "0001000B91%s0000%02x%s", str1, (unsigned int)i1, str2 );
   i1 = strlen( str )/2;
   sprintf( str2, "AT+CMGS=%d\r", i1 );
   SEND( str2 );
   i = CHECK( 2, ">" );
   if( i<0 )   goto _8;

_7:
   i = strlen(str);
   str[i] = 0x1A;		// Ctrl-Z
   str[i+1] = '\0';
   SEND( str );
   i = CHECK( 10, "OKrn" );
   if( i==0 )   return i;*/

   SEND( "AT+CMGF=1\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )   goto _8;

_5:
   SEND( "AT+CSCA?\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )   goto _8;

_6:
   sprintf( str,"AT+CMGS=%s\r", Number );
   SEND( str );
   i = CHECK( 2, ">" );
   if( i<0 )   goto _8;

_7:
   strcpy( str,Content);
   i = strlen(str);
   str[i] = 0x1A;		// Ctrl-Z
   str[i+1] = '\0';
   SEND( str );
   i = CHECK( 20, "OKrn" );
   if( i==0 )   return i;

_8:
   NB_Delay(1000);
   goto _1;
}

int ReceiveSMS( char* Content, int Index )
{
   int i, i1;
   int num=retries;

_1:
   num--;
   if( num < 0)   return -1;

_2:
   SEND( "ATE0\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )      goto _6;

_3:
   /*SEND( "ATI\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )     goto _6;*/

_4:
   SEND( "AT+CMGF=0\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )      goto _6;

_5:
   sprintf( str1, "AT+CMGR=%d\r", Index );
   SEND( str1 );
   i = CHECK( 20, "OKrn" );

   if( i==0 )
      {
      i = GetRcvMSG( Content );
      sprintf( str1, "AT+CMGD=%d\r", Index );
      SEND( str1 );
      i1 = CHECK( 5, "OKrn" );
      return i;
      }
_6:
   NB_Delay(1000);
   goto _1;
}

int CheckSMS( struct RcvSMSInfo* Info )
{
   int i, i1;
   int num=retries;

_1:
   num--;
   if( num < 0)   return -1;
   /*SEND( "AT+CBAUD?\r" );
   i = CHECK( 2, "OKrn" );
   if( i!=0 )
      {
      SEND( "AT+CBAUD=8\r" );
      i = CHECK( 2, "OKrn" );
      }*/

_2:
   SEND( "ATE0\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )      goto _6;

_3:
   /*SEND( "ATI\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )     goto _6;*/

_4:
   SEND( "AT+CMGF=0\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )      goto _6;

_5:
   SEND( "AT+CMGL=4\r" );
   i = CHECK( 30, "OKrn" );
   if( i==0 )
      {
      i1 = GetMSGList( Info );
      return i1;
      }
_6:
   NB_Delay(1000);
   goto _1;
}

int DelSMS( int Index )
{
   int i, i1;
   int num=retries;

_1:
   num--;
   if( num < 0)   return -1;
   /*SEND( "AT+CBAUD?\r" );
   i = CHECK( 2, "OKrn" );
   if( i!=0 )
      {
      SEND( "AT+CBAUD=8\r" );
      i = CHECK( 2, "OKrn" );
      }*/

_2:
   SEND( "ATE0\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )      goto _6;

_3:
   /*SEND( "ATI\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )     goto _6;*/

_4:
   SEND( "AT+CMGF=0\r" );
   i = CHECK( 2, "OKrn" );
   if( i<0 )      goto _6;

_5:
   sprintf( str1, "AT+CMGD=%d\r", Index );
   SEND( str1 );
   i = CHECK( 20, "OKrn" );

   if( i==0)     return i;
_6:
   NB_Delay(1000);
   goto _1;
}


int ConvertUDStr( char* InStr, char* OutStr )
{
   int i, m, n, l, k;
   unsigned char byte1, byte2;
   l = strlen(InStr);
   m = l/8;
   n = l%8;
   k = 0;
   for( l=0; l<m; l++ )
      {
      for( i=0; i<7; i++ )
	 {
	 byte1 = InStr[l*8+i]>>i;
	 byte2 = InStr[l*8+i+1]<<(7-i);
	 byte1 = byte1|byte2;
	 sprintf( &OutStr[k],"%02x", (unsigned int)byte1 );
	 k+=2;
	 }
      }
   for(i=0; i<n; i++ )
      {
      byte1 = InStr[m*8+i]>>i;
      if( i==n-1)  byte2 = 0;
      else         byte2 = InStr[m*8+i+1]<<(7-i);
      byte1 = byte1|byte2;
      sprintf( &OutStr[k],"%02x", (unsigned int)byte1 );
      k+=2;
      }
   OutStr[k] = '\0';

   return strlen(InStr);
}

void ConvertPhoneNumber( char* InStr, char* OutStr )
{
   int i, i1, i2;
   i1 = strlen( InStr );
   i2 = i1%2;
   i1 = i1/2;
   for( i=0; i<i1; i++ )
      {
      OutStr[2*i] = InStr[2*i+1];
      OutStr[2*i+1] = InStr[2*i];
      }
   if( i2!=0 )
      {
      OutStr[2*i] = 'f';
      OutStr[2*i+1] = InStr[2*i];
      OutStr[2*i+2] = '\0';
      }
}

void ToPhoneNumber( char* InStr, char* OutStr )
{
   int i, i1, i2;
   i1 = strlen( InStr )/2;
   for( i=0; i<i1; i++ )
      {
      OutStr[2*i] = InStr[2*i+1];
      OutStr[2*i+1] = InStr[2*i];
      if( (OutStr[2*i+1] == 'f')||(OutStr[2*i+1] == 'F') )
	 {
	 OutStr[2*i+1] = '\0';
	 }
      }
}

void ToTime( char* InStr, char* OutStr )
{
   int i, i1, i2;
   i1 = strlen( InStr )/2;
   OutStr[0] = '2';
   OutStr[1] = '0';
   for( i=0, i2=2; i<i1; i++ )
      {
      OutStr[i2] = InStr[2*i+1];
      i2++;
      OutStr[i2] = InStr[2*i];
      i2++;
      if( i<i1-1 )
	 {
	 OutStr[i2] = '-';
	 i2++;
	 }
      }
   OutStr[i2] = '\0';
}

int GetRcvMSG( char* Str )
{
   int i, i1, i2, len;
   len = strlen(ReturnStr);
   for( i=4; i<len; i++ )
      {
      if( ReturnStr[i-1]=='n' )
	 {
	 strncpy( str, &ReturnStr[i], 2 );
	 sscanf( str, "%2x", &i1 );
	 i += 2*(i1+1);
	 i+=2;
	 strncpy( str, &ReturnStr[i], 2 );
	 sscanf( str, "%2x", &i1 );
	 if( (i1%2)!=0 )  i1++;
	 i+=4;
	 strncpy( str, &ReturnStr[i], i1 );
	 i += i1;
	 break;
	 }
      }
   ToPhoneNumber( str, str1 );
   i+=2;
   strncpy( str, &ReturnStr[i], 2 );
   sscanf( str, "%2x", &i1 );
   i+=2;
   strncpy( str, &ReturnStr[i], 14 );
   str[14] = '\0';
   ToTime( str, str2 );
   i+=16;
   for(i2=0;;i++)
      {
      str[i2] = ReturnStr[i];
      i2++;
      str[i2] = '\0';
      if( strncmpi( &ReturnStr[i+1], "rn", 2 )==0 )    break;
      }
   if( i1==0)    i2 = Bit8ToStr( str, Str );
   else          i2 = Bit16ToStr( str, Str );
   strcpy( str, Str );
   sprintf( Str, "%s From:%s Time:%s", str, str1, str2 );
   return i2;
}

int Bit8ToStr( char* InStr, char* OutStr )
{
   int i, i1, m, n, l;
   unsigned char byte1, byte2;
   char Str[200];
   l = strlen( InStr )/2;
   strcpy( Str, InStr );
   for( i=0,i1=0; i<l; i++ )
      {
      strncpy( OutStr, &Str[i1], 2 );
      OutStr[2] = '\0';
      //str[i] = atoi( str1 );
      sscanf( OutStr, "%2x", &str[i] );
      i1 +=2;
      }
   str[i] = '\0';
   m = strlen(str)/7;
   //n = strlen(str)%7;
   n = l-m*7;
   for(i=0; i<m; i++)
      {
      for(i1=0; i1<8; i1++ )
	 {
	 if( i1==0 )
	    OutStr[i*8+i1] = str[i*7+i1]&0x7f;
	 else if( i1==7 )
	    OutStr[i*8+i1] = (str[i*7+i1-1]>>1)&0x7f;
	 else
	    {
	    byte1 = str[i*7+i1]<<i1;
	    byte2 = str[i*7+i1-1]>>(8-i1);
	    OutStr[i*8+i1] = (byte1|byte2)&0x7f;
	    }
	 }
      }
   for( i1=0; i1<n; i1++ )
      {
      if( i1==0 )
	 OutStr[i*8+i1] = str[i*7+i1]&0x7f;
      else
	 {
	 byte1 = str[i*7+i1]<<i1;
	 byte2 = str[i*7+i1-1]>>(8-i1);
	 OutStr[i*8+i1] = (byte1|byte2)&0x7f;
	 }
      }
   OutStr[i*8+i1] = '\0';

   return strlen(OutStr);
}

int Bit16ToStr( char* InStr, char* OutStr )
{
   int i, i1, len;
   unsigned int ii;
   char ts[4];
   len = strlen( InStr );
   for( i=0, i1=0; i<len-4; )
      {
      if( (InStr[i]=='0')&&(InStr[i+1]=='0') )
	 {
	 strncpy( ts, &InStr[i+2], 2 );
	 ts[2] = '\0';
	 sscanf( ts, "%2x", &ii );
	 ii = ii&0x00ff;
	 OutStr[i1] = (char)ii;
	 i1++;
	 }
      else  break;
      i += 4;
      }
   OutStr[i1] = '\0';
   return strlen(OutStr);
}


int GetMSGList( struct RcvSMSInfo* Info )
{
   int i, i1, i2, len, State;
   len = strlen(ReturnStr);
   for( i=0, i1=0, State=0; i<len-7; i++ )
      {
      if( State==0 )
	 {
	 if( strncmpi( &ReturnStr[i], "+CMGL: ", 7 )==0 )
	    {
	    strncpy( str, &ReturnStr[i+7], 3 );
	    str[3] = '\0';
	    Info[i1].Index = atoi( str );
	    State = 1;
	    }
	 }
      if( State==1 )
	 {
	 if( strncmpi( &ReturnStr[i], "rn", 2 )==0 )
	    {
	    i +=2;
	    strncpy( str, &ReturnStr[i], 2 );
	    sscanf( str, "%2x", &i2 );
	    i += 2*(i2+2);
	    strncpy( str, &ReturnStr[i], 2 );
	    sscanf( str, "%2x", &i2 );
	    if( (i2%2)!=0 )  i2++;
	    i+=4;
	    strncpy( str, &ReturnStr[i], i2 );
	    i += i2;
	    ToPhoneNumber( str, Info[i1].From );
	    i1++;
	    State = 0;
	    }
	 }
      }
   return i1;
}

int GPRSPowerOff( )
{
   int i;
   i = SEND( "AT^SMSO\r" );
   i = CHECK( 2, "OKrn" );
   return i;
}

int SelectSMSSrv( )
{
   int i;

   SEND( "AT+CGSMS=3\r" );
   i = CHECK( 2, "OKrn" );

   return  i;
}

int  EnableIGT( )
{
    GPRS_AUX( 0 );
    GPRS_STB( 1 );
    return 0;
}

int  DisableIGT( )
{
    GPRS_STB( 0 );
    return 0;
}

int GPRSPowerIsOn( )
{
   unsigned char status;

  // check GPRS module power state

  status = GPRS_PWR( );
  return status;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -