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

📄 gprs_smm.cpp

📁 利用该程序可以通过短信让远程GPRS模块上线
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -