📄 gprs_smm.cpp
字号:
if ((strcmp(smminfo.m_szLastPhone, szPNum))
|| smminfo.m_nLastPhoneTTL > ((1000 / TIMERINTERVAL) * 2))
{
cfd.m_cFrameHead = char(0x7B);
cfd.m_cProtoType = (char)PROTO_CALLFROMDTU;
cfd.m_cPackLen = htons((unsigned short)(sizeof(CALLFROMDTU)));
memcpy(cfd.m_szDTUNumber, szPNum, 11);
cfd.m_cFrameTail = (char)0x7B;
strcpy(smminfo.m_szLastPhone, szPNum);
smminfo.m_nLastPhoneTTL = 0;
return SendDataToDSC((char *)&cfd, sizeof(CALLFROMDTU));
//return MakeDTUOnLine_SM(szPNum);
}
}
return -1;
}
int Process_CMT()
{
int i,nr;
unsigned short nTotalLen;
int nResult = -1;
SM_RECEIVE *sr;
SM_RECEIVE_TODSC srt;
char temp[140];
nr = VerifySMCMT();
switch (nr)
{
case -1:
return MoveDataInBuf();
case -2:
smminfo.m_nBeginPosition++;
return -1;
default:
NULL;
//the following is to Process CMT;
}
if (nr <= 0)
{
smminfo.m_nBeginPosition++;
return -1;
}
sr = (SM_RECEIVE *)(smminfo.m_szBuf + GetNextEndCharPosition() + 2);
nTotalLen = CharToInt(sr->m_udl[0]) * 16 + CharToInt(sr->m_udl[1]);
for (i=0; i<nTotalLen; i++)
{
temp[i] = CharToInt(sr->m_ud[i*2])* 16 + CharToInt(sr->m_ud[i*2+1]);
}
srt = *((SM_RECEIVE_TODSC *)temp);
if (PROTO_SMDTUONLINE == srt.m_head.m_cProtoType)
ProcessPhoneNumber2(sr->m_oa + 6, srt.m_head.m_szDTUNumber);
nResult=SendDataToDSC((char *)&srt,nTotalLen);
smminfo.m_nBeginPosition += nr;
return nResult;
}
int ConfigSMM(char *SMSCNumber)
{
char Sn[32];
char szRdBuf[128];
DWORD dwRdCount, dwError;
COMSTAT cs;
//config smm not show at command
sprintf(Sn, "ATE0\r");
if (-1 == SendDataToSerialCom(Sn,strlen(Sn),0))
{
WriteLog("Error:ConfigSMM-Config ATE0",
strlen("Error:ConfigSMM-Config ATE0"));
return -1;
}
Sleep(1000);
if(1==gnModemType)
{
sprintf(Sn, "AT\r");
if (-1 == SendDataToSerialCom(Sn,strlen(Sn),0))
{
WriteLog("Error:ConfigSMM-Config ATE0",
strlen("Error:ConfigSMM-Config ATE0"));
return -1;
}
Sleep(1000);
}else{
//Config SMSC phone number
sprintf(Sn, "AT+CSCA=\"+86%s\"\r", SMSCNumber);
//ProcessPhoneNumber(SMSCNumber,Sn+11);
//Sn[23]=(char)0x0D;
if (-1 == SendDataToSerialCom(Sn, strlen(Sn), 0))
{
WriteLog("Error:ConfigSMM-Config SMSC Phone Number",
strlen("Error:ConfigSMM-Config SMSC Phone Number"));
return -1;
}
Sleep(1000);
}
//config pdu mode
sprintf(Sn, "AT+CMGF=0\r");
if (-1 == SendDataToSerialCom(Sn, strlen(Sn), 0))
{
WriteLog("Error:ConfigSMM-Config AT+CMGF=0",
strlen("Error:ConfigSMM-Config AT+CMGF=0"));
return -1;
}
Sleep(1000);
//config sm mode
sprintf(Sn, "AT+CNMI=2,2,0,0,0\r");
if (-1 == SendDataToSerialCom(Sn, strlen(Sn), 0))
{
WriteLog("Error:ConfigSMM-Config SM Mode",
strlen("Error:ConfigSMM-Config SM Mode"));
return -1;
}
Sleep(1000);
//config RING mode
sprintf(Sn, "AT+CLIP=1\r");
if (-1 == SendDataToSerialCom(Sn,strlen(Sn),0))
{
WriteLog("Error:ConfigSMM-Config RING Mode",
strlen("Error:ConfigSMM-Config RING Mode"));
return -1;
}
Sleep(1000);
if ((0 != ::ClearCommError(smminfo.m_hComm, &dwError, &cs)) && (cs.cbInQue > 0))
if (::ReadFile(smminfo.m_hComm,szRdBuf, cs.cbInQue, &dwRdCount, NULL) && (dwRdCount > 0))
if (5 == OKNumber(szRdBuf, dwRdCount, 0))
return 0;
return -1;
}
void WriteLog(char *szContent,int nContentLen)
{
//AfxMessageBox(szContent);
}
/*
* Initsmminfo
* initilaze the smminfo struct
*/
void Initsmminfo(void)
{
memset(smminfo.m_DSCIpAddr, 0x00, 16);
memset(smminfo.m_szBuf, 0x00, BUFFLEN);
memset(smminfo.m_szLastPhone, 0x00, 16);
smminfo.m_nLastPhoneTTL = 0;
smminfo.m_nBufLen = 0;
smminfo.m_hComm = NULL;
smminfo.m_hCommMutex = NULL;
smminfo.m_nBeginPosition = 0;
smminfo.m_nEndPosition = 0;
smminfo.m_nDSCSrvPort = 0;
smminfo.m_nRunState = 0;
smminfo.m_sock = NULL;
smminfo.m_unTimerId = 0;
smminfo.m_nWordMode= 0;
smminfo.m_nCanUse = 0;
smminfo.m_nOKNOCARRIERNumber = 0;
}
void ReadAndProcessData()
{
if (smminfo.m_nCanUse > 0)
{
smminfo.m_nCanUse--;
if (smminfo.m_nCanUse <= 0)
{
smminfo.m_nOKNOCARRIERNumber = 0;
smminfo.m_nCanUse = 0;
}
}
smminfo.m_nLastPhoneTTL = (smminfo.m_nLastPhoneTTL + 1) % 1000;
if (0 == smminfo.m_nRunState)
{
if (0 == ReadDataFromSerialCom())
{
smminfo.m_nRunState = 1;
ProcessDataFromSerialCom();
smminfo.m_nRunState = 0;
}
}
}
int ConfigSerialCom(char *SerialCom,DCB *dcb)
{
DCB adcb;
smminfo.m_hComm = ::CreateFile(SerialCom,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (INVALID_HANDLE_VALUE == smminfo.m_hComm)
{
WriteLog("can not open COM", strlen("can not open COM"));
return -1;
}
if (!::GetCommState(smminfo.m_hComm, &adcb))
{
CloseHandle(smminfo.m_hComm);
WriteLog("can not GetCommState com", strlen("can not GetCommState com"));
return -1;
}
adcb.BaudRate = dcb->BaudRate;
adcb.ByteSize = dcb->ByteSize;
adcb.DCBlength = sizeof(DCB);
adcb.fBinary = true;
adcb.Parity = dcb->Parity;
adcb.StopBits = dcb->StopBits;
if (!::SetCommState(smminfo.m_hComm, &adcb))
{
CloseHandle(smminfo.m_hComm);
WriteLog("can not SetCommState com", strlen("can not SetCommState com"));
return -1;
}
if (!::SetupComm(smminfo.m_hComm, 1024, 1024))
{
CloseHandle(smminfo.m_hComm);
WriteLog("can not SetupComm com", strlen("can not SetupComm com"));
return -1;
}
if (! ::PurgeComm(smminfo.m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT))
{
CloseHandle(smminfo.m_hComm);
WriteLog("can not SPurgeComm com", strlen("can not PurgeComm com"));
return -1;
}
return 0;
}
int ProcessPhoneNumber(char *src, char *dest)
{
int i;
for (i=0; i<5; i++)
{
*(dest + i * 2) = *(src + i * 2 + 1);
*(dest +i * 2 + 1) = *(src + i * 2 );
}
*(dest + 10) = 'F';
*(dest + 11) = *(src + 10);
return 0;
}
int ProcessPhoneNumber2(char *src, char *dest)
{
int i;
for (i=0; i<5; i++)
{
*(dest + i * 2) = *(src + i * 2 + 1);
*(dest + i * 2 + 1) = *(src + i * 2);
}
*(dest + 10) = *(src + 11);
return 0;
}
int SendSMToDTU(char *DTUNumber, char *szData, int nDataLen)
{
SM_SUBMIT sm;
char cdmaBuf[100];
int nTotalLen, nSMLen, i;
if ((smminfo.m_nOKNOCARRIERNumber > 0) || (nDataLen > 140))
return -1;
if(1==gnModemType)
{
strcpy(cdmaBuf, "AT+CMGF=1\r");
//sprintf(sm.m_AT_CMGS, "AT+CMGS=%s,%d\r",DTUNumber,nDataLen);
sprintf(&(cdmaBuf[10]), "AT+CMGS=%s\r",DTUNumber);
memcpy(&(cdmaBuf[30]),szData,nDataLen);
cdmaBuf[30+nDataLen] = 0x1A;
nTotalLen = 10+20+nDataLen+1;
memcpy(&(cdmaBuf[nTotalLen]),"AT+CMGF=0\r",10);
nTotalLen += 10;
smminfo.m_nOKNOCARRIERNumber=3;
return SendDataToSerialCom(cdmaBuf, nTotalLen, (1000 / TIMERINTERVAL) * WAITSMTODTU);//200 7
}else{
nSMLen = 15 + nDataLen;
//Send AT+CMGF=0
strcpy(sm.m_AT_CMGF, "AT+CMGF=0");
sm.m_AT_CMGF[9] = (char)0x0D;
//Send AT+CMGS=Length
strcpy(sm.m_AT_CMGS, "AT+CMGS=");
sm.m_AT_CMGS[8] = ((char)(nSMLen / 100)) + 0x30;
sm.m_AT_CMGS[9] = ((char)((nSMLen / 10 ) % 10)) + 0x30;
sm.m_AT_CMGS[10] = ((char)(nSMLen % 10 )) + 0x30;
sm.m_AT_CMGS[11] = char(0x0D);
//Send SM
//Example : 0011000D91683115006014F7000801081122334455667788
sm.m_zero[0] = '0';
sm.m_zero[1] = '0';
sm.m_type[0] = '1';
sm.m_type[1] = '1';
sm.m_mr[0] = '0';
sm.m_mr[1] = '0';
strcpy(sm.m_da, "0D9168");
ProcessPhoneNumber(DTUNumber, sm.m_da+6);
sm.m_pid[0] = '0';
sm.m_pid[1] = '0';
sm.m_dcs[0] = '0';
sm.m_dcs[1] = '8';
sm.m_vp[0] = '0';
sm.m_vp[1] = '1';
sprintf(sm.m_udl, "%02x", nDataLen);
for (i=0; i<nDataLen; i++)
sprintf(sm.m_ud + i * 2, "%02x",(*(szData + i)) & 0xFF);
//the last char is 0x1A(CTRL+Z)
sm.m_ud[nDataLen * 2] = 0x1A;
//10:at+cmgf=0 and 0x0D is 10
//+12:at+cmgs=XXX and 0x0D is 12
//nSMLen*2:because we use PDU mode, so we must *2;
//+3:head 00 is 2 and 0x1A is 1;
nTotalLen = 10 + 12 + nSMLen * 2 + 3;
smminfo.m_nOKNOCARRIERNumber=2;
return SendDataToSerialCom((char *)&sm, nTotalLen, (1000 / TIMERINTERVAL) * WAITSMTODTU);
}
//return SendDataToDSC((char *)&sm,nTotalLen);
}
int GetNextEndCharPosition()
{
int p;
p = smminfo.m_nBeginPosition;
while(1)
{
if ((p + 2) > smminfo.m_nEndPosition)
break;
if (((char)0x0D == smminfo.m_szBuf[p])
&& ((char)0x0A == smminfo.m_szBuf[p+1]))
return p;
p++;
}
return -1;
}
int CharToInt(char ch)
{
int i = -1;
if ((ch >= 'a') && (ch <= 'f'))
ch = ch - 'a' + 'A';
if ((ch >= 'A') && (ch <= 'F'))
i = (int)(ch - 0x37);
if ((ch >= '0') && (ch <= '9'))
i = (int)(ch - 0x30);
return i;
}
int GetHostName(char *dest,int len)
{
int nResult=-1,i;
char szLocalName[64];
//WSADATA wd;
//WORD dwVersion;
//dwVersion=MAKEWORD(1,1);
HOSTENT *he;
//if (::WSAStartup(dwVersion,&wd))
//{
// AfxMessageBox("up error");
if (SOCKET_ERROR == gethostname(szLocalName, 64))
{
WriteLog("gethostname error", strlen("gethostname error"));
return -1;
}
he = ::gethostbyname(szLocalName);
if (NULL != he)
{
dest[0] = '\0';
for (i=0; i<10; i++)
{
if (!he->h_addr_list[i])
break;
if ((10 == (unsigned char)he->h_addr_list[i][0])
||
(192 == (unsigned char)he->h_addr_list[i][0]))
continue;
sprintf(dest, "%u.%u.%u.%u",
he->h_addr_list[i][0] & 0xFF,
he->h_addr_list[i][1] & 0xFF,
he->h_addr_list[i][2] & 0xFF,
he->h_addr_list[i][3] & 0xFF);
}
if (strlen(dest) < 7)
sprintf(dest, "%u.%u.%u.%u",
he->h_addr_list[0][0] & 0xFF,
he->h_addr_list[0][1] & 0xFF,
he->h_addr_list[0][2] & 0xFF,
he->h_addr_list[0][3] & 0xFF);
nResult = 0;
}
//}
//::WSACleanup();
return nResult;
}
int MoveDataInBuf()
{
int i, j;
if (smminfo.m_nBeginPosition <= smminfo.m_nEndPosition)
{
for (i=smminfo.m_nBeginPosition, j=0; i<=smminfo.m_nEndPosition; i++,j++)
smminfo.m_szBuf[j] = smminfo.m_szBuf[smminfo.m_nBeginPosition+j];
smminfo.m_nEndPosition = smminfo.m_nBeginPosition=j;
}
return 5;
}
//CMT: ,23
int VerifySMCMT()
{
bool bFirst,bSecond;
int nTotalLen, nDataLen, p, nHeadLen;
SM_RECEIVE *sr;
p = smminfo.m_nBeginPosition;
bFirst=((char(0x0D) == smminfo.m_szBuf[p+8]) && (char(0x0A) == smminfo.m_szBuf[p+9]));
bSecond=((char(0x0D) == smminfo.m_szBuf[p+9]) && (char(0x0A) == smminfo.m_szBuf[p+10]));
if (
(bFirst && ((p + 68 - 1)>smminfo.m_nEndPosition))
|| (bSecond && ((p + 69 - 1)>smminfo.m_nEndPosition))
)
return -1; //the length is not enougt;
if ((',' == smminfo.m_szBuf[p+5])
&& (bFirst || bSecond))
{
if (bFirst)
{
nTotalLen = CharToInt(smminfo.m_szBuf[p+6]) * 10
+ CharToInt(smminfo.m_szBuf[p+7]);
nHeadLen = 10;
}
else //bSecond
{
nTotalLen = CharToInt(smminfo.m_szBuf[p+6]) * 100
+ CharToInt(smminfo.m_szBuf[p+7]) * 10
+ CharToInt(smminfo.m_szBuf[p+8]);
nHeadLen = 11;
}
if ((p + nTotalLen * 2 + nHeadLen - 1)>smminfo.m_nEndPosition)
return -1; //the length not enough
}
sr = (SM_RECEIVE *)(smminfo.m_szBuf + p + nHeadLen);
nDataLen = (CharToInt(sr->m_udl[0]) * 16) + CharToInt(sr->m_udl[1]);
if (
((nDataLen + 20) != nTotalLen)
|| ((char)0x37 != sr->m_ud[0])
|| ((char)0x42 != sr->m_ud[1])
|| ((char)0x37 != sr->m_ud[nDataLen*2-2])
|| ((char)0x42 != sr->m_ud[nDataLen*2-1])
)
{
return -2;
}
return (nTotalLen * 2 + 2 + nHeadLen);
}
int OKNumber(char * szData, int nDataLen, int type)
{
int nOKNumber = 0, i;
if (nDataLen < 2)
{
return 0;
}
for (i=0; i<nDataLen-1; i++)
{
if (('O' == szData[i]) && ('K' == szData[i+1]))
{
memset(szData + i, 0x00, 2);
nOKNumber++;
}
if ((1 == type) && ((i + 6) <= smminfo.m_nEndPosition))
{
if (('C' == szData[i]) && ('A' == szData[i+1])
&& ('R' == szData[i+2]) && ('R' == szData[i+3])
&& ('I' == szData[i+4]) && ('E' == szData[i+5])
&& ('R' == szData[i+6]))
{
memset(szData + i, 0x00, 7);
nOKNumber++;
}
}
}
return nOKNumber;
}
int ResetModem()
{
int nResult = -1;
char szResetModem[32];
char szRdBuf[128];
DWORD dwError, dwRdCount;
COMSTAT cs;
KillTimer(NULL, smminfo.m_unTimerId);
::PurgeComm(smminfo.m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
sprintf(szResetModem, "AT+CFUN=1\r");
nResult=SendDataToSerialCom(szResetModem, strlen(szResetModem),0);
if (-1 == nResult)
{
return nResult;
}
Sleep(2000); //wait for at+cfun=1 command is completly performed
/*
in order to reset,we must guarantee the following:
1.ClearCommError is right and cs.cbInbuf > 0;
2.ReadFile success and the length of data of reading from com bigger than 0;
3.the numbers of ok in data is bigger and equal 0;
4.ConfigSMM success;
5.SetTimer success;
*/
if (::ClearCommError(smminfo.m_hComm, &dwError, &cs) && (cs.cbInQue > 0))
if (::ReadFile(smminfo.m_hComm, szRdBuf, cs.cbInQue, &dwRdCount, NULL) && (dwRdCount > 0))
if (OKNumber(szRdBuf,dwRdCount,0)>0)
{
//Initsmminfo();
if (0 == ConfigSMM(smminfo.m_szSMSCNumber))
{
smminfo.m_nBeginPosition = smminfo.m_nEndPosition=0;
smminfo.m_nBufLen = 0;
smminfo.m_nCanUse = 0;
smminfo.m_nOKNOCARRIERNumber = 0;
smminfo.m_nLastPhoneTTL = 0;
smminfo.m_nRunState = 0;
smminfo.m_unTimerId = ::SetTimer(NULL, 1, TIMERINTERVAL, (TIMERPROC)ReadAndProcessData);
if (!smminfo.m_unTimerId)
{
return 0;
}
}
}
WriteLog("Modem reset failed", strlen("Modem reset failed"));
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -