📄 mobmsgdlg.cpp
字号:
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 + -