?? gprs_sms.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 + -