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

📄 mobmsgdlg.cpp

📁 一个完整的短讯网关示例,支持短讯收发,支持UDP及Text格式.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	memcpy(RequestIcCardNo,MsgInfo + 1,11);//设定IC卡号码固定长度为11位

	memset(sSendToReceiveMsg,0,8192);//提取要显示的内容
	memcpy(sSendToReceiveMsg,MsgInfo + 1 + 11 + 1,strlen(MsgInfo)-1 - 11 - 1);

	memset(sendMsg,32,100);
	pMsg = sendMsg;
	memcpy(pMsg, "^^021", 5);///查询卡号
	pMsg += 5;
	memcpy(pMsg, MobilChannel, 3);
	pMsg += 3;
	
	memcpy(pMsg, MsgMobNo, 20);
	pMsg += 20;

	memcpy(pMsg, RequestIcCardNo, 20);
	pMsg += 20;
	
	sendMsg[98] = '*';
	sendMsg[99] = '*';

	if (SendOrGetMsgFromServer())
	{
		sockClt = socket(AF_INET,SOCK_STREAM,0);
		if (sockClt == INVALID_SOCKET)
		{
			SendSystemInfo("与点播服务器连接失败!",0);
			return ;
		}
		CString sTmpInfo = "";
		host = gethostbyname(ServerIP);
		addrSrv.sin_family = AF_INET;
		addrSrv.sin_port = htons(iServerPort);
		addrSrv.sin_addr = *(struct in_addr*)host->h_addr;
		nRtn = connect(sockClt,(struct sockaddr*)&addrSrv,sizeof(struct sockaddr));
		if (nRtn != 0)
		{
			SendSystemInfo("与点播服务器连接失败!",0);
			return ;
		}	
		memset(sendMsg,32,100);
		pMsg = sendMsg;
		memcpy(pMsg, "^^201", 5);
		pMsg += 5;
		memcpy(pMsg, MobilChannel, 3);
		pMsg += 3;
		
		memcpy(pMsg, MsgMobNo, 20);
		pMsg += 20;
		
		memcpy(pMsg, RequestIcCardNo, 20);
		pMsg += 20;

		sendMsg[98] = '*';
		sendMsg[99] = '*';
		//SendOrGetMsgFromServer();	
		
		nRtn = send(sockClt,sendMsg,sizeof(sendMsg),0);
		if (nRtn == SOCKET_ERROR)
		{
			SendSystemInfo("与点播服务器连接失败!",0);
			return ;
		}
		
		pMsg = sSendToReceiveMsg ;
		memcpy(pMsg, sSendToReceiveMsg, strlen(sSendToReceiveMsg));
		pMsg += strlen(sSendToReceiveMsg);
		//SendOrGetMsgFromServer();
		nRtn = send(sockClt,sSendToReceiveMsg,sizeof(sSendToReceiveMsg),0);
		if (nRtn == SOCKET_ERROR)
		{
			SendSystemInfo("与点播服务器连接失败!",0);
			return ;
		}
		nRtn = recv(sockClt,sMsgRtn,sizeof(sMsgRtn),0);
		if (nRtn == SOCKET_ERROR)
		{
			SendSystemInfo("与点播服务器连接失败!",0);
			return ;
		}
		if (memcmp(sMsgRtn, "^^151", 5) == 0) //显示短信成功
			SendMsgInfo(StrSmsCenterCode,MsgMobNo,"机顶盒显示信息提交成功!");
		if (memcmp(sMsgRtn, "^^152", 5) == 0) //显示短信失败
			SendMsgInfo(StrSmsCenterCode,MsgMobNo,"机顶盒显示信息提交失败!");
	}
}
//------------------------------------------------

DWORD WINAPI tTryConnectMob(LPVOID lpParam )
{
	SendSystemInfo("tTryConnectMob",3) ;
	int iTryConnCount = 0 ;
	char Miinstruction[1000];
	if (Lst->GetCount()>50)
	{
		while (Lst->GetCount()>0)
				Lst->DeleteString(0);
    }
	while(iTryConnFlag == 0)
	{
		Sleep(2000);
		memset(Miinstruction,0,1000);///尝试取出手机供应商信息 西门子
		memcpy(Miinstruction,"at+cgmi\r",9);
		boolTmp =WriteFile(Mobile, Miinstruction, 9 , &num, NULL);
		if (boolTmp == 0)
		{
			iTryConnCount ++;
			continue;
		}
		Sleep(1000);
		CString MobilePriver =ReceiveMobileModelPrevie();
		if (MobilePriver.GetLength()<=0)
		{
			iTryConnCount ++;
			if (iTryConnCount>3)
			{
				SendSystemInfo("手机连接失败!",0);
				continue;
			}
		}
	}
	return 1;
}
//-----------------------------------读取手机信息
DWORD WINAPI tReadMobileInfo(LPVOID lpParam )
{
	char buf[8192],*pSender,StructionString[1024],TmpSmsCenter[8192];	
	int flag = 0;
    static char *SmsType = 0;
	if (Lst->GetCount()>50)
	{
		while (Lst->GetCount()>0)
				Lst->DeleteString(0);
    }
	while(iThreadFlag == 0)
	{
		//WaitForSingleObject((HANDLE)lpParam, INFINITE);
		//ResetEvent((HANDLE)lpParam);
		//以下代码进行整理读串口信息的指令,并进行串口操作 函数:WriteFile
		int iSmsPosIndex = 0 ;
		try 
		{
			::Sleep(800);
			if (iThreadFlag == 1)
				continue;
			if (SmsType == "0")
			  SmsType = "1";
			else
			  SmsType = "0";
			memset(Recinstruction,0,1024);
			memcpy(Recinstruction,"at+cmgl=",8);
			memcpy(Recinstruction+strlen(Recinstruction),SmsType,1);

			memset(StructionString,0,1024);
			memcpy(StructionString,Recinstruction,strlen(Recinstruction));

			memcpy(Recinstruction+strlen(Recinstruction),"\r",2);
			::Sleep(500);
			boolTmp = WriteFile(Mobile, Recinstruction, strlen(Recinstruction), &num, NULL);
			if (boolTmp == 0)
			{
				SendSystemInfo("手机连接失败!",0);
				continue;
			}

			//////////////////////////从手机中接收短讯 函数:ReceiveFromMobile
			::Sleep(1000);
			CString sTmp = ReceiveFromMobile();
			if (sTmp.GetLength()>0)
			{
				memset(buf,0,8192);
				memcpy(buf,(LPCTSTR)sTmp,strlen(sTmp));
			}
			else
				continue;

			memset(TmpSmsCenter,0,8192);
			memcpy(TmpSmsCenter,buf,strlen(buf));//将所接收到的短信内容符到一变量里面以待后面分析
			int iMsglenght =strlen(TmpSmsCenter);
			if (iMsglenght<=0)
			{
				SendSystemInfo("手机连接失败!",0);
				continue;
			}
			///@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@以下开始进行短讯内容分析
			//*************************************短讯信说明如下:******************************/*
			/*****一般所取出的短讯格式如下所示:
			0x00c3db98 "at+cmgl=1	+CMGL: 3,1,,42
			0891683108705505F0240D91683196619924F60008405011813195001600300031003900300030003000300030003000300033
			+CMGL: 4,1,,32
			0891683108705505F0240D91683196619924F60008405011811303000C76844E004E2A4EBA6C114E3B
			OK
			程序中共进行三次分析:
			1、将at+cmgl=1截取掉;
			2、还原成 "CMGL: 3,1,,42
				0891683108705505F0240D91683196619924F60008405011813195001600300031003900300030003000300030003000300033
				+CMGL: 4,1,,32
				0891683108705505F0240D91683196619924F60008405011811303000C76844E004E2A4EBA6C114E3B"格式;
			3、进行逐条分析,分析格式为:0891683108705505F0240D91683196619924F60008405011811303000C76844E004E2A4EBA6C114E3B
			//************************************************************************************/
			

			///////////////////////开始第一次分析
			//StructionString 为写入串口的指令  如:at+cmgl=1
			//TmpSmsCenter最初从串口中读出来的短讯信息
			pdest = strstr( TmpSmsCenter, StructionString);//取得左边部分字符串
			iMsglenght = pdest - TmpSmsCenter + 1; //取得如下面所示:

			char ctempsmscenterstring[8192];
			memset(ctempsmscenterstring,0,8192);
			memcpy(ctempsmscenterstring,TmpSmsCenter + iMsglenght+strlen(StructionString),
				strlen(TmpSmsCenter) - iMsglenght - strlen(StructionString));//截取掉了StructionString中的字符
			
			memset(TmpSmsCenter,0,8192);
			memcpy(TmpSmsCenter,ctempsmscenterstring,strlen(ctempsmscenterstring));//还原到TmpSmsCenter
			
			//@@@@@@@@@@@@@第二步分析
			//找出此信息中有没存在字符"CMGL:",如果存在的话则说明此短信息有效,否则为不合理短信息	
			pdest = strstr( TmpSmsCenter, "CMGL:" );
			int itmpisFound = pdest - TmpSmsCenter ;
			while (itmpisFound>0 )//开始逐条分析
			{
				char SmsCenter[8192],cLoopSMSMsg[8192];//cLoopSMSMsg变量为短信息字符串在循环体中剩余串
				memset(cLoopSMSMsg,0,8192);
				memset(TmpMsg,0,8192);
				int Len =0;

				pdest = strstr(TmpSmsCenter, "CMGL:");//取得左边部分字符串
				int nPos = pdest - TmpSmsCenter; //取得如下面所示:
				iSmsPosIndex =0;//记录当前所处理的短讯Index,以备处理后删除此条短信息
				
				memset(ctempsmscenterstring,0,8192);
				memcpy(ctempsmscenterstring,TmpSmsCenter + nPos + 5,strlen(TmpSmsCenter) - nPos - 5 + 1);

				memset(TmpSmsCenter,0,8192);
				memcpy(TmpSmsCenter,ctempsmscenterstring,strlen(ctempsmscenterstring));
				
				//截取出当前要分析的一条短信息,并将剩余部份保存到cLoopSMSMsg以待下一次循环使用
				pdest = strstr(TmpSmsCenter, "+CMGL:");
				nPos = pdest - TmpSmsCenter;
				if (nPos>=0)
				{
					memset(SmsCenter,0,8192);
					memcpy(SmsCenter,TmpSmsCenter,nPos);//得到当前一条短信息

					memset(cLoopSMSMsg,0,8192);
					memcpy(cLoopSMSMsg,TmpSmsCenter + nPos,strlen(TmpSmsCenter) - nPos);//得到剩余子串
				}
				else
				{
					memset(SmsCenter,0,8192);
					memcpy(SmsCenter,TmpSmsCenter,strlen(TmpSmsCenter));//得到当前一条短信息
				}
				memset(TmpSmsCenter,0,8192);
				memcpy(TmpSmsCenter,SmsCenter,strlen(SmsCenter));

				//开始第三步分析 在此步中首先要取出当前所分析短讯的序号
				pdest = strstr( TmpSmsCenter, "," );
				iSmsPosIndex = pdest - TmpSmsCenter + 1;
				char ctmp[8192];
				memset(ctmp,0,8192);
				memcpy(ctmp,TmpSmsCenter,iSmsPosIndex - 1); 
				iSmsPosIndex = atoi(ctmp);//取得当前短讯的序号 并格式化成int
				
				//如果当前短讯为最后一个的话则存在|||OK字样,则需将其过滤掉
				pdest = strstr( TmpSmsCenter, "\r\n\r\nOK" );
				nPos = pdest - TmpSmsCenter;
				if (nPos>0)//如果当前短讯是最后一条的话
				{
					memset(ctmp,0,8192);
					memcpy(ctmp,TmpSmsCenter,nPos);
					memset(TmpMsg,0,8192);
					memcpy(TmpMsg,ctmp,strlen(ctmp));
				}
				else
				{
					memset(TmpMsg,0,8192);
					memcpy(TmpMsg,TmpSmsCenter,strlen(TmpSmsCenter));	
				}

				/*分析当前一条短信息,首先截取取正确的短信内容出来//*/
				pdest = strstr( TmpMsg, "\r\n0891" );
				nPos = pdest - TmpMsg + 1;//取得子串开始位置

				memset(ctmp,0,8192);
				memcpy(ctmp,(LPCTSTR)TmpMsg + nPos + 1,strlen(TmpMsg) - nPos + 1);//nPos-1-2+1

				memset(SmsCenter,0,8192);
				memcpy(SmsCenter,ctmp,strlen(ctmp));


				str = strstr((LPCTSTR)SmsCenter, "089168");//截取短信内容后
				if (str == NULL || (strlen(str) < 23))
					continue;
				//获取发信人的号码
				str = &str[20];
				memset(msgCharLen,0,3);
				memcpy(msgCharLen, str, 2);
				msgCharLen[2] = 0;
				memset(msg,0,8192);
				memcpy(msg,msgCharLen,strlen(msgCharLen));

				char conBuf[1];
				memset(conBuf,0,2);
				memcpy(conBuf,msg,3);
				
				Len =ToConBuf(conBuf);;
				pSender = getPhoneNumber(&str[4], Len);
				ptr = str = &str[4 + Len + (Len%2)];
				
				//限制短讯长度,要大小20字节的短讯才可收记录,否则记作无效短讯
				if (strlen(str) < 20)    //old: 27
				{
					continue;
				}
				memset(msgCharLen,0,3);
				memcpy(msgCharLen, &str[18], 2);
				msgCharLen[2] = 0;
				if(msgCharLen == NULL)
					continue;
				memset(msg,0,8192);
				memcpy(msg,msgCharLen,strlen(msgCharLen));
				
				memset(conBuf,0,2);
				memcpy(conBuf,msg,3);
				Len = ToConBuf(conBuf);;
				str = &str[20];
				if ((cptr = strchr(str, '\r')) != NULL)
					cptr[0] = 0;
				
				//判断信息内容的编码格式,相应位的四个0表示信息采用GSM的7位编码格式
				if (ptr == strstr(ptr, "0000"))
				{
					memset(msg,0,8192);
					memcpy(msg,translateFromMobile(charToHex(str)),strlen(translateFromMobile(charToHex(str))));//短讯内容
					
					memset(MsgInfo,0,8192);
					memcpy(MsgInfo,translateFromMobile(charToHex(str)),strlen(translateFromMobile(charToHex(str))));//短讯内容
					result = (Len <= strlen(msg));
				}
				else
				{
					int oldLen = strlen(str)/2;
					result = (Len <= oldLen);

					CString sTmpMsg = translateFromUnicode(charToHex(str),oldLen);
					memset(msg,0,8192);
					memcpy(msg,sTmpMsg,strlen((LPCTSTR)sTmpMsg));
					
					memset(MsgInfo,0,8192);
					memcpy(MsgInfo,msg,strlen(msg));//短讯内容
				}
				if (!result)
				{
					continue;
				}
				// 若前面有电话号码前若有 +86 则去掉;
				char *pTel = strstr(pSender,"+86");
				if (pTel!=NULL)
				{
					if (strlen(pSender) == strlen(pTel))
					{
						pSender = pSender + 3;
						pSender[strlen(pSender)] = 0;
					}
				}
				else
				{
					pTel = strstr(pSender,"86");
					if ((pTel != NULL) && (strlen(pTel) >= 11))
					{
						pSender = pSender + 2;
						pSender[strlen(pSender)] = 0;
					}
				}
				memset(MsgMobNo,0,12);
				memcpy(MsgMobNo,pSender,strlen(pSender));//获取发短讯手机号码
				if (strlen(msg) == 0  || strlen(pSender) == 0)  //|| sRec == ""  如果收到一条空短信息
				{SendMsgInfo(StrSmsCenterCode,MsgMobNo,"短信内容不可为空!");
					pdest = strstr(cLoopSMSMsg, "+CMGL:");
					nPos = pdest - cLoopSMSMsg;
					if (nPos >= 0)
					{
						itmpisFound = 1;
						memset(TmpSmsCenter,0,8192);
						memcpy(TmpSmsCenter,cLoopSMSMsg,strlen(cLoopSMSMsg));
					}
					else
						itmpisFound = 0;
					

					char cTmp[10];
					memset(cTmp,0,10);
					itoa(iSmsPosIndex,cTmp,10);
					memset(StructionString,0,1024);
					memcpy(StructionString,"at+cmgd=",8);
					memcpy(StructionString + strlen(StructionString),cTmp,strlen(cTmp));
					memcpy(StructionString + strlen(StructionString),"\r",2);

					::Sleep(5000);
					int deleflag = WriteFile(Mobile, StructionString, strlen(StructionString), &num, NULL);
					
					if (deleflag) //*/
						SendSystemInfo("删除空短信成功!",3);
					continue;
				}
				char cTmpStr[200];
				if(strlen(msg)>200)
				{
					memset(cTmpStr,0,200);
					memcpy(cTmpStr,msg,200);

					memset(msg,0,8192);
					memcpy(msg,cTmpStr,strlen(cTmpStr));

				}

⌨️ 快捷键说明

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