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

📄 msgrecv.cpp

📁 GSM Mobile收发短信
💻 CPP
字号:
// MsgRecv.cpp: implementation of the CMsgRecv class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MsgRecv.h"
#include "UString.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMsgRecv::CMsgRecv()
{

}

CMsgRecv::~CMsgRecv()
{

}

void CMsgRecv::init()
{
	int i;

	msgTye="";//"[收|发]类型";
	msgPerson="";//"[收|发]人";
	msgHand="";//"[收|发]号码";
	msgBody="";//"[收|发]内容";
	msgTime="";//"[收|发]时间";
	msgState="";//"[收|发]状态";
	msgNote="";//"备注";

	msgCMGS="AT+CMGS";//发送指令关键字。
	msgCMGL="AT+CMGL";//(0:未读.1:已读)。
	msgCNMI="AT+CNMI";//0,0,0,0,1:短信息提醒功能,在此取消该功能,采取一次性读取的方式。
	msgCSCA="AT+CSCA";//设置短信中心。
	msgCMGF="AT+CMGF";//设置手机模式:0-->PDU格式;1-->文本格式.

	for(i=0;i<1024;i++)
	{
		mp[i].msgB ="";
		mp[i].msgBody ="";
		mp[i].msgH ="";
		mp[i].msgSeq ="";
		mp[i].msgStat ="";
		mp[i].msgTag =0;
		mp[i].msgMsg ="";
	
		mp[i].msgCentLen="";//08:短信息中心地址长度。
		mp[i].msgCentType="";//91:短信息中心号码类型。
		mp[i].msgCentNo="";//683108701305F0:短信息中心号码,由于位置上略有处理,实际号码应为:8613800731500(字母F是指长度减1)。
		mp[i].msgFileHead="";//11:文件头字节。
		mp[i].msgMsgType="";//00:信息类型.
		mp[i].msgCalledLen="";//0B:被叫号码长度。(0D)
		mp[i].msgCalledType="";//91:被叫号码类型.
		mp[i].msgCalledNo="";//3176378290F9:被叫号码,经过了位移处理,实际号码为“13677328099”。	
		mp[i].msgProTag="";//00:协议标识.
		mp[i].msgDMethod="";//00:数据编码方案.
		mp[i].msgMsgTime="";//00:有效期.
		mp[i].msgDataLen="";//02:用户数据长度.
		mp[i].msgSBody="";//C834:用户数据TP-UD(TP-User-Data)“Hi”.

	}
}

void CMsgRecv::parse(CString BStr)
{  		
	CString Ret="";
	CString RetClf="\r\n";
	CString EndOK="OK";
	CString EndError="ERROR";
	CString T1="",T2="",T3="",T4="";
	int i,j,k;

	CString Test="AT+CMGL=4\r\n+CMGL: 1,1,,97\r\n0891683110701305F0040BA13150145808F62108302110114035204E672C8F6F4EF6672A6CE8518C002C6CE8518C8BF75230007700770077002E00690074006D006100630072006F002E0063006F006D002000480065006C006C006F00200057006F0072006C00640021\r\n+CMGL: 2,1,,27\r\n0891683110701305F0040BA13150145808F600083021109084442008963F003100320033\r\n+CMGL: 7,1,,81\r\n0891683110701305F0040BA13150145808F62108302110217254203E672C8F6F4EF6672A6CE8518C002C6CE8518C8BF75230007700770077002E00690074006D006100630072006F002E0063006F006D00200031003300310034\r\n+CMGL: 8,1,,26\r\n0891683110701305F0040BA13150145808F600003021103173702008963F0031003200\r\n\r\nOK\r\n";

	init();

	if(type(BStr) != msgCMGL)
	{
		return;
	}
		
	Ret=BStr;
//	Ret=Test;
	goto Begin;

Begin:	
	T1=Ret.Mid(Ret.GetLength()-2,2);
	T1.MakeUpper();
	if(T1==RetClf)
	{
		Ret=Ret.Mid(0,Ret.GetLength()-2);		
		T1=Ret.Mid(Ret.GetLength()-2,2);
		T1.MakeUpper();
		if(T1!=EndOK)
		{
			return;
		}
		else
		{
			Ret=Ret.Mid(0,Ret.GetLength()-2);		
			T1=Ret.Mid(Ret.GetLength()-4,4);
			if(T1!="\r\n\r\n")
			{
				return;
			}
			else
			{
				Ret=Ret.Mid(0,Ret.GetLength()-2);
				goto Start;
			}
		}
	}
	else
	{
		if(T1!=EndOK)
		{
			return;
		}
		else
		{
			Ret=Ret.Mid(0,Ret.GetLength()-2);
			T1=Ret.Mid(Ret.GetLength()-4,4);
			if(T1!="\r\n\r\n")
			{
				return;
			}
			else
			{
				Ret=Ret.Mid(0,Ret.GetLength()-2);
				goto Start;
			}
		}
	}

Start:
	T1="";
	for(i=0;i<Ret.GetLength();i++)
	{
		if(Ret[i]=='\r' && Ret[i+1]=='\n')
		{
			T1=Ret.Mid(0,i);
			break;
		}
	}
	if(T1=="")
	{
		return;
	}
	T1.MakeUpper();
	if(!((T1[7]=='=')&&(T1[8]>='0'&&T1[8]<='9')))
	{
		return;
	}
	Ret=Ret.Mid(11,Ret.GetLength()-11);
	Ret=Ret+"+CMGL: 0,0,,0";
	goto Put;

Put:
	k=0;
	for(i=0;i<Ret.GetLength()-2;i++)
	{
		T1=Ret.Mid(i,6);
		T1.MakeUpper();
		if(T1=="+CMGL:")
		{
			for(j=i+5;j<Ret.GetLength()-2;j++)
			{	
				if(j+6>Ret.GetLength()-1)
				{
					break;
				}
				T2=Ret.Mid(j,6);
				T2.MakeUpper();
				if(T2=="+CMGL:")
				{
					T3=Ret.Mid(i,j-i);
					mp[k].msgMsg =T3;
					mp[k].msgTag =1;
					k++;
					i=j-2;
					break;
				}
			}
		}
	}
	
	for(i=0;i<1024;i++)
	{
		if(mp[i].msgTag==0)
		{
			break;//continue;
		}
		T1=mp[i].msgMsg.Mid(mp[i].msgMsg.GetLength()-2,2);
		T1.MakeUpper();
		if(T1=="\r\n")
		{
			mp[i].msgMsg=mp[i].msgMsg.Mid(0,mp[i].msgMsg.GetLength()-2);
		}
		for(j=0;j<mp[i].msgMsg.GetLength();j++)
		{
			T2=mp[i].msgMsg.Mid(j,2);
			T2.MakeUpper();
			if(T2=="\r\n")
			{
				T3=mp[i].msgMsg.Mid(0,j);
				T4=mp[i].msgMsg.Mid(j+2,mp[i].msgMsg.GetLength()-j-1);
				mp[i].msgH =T3;
				mp[i].msgB =T4;
				break;
			}
		}
	}
	goto Parse;

Parse:
	for(i=0;i<1024;i++)
	{
		
		if(mp[i].msgTag==0)
		{
			break;//continue;
		}
		
		for(j=0;j<mp[i].msgH.GetLength();j++)
		{
			if(mp[i].msgH[j]==' ')
			{
				mp[i].msgH.Delete(j,1);
				j=j-1;
				break;
			}
		}
		int x,y,z;
		x=y=z=0;
		for(j=0;j<mp[i].msgH.GetLength();j++)
		{
			if(mp[i].msgH[j]==':')
			{
				x=j;
				break;
			}
		}
		for(j=x+1;j<mp[i].msgH.GetLength();j++)
		{
			if(mp[i].msgH[j]==',')
			{
				y=j;
				break;
			}
		}
		for(j=y+1;j<mp[i].msgH.GetLength();j++)
		{
			if(mp[i].msgH[j]==',')
			{
				z=j;
				break;
			}
		}
		T1=mp[i].msgH.Mid(x+1,y-x-1);
		T2=mp[i].msgH.Mid(y+1,z-y-1);
		mp[i].msgSeq  = T1;
		mp[i].msgStat = T2;
	}

	int x1,x2,x3,x4;
	CString y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12,y13,y14;
	char y15,y16;
	for(i=0;i<1024;i++)
	{
		if(mp[i].msgTag==0)
		{
			break;//continue;
		}

		y1=mp[i].msgB.Mid(0,2);//08:短信息中心地址长度。
		y2=mp[i].msgB.Mid(2,2);//91:短信息中心号码类型。
		y3=mp[i].msgB.Mid(4,2*(10*(y1[0]-'0')+(y1[1]-'0')+1)-4);//683108701305F0:短信息中心号码,由于位置上略有处理,实际号码应为:8613800731500(字母F是指长度减1)。
		y4=mp[i].msgB.Mid(2*(10*(y1[0]-'0')+(y1[1]-'0')+1),2);//11:文件头字节。
		y5=mp[i].msgB.Mid(2*(10*(y1[0]-'0')+(y1[1]-'0')+1)+2,2);//00:信息类型.
		y6=mp[i].msgB.Mid(2*(10*(y1[0]-'0')+(y1[1]-'0')+1)+4,2);//0B:被叫号码长度。(0D)
		//y7=mp[i].msgB.Mid(2*(10*(y1[0]-'0')+(y1[1]-'0')+1)+6,2);//91:被叫号码类型.
		x1=2*(10*(y1[0]-'0')+(y1[1]-'0')+1)+6;//被叫号码的起始位置。
		x2=(y5[0]>='A'?y5[0]-'A'+10:y5[0]-'0')*16+(y5[1]>='A'?y5[1]-'A'+10:y5[1]-'0');//被叫号码的长度。
		if(x2%2==1)
		{
			x2=x2+1;
		}
		y8=mp[i].msgB.Mid(x1,x2);//3176378290F9:被叫号码,经过了位移处理,实际号码为“13677328099”。	
		y9=mp[i].msgB.Mid(x1+x2,2);//00:协议标识.
		y10=mp[i].msgB.Mid(x1+x2+2,2);//00:数据编码方案.
		y11=mp[i].msgB.Mid(x1+x2+4,14);//00:有效期.
		y12=mp[i].msgB.Mid(x1+x2+18,2);//02:用户数据长度.
		x3=x1+x2+20;//Unicode内容体起始位置。
		x4=(y12[0]>='A'?y12[0]-'A'+10:y12[0]-'0')*16+(y12[1]>='A'?y12[1]-'A'+10:y12[1]-'0');
		y13=mp[i].msgB.Mid(x3,2*(x4>mp[i].msgB.GetLength()-x3?mp[i].msgB.GetLength()-x3:x4));

		mp[i].msgCentLen=y1;//08:短信息中心地址长度。
		mp[i].msgCentType =y2;//91:短信息中心号码类型。
		mp[i].msgCentNo =y3;//683108701305F0:短信息中心号码.[需要分析。]
		mp[i].msgFileHead=y4;//11:文件头字节。
		mp[i].msgMsgType=y5;//00:信息类型.
		mp[i].msgCalledLen =y6;//0B:被叫号码类型。(0D)
		//mp[i].msgCalledType=y7;
		mp[i].msgCalledNo =y8;//3176378290F9:被叫号码。需要分析。]
		mp[i].msgProTag =y9;//00:协议标识.
		mp[i].msgDMethod =y10;//00:数据编码方案.
		mp[i].msgMsgTime=y11;//00:有效期.[需要分析。]
		mp[i].msgDataLen =y12;//02:用户数据长度.[内容体长度。]
		mp[i].msgSBody =y13;//[具体内容,需要分析。]

		y14=mp[i].msgCentNo;
		mp[i].msgCentNo="";
		for(j=0;j<y14.GetLength();j+=2)
		{
			y15=y14[j];						
			y16=y14[j+1];						
			mp[i].msgCentNo =mp[i].msgCentNo+y16+y15;
		}
		if(mp[i].msgCentNo[mp[i].msgCentNo.GetLength()-1]=='F' ||
			mp[i].msgCentNo[mp[i].msgCentNo.GetLength()-1]=='f')
		{
			mp[i].msgCentNo=mp[i].msgCentNo.Mid(0,mp[i].msgCentNo.GetLength()-1);
		}

		y14 =mp[i].msgCalledNo;
		mp[i].msgCalledNo="";
		for(j=0;j<y14.GetLength();j+=2)
		{
			y15=y14[j];						
			y16=y14[j+1];						
			mp[i].msgCalledNo=mp[i].msgCalledNo+y16+y15;
		}
		if(mp[i].msgCalledNo[mp[i].msgCalledNo.GetLength()-1] =='F'||
			mp[i].msgCalledNo[mp[i].msgCalledNo.GetLength()-1]=='f')
		{
			mp[i].msgCalledNo=mp[i].msgCalledNo.Mid(0,mp[i].msgCalledNo.GetLength()-1);
		}

		y14 =mp[i].msgMsgTime;
		mp[i].msgMsgTime="";
		for(j=0;j<y14.GetLength();j+=2)
		{
			y15=y14[j];						
			y16=y14[j+1];						
			mp[i].msgMsgTime=mp[i].msgMsgTime+y16+y15;
		}
	}
	goto Body;

Body:
	int xx;
	
	WCHAR wstr[1024];// = new WCHAR [y1.GetLength()/4+1];
	char  sstr[1024];// = new char[y1.GetLength()/2+1];

	for(xx=0;xx<1024;xx++)
	{
		if(mp[xx].msgTag == 0)
		{
			break;
		}
		memset(wstr,0,sizeof(WCHAR)*1024);	
		memset(sstr,0,sizeof(CHAR)*1024);	
		switch(mp[xx].msgSBody.GetLength()%4)//!=0)
		{
			case 0:
				;
				break;
			case 1:
				mp[xx].msgSBody+="000";
				break;
			case 2:
				mp[xx].msgSBody+="00";
				break;
			case 3:
				mp[xx].msgSBody+="0";
				break;
		}

		CString p0,p1,p2,p3,p4;
		int q0,q1,q2,q3,q4;
		CUString u1;

		y1 = mp[xx].msgSBody;
//		WCHAR *wstr = new WCHAR [y1.GetLength()/4+1];
//		char *sstr = new char[y1.GetLength()/2+1];
		memset(sstr,0,y1.GetLength()+1);

		p0=mp[xx].msgSBody;
		j=0;
		int k1=0,k2=0;
		CString tt="";
		for(i=0;i<y1.GetLength();i+=4)
		{
			p0.Format("%c\0",y1[i]);
			p1.Format("%c\0",y1[i+1]);
			p2.Format("%c\0",y1[i+2]);
			p3.Format("%c\0",y1[i+3]);

			q0=(p0[0]>='A'?p0[0]-'A'+10:p0[0]-'0');
			q1=(p1[0]>='A'?p1[0]-'A'+10:p1[0]-'0');
			q2=(p2[0]>='A'?p2[0]-'A'+10:p2[0]-'0');
			q3=(p3[0]>='A'?p3[0]-'A'+10:p3[0]-'0');
		
			q4=q0*16*16*16+q1*16*16+q2*16+q3*1;
			if(q0==0 && q1==0)
			{
				k1++;
			}
			else
			{
				k2++;
			}
			wstr[j++]=q4;		
		}
//		sstr = new char [k1*1+k2*2+1];
		WideCharToMultiByte(CP_ACP,0,wstr,-1,sstr,k1+k2*2+1,NULL,NULL);
		tt.Format("%s\0",sstr);	
		tt  = tt.Mid(0,k1*1+k2*2);
		mp[xx].msgBody = tt;
//		delete [] wstr;
//		delete [] sstr;
	}

	return;

}
/*99
	CUString str((LPCTSTR)y13);
	WCHAR *wstr=(PWSTR)str;
	char s[256];
	memset(s,0,256);
	WideCharToMultiByte(CP_ACP,0,wstr,-1,s,256,NULL,NULL);
	AfxMessageBox(s);
*/

/*
08
91
683110701305F0
04
0B
A1
3150145808F6
00
08
30212012642220
10
4F60
597D
0041
0042
0043
0031
0032
0033


	AT+CMGL=4\r\n+CMGL: 1,1,,35\r\n0891683110701305F0040BA13150145808F6000830212012642220104F60597D004100420043003100320033\r\n+CMGL: 2,1,,53\r\n0891683110701305F0040BA13150145808F600083021201285052022621172314F60FF0C003100330031003430024F60597D004100420043003100320033\r\n\r\n\r\nOK\r\n
*/

CString CMsgRecv::type(CString BStr)
{
	CString Ret="NULL";

	if(BStr.GetLength() <7)
	{
		Ret="UNKNOWN";
		return Ret;
	}
	
	Ret = BStr.Mid(0,7);
	Ret.MakeUpper();
	return Ret;
	
}

⌨️ 快捷键说明

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