📄 msgrecv.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 + -