📄 gsmsms.cpp
字号:
// GSMSMS.cpp: implementation of the CGSMSMS class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SmsCom.h"
#include "GSMSMS.h"
#include "SmsComDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGSMSMS::CGSMSMS()
{
m_szListMTCode.RemoveAll();//被叫号码列表
m_szSMCIAC=_T("886"); //国际区号
m_szMTIAC=_T("886"); //国际区号
m_nSMCALen=8;//短信中心地址长度,
m_szSMCCodeType=_T("91");//短信中心号码类型,"91"
//m_szSMCCode=_T("886932400841");//短信中心号码
//m_szChangedSMCCode=_T("889623048014");//转换后的短信中心号码
m_szSMCCode=_T("");//短信中心号码
m_szChangedSMCCode=_T("");//转换后的短信中心号码
m_szHeaderByte=_T("11");//文件头字节,一种bitmask,"11":指正常地发送短消息
m_szMsgType=_T("00");//信息类型,"00"
m_nCalledPhoneCodeLen=0x0D;//被叫号码长度
m_szCalledPhoneCodeType=_T("91");//被叫号码类型,"91"带86,不带时为"81"
m_szCalledPhoneCode=_T("");//被叫号码
m_szChangedCalledPhoneCode=_T("");//转换后的被叫号码
m_nSMCodingType=0;//短信息编码类型,0-英文,1-中文
m_szSMCodingType=_T("0000A7");//短信息编码类型,"0000A7"-英文,"000010"-中文
m_nSMLen=0;//短信长度
m_szSMContext=_T("");//短信内容
m_nSMFrameLen=0;//一条短信长度
m_szSMFrameContextPDU=_T("");//转换后的一条短信内容
memset(m_chSMFrameCMGS,'\0',1024);//发送一条短消息的内容
m_szDialedPhoneCode=_T("13871201592");//拨打电话号码
m_bstrSMContext=NULL;//m_szDialedPhoneCode.AllocSysString();//Valid data to only new
}
CGSMSMS::~CGSMSMS()
{
if(m_bstrSMContext!=NULL)
SysFreeString(m_bstrSMContext);//[中文]转换后的一条短信内容
}
CGSMSMS::CGSMSMS(CString szSMCCode, int type)
{
m_szListMTCode.RemoveAll();//被叫号码列表
m_szSMCIAC=_T("886"); //国际区号
m_szMTIAC=_T("886"); //国际区号
m_nSMCALen=8;//短信中心地址长度,
m_szSMCCodeType=_T("91");//短信中心号码类型,"91"
//m_szSMCCode=_T("886932400841");//短信中心号码
//m_szChangedSMCCode=_T("889623048014");//转换后的短信中心号码
m_szSMCCode=szSMCCode;//_T("");//短信中心号码
m_szChangedSMCCode=_T("");//转换后的短信中心号码
m_szHeaderByte=_T("11");//文件头字节,一种bitmask,"11":指正常地发送短消息
m_szMsgType=_T("00");//信息类型,"00"
m_nCalledPhoneCodeLen=0x0D;//被叫号码长度
m_szCalledPhoneCodeType=_T("91");//被叫号码类型,"91"带86,不带时为"81"
m_szCalledPhoneCode=_T("");//被叫号码
m_szChangedCalledPhoneCode=_T("");//转换后的被叫号码
m_nSMCodingType=0;//短信息编码类型,0-英文,1-中文
m_szSMCodingType=_T("0000A7");//短信息编码类型,"0000A7"-英文,"000010"-中文
m_nSMLen=0;//短信长度
m_szSMContext=_T("");//短信内容
m_nSMFrameLen=0;//一条短信长度
m_szSMFrameContextPDU=_T("");//转换后的一条短信内容
memset(m_chSMFrameCMGS,'\0',1024);//发送一条短消息的内容
m_szDialedPhoneCode=_T("13871201592");//拨打电话号码
m_bstrSMContext=NULL;//m_szDialedPhoneCode.AllocSysString();//Valid data to only new
}
BOOL CGSMSMS::PhoneCodeIsValid(CString &szPhoneCode)
{
szPhoneCode.TrimLeft();
szPhoneCode.TrimRight();
if(szPhoneCode.IsEmpty()!=0)
{
#ifdef MY_DEBUG_MSG
AfxMessageBox("号码为空!");
#else
#ifdef _DEBUG
TRACE("号码为空!");
#endif
#endif
return FALSE;
}
for(int i=0;i<szPhoneCode.GetLength();i++)
{
if(szPhoneCode[i]<'0' || szPhoneCode[i]>'9')
{
#ifdef MY_DEBUG_MSG
AfxMessageBox("号码中有非数字字符!》"+szPhoneCode);
#else
#ifdef _DEBUG
TRACE("号码中有非数字字符!》"+szPhoneCode);
#endif
#endif
return FALSE;
}
}
return TRUE;
}
BOOL CGSMSMS::ChangePhoneCode(CString &szPhoneCode,CString &szChangedPhoneCode)
{
int nCodeLength,nNum,nflag/**0-Even,1-Odd**/;
CString szChangedCode;
if(PhoneCodeIsValid(szPhoneCode)==FALSE)
return FALSE;
szChangedCode=szPhoneCode;
nCodeLength=szChangedCode.GetLength();
if(nCodeLength<=0)
return FALSE;
nflag=nCodeLength%2;
nNum=nCodeLength-nflag;
char itmp,jtmp;
for(int i=0,j=0;i<nNum;)
{
j=i+1;
itmp=szChangedCode[i];
jtmp=szChangedCode[j];
szChangedCode.SetAt(i,jtmp);
szChangedCode.SetAt(j,itmp);
i=j+1;
}
if(nflag==1)
{
szChangedCode.Insert(nNum,'F');
}
szChangedPhoneCode=szChangedCode;
return TRUE;
}
BOOL CGSMSMS::ChangeSMCCode(CString &szPhoneCode, CString &szChangedPhoneCode)
{
CString szCode;
szCode=szPhoneCode;
if(m_szSMCIAC.IsEmpty())
return FALSE;
else
{
if(m_szSMCIAC.Compare(szPhoneCode.Left(m_szSMCIAC.GetLength()))==0)
szCode=szPhoneCode;
else
szCode=m_szSMCIAC+szPhoneCode;
}
return ChangePhoneCode(szCode,szChangedPhoneCode);
}
BOOL CGSMSMS::ChangeMTCode(CString &szPhoneCode, CString &szChangedPhoneCode)
{
CString szCode;
szCode=szPhoneCode;
if(m_szMTIAC.IsEmpty())
m_szCalledPhoneCodeType=_T("81");
else
{
if(m_szMTIAC.Compare(szPhoneCode.Left(m_szMTIAC.GetLength()))==0)
szCode=szPhoneCode;
else
szCode=m_szMTIAC+szPhoneCode;
m_szCalledPhoneCodeType=_T("91");
}
if(ChangePhoneCode(szCode,szChangedPhoneCode)==FALSE)
return FALSE;
m_nCalledPhoneCodeLen=szCode.GetLength();
return TRUE;
}
BOOL CGSMSMS::ChangeSMContextToPDU(CString &szOrigContext,CString &szContextPDU)
{
char szmsg[256],szresult[512];
unsigned char chtmp;
int msgLength,cnt=0,msgNums;
if(szOrigContext.IsEmpty()!=0)
return FALSE;
szContextPDU.Empty();
memset(szmsg,'\0',256);
memset(szresult,'\0',512);
#ifdef MY_DEBUG_MSG
// AfxMessageBox(szOrigContext);
#else
#ifdef _DEBUG
TRACE(szOrigContext);
#endif
#endif
msgLength=szOrigContext.GetLength();
if(msgLength>160)
{
CString sztmp;
sztmp=szOrigContext.Left(160);
if(lstrcpy(szmsg,sztmp)==NULL)
return FALSE;
msgLength=160;
}
else
{
if(lstrcpy(szmsg,szOrigContext)==NULL)
return FALSE;
}
#ifdef MY_DEBUG_MSG
//AfxMessageBox(szmsg);
#else
#ifdef _DEBUG
TRACE(szmsg);
#endif
#endif
msgNums=msgLength-1;
cnt=0;
for(int i=0,j=0;i<msgLength;)
{
if(i<msgNums)
chtmp=( (szmsg[i]>>j) | (szmsg[i+1]<<(8-(j+1))) );
else
chtmp=szmsg[i]>>j;
j=(j+1)%7;
i=i+1;
cnt+=sprintf(szresult+cnt,"%02x",chtmp);
if(j==0)
i=i+1;
}
szContextPDU.Format("%s%c",szresult,26);//26<->ctrl^z
#ifdef MY_DEBUG_MSG
//AfxMessageBox(szresult);
#else
#ifdef _DEBUG
TRACE(szresult);
#endif
#endif
return TRUE;
}
BOOL CGSMSMS::ChangeSMContextToPDU(BSTR bstrOrigContext,CString &szContextPDU)
{
CString szSMFrameContextPDU;
int nSMFrameLen=0;
if(bstrOrigContext==NULL) return FALSE;
nSMFrameLen=::SysStringLen(bstrOrigContext);
unsigned short *pstr=(unsigned short *)bstrOrigContext;
szSMFrameContextPDU=_T("");
CString szTemp;
for(int i=0;i<nSMFrameLen;i++)
{
szTemp=_T("");
szTemp.Format("%04x",*( (unsigned short *)(pstr+i) ));
szSMFrameContextPDU+=szTemp;
}
szTemp=_T("");
szTemp.Format("%c",26);//26<->ctrl^z
szContextPDU=szSMFrameContextPDU+szTemp;
// AfxMessageBox(szContextPDU);
return TRUE;
}
BOOL CGSMSMS::OrgnizeSMFrameContext(CString &szError)
{
szError=_T("");
CString szSMContext;
char chtmp[1024];
// wchar_t wchtmp[1024];
UINT cnt=0;
if(m_szSMContext.IsEmpty())
{
szError=_T("无短信内容!");
return FALSE;
}
if(ChangeSMCCode(m_szSMCCode,m_szChangedSMCCode)==FALSE)
{
#ifdef MY_DEBUG_MSG
AfxMessageBox("变换短信中心号码出错!");
#else
#ifdef _DEBUG
TRACE("变换短信中心号码出错!");
#endif
#endif
szError=_T("变换短信中心号码出错!");
return FALSE;
}
m_nSMCALen=1+m_szChangedSMCCode.GetLength()/2;
if(ChangeMTCode(m_szCalledPhoneCode,m_szChangedCalledPhoneCode)==FALSE)
{
#ifdef MY_DEBUG_MSG
AfxMessageBox("变换被呼叫号码出错!");
#else
#ifdef _DEBUG
TRACE("变换被呼叫号码出错!");
#endif
#endif
szError=_T("变换被呼叫号码出错!");
return FALSE;
}
if(m_nSMCodingType==0)
{
// m_nSMLen=m_szSMContext.GetLength();
if(m_nSMLen>0 && m_nSMLen<=160)
{
szSMContext=m_szSMContext;
m_nSMFrameLen=m_nSMLen;
}
else if(m_nSMLen>160)
{
szSMContext=m_szSMContext.Left(160);
m_nSMFrameLen=160;
CString szTmp;
szTmp.Format("纯英文方式编码,短消息内容长度%d>160个字元",m_nSMLen);
( (CSmsComDlg*)(AfxGetApp()->GetMainWnd()) )->DispMsg(szTmp);
}
else
{
#ifdef MY_DEBUG_MSG
AfxMessageBox("无短信内容!");
#else
#ifdef _DEBUG
TRACE("无短信内容!");
#endif
#endif
szError=_T("无短信内容!");
return FALSE;
}
if(ChangeSMContextToPDU(szSMContext,m_szSMFrameContextPDU)==FALSE)
{
#ifdef MY_DEBUG_MSG
AfxMessageBox("短信内容变换时出错!");
#else
#ifdef _DEBUG
TRACE("短信内容变换时出错!");
#endif
#endif
szError=_T("短信内容变换时出错!");
return FALSE;
}
}
else//中文
{
BSTR bstrOrigContext=NULL;
if(m_nSMLen>0 && m_nSMLen<=70)
m_nSMFrameLen=m_nSMLen;
else
{
m_nSMFrameLen=70;
CString szTmp;
szTmp.Format("中文方式编码,短消息内容长度%d>70个字元",m_nSMLen);
( (CSmsComDlg*)(AfxGetApp()->GetMainWnd()) )->DispMsg(szTmp);
}
bstrOrigContext = ::SysAllocStringLen((OLECHAR FAR *)m_bstrSMContext, m_nSMFrameLen );
// int nl=::SysStringLen(bstrOrigContext);
m_nSMFrameLen=m_nSMFrameLen*2;
if((ChangeSMContextToPDU(bstrOrigContext,m_szSMFrameContextPDU))==FALSE)
{
#ifdef MY_DEBUG_MSG
AfxMessageBox("短信内容变换时出错!");
#else
#ifdef _DEBUG
TRACE("短信内容变换时出错!");
#endif
#endif
szError=_T("短信内容变换时出错!");
if(bstrOrigContext!=NULL)
::SysFreeString(bstrOrigContext); // Free previous string, if any.
return FALSE;
}
if(bstrOrigContext!=NULL)
::SysFreeString(bstrOrigContext); // Free previous string, if any.
}
memset(m_chSMFrameCMGS,'\0',1024);
cnt=0;
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%02x",m_nSMCALen);
memset(chtmp,'\0',1024);
if(lstrcpy(chtmp,m_szSMCCodeType)==NULL)
return FALSE;
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%s",chtmp);
memset(chtmp,'\0',1024);
if(lstrcpy(chtmp,m_szChangedSMCCode)==NULL)
return FALSE;
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%s",chtmp);
memset(chtmp,'\0',1024);
if(lstrcpy(chtmp,m_szHeaderByte)==NULL)
return FALSE;
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%s",chtmp);
memset(chtmp,'\0',1024);
if(lstrcpy(chtmp,m_szMsgType)==NULL)
return FALSE;
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%s",chtmp);
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%02x",m_nCalledPhoneCodeLen);
memset(chtmp,'\0',1024);
if(lstrcpy(chtmp,m_szCalledPhoneCodeType)==NULL)
return FALSE;
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%s",chtmp);
memset(chtmp,'\0',1024);
if(lstrcpy(chtmp,m_szChangedCalledPhoneCode)==NULL)
return FALSE;
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%s",chtmp);
memset(chtmp,'\0',1024);
if(lstrcpy(chtmp,m_szSMCodingType)==NULL)
return FALSE;
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%s",chtmp);
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%02x",m_nSMFrameLen);
memset(chtmp,'\0',1024);
if(lstrcpy(chtmp,m_szSMFrameContextPDU)==NULL)
return FALSE;
cnt+=sprintf(m_chSMFrameCMGS+cnt,"%s",chtmp);
return TRUE;
}
BOOL CGSMSMS::SendShortMessage(CMSComm &ctrlSMSCom,CString &szError)
{
CString szErr;
if(OrgnizeSMFrameContext(szErr)==FALSE)
{
szError.Empty();
szError=_T("组织短消息的CMGS时:")+szErr;
return FALSE;
}
if(ctrlSMSCom.GetPortOpen())
{
char str[500];
CByteArray m_outarray,m_outcmgslen,m_outcmgsarr;
VARIANT m_varvalue;
memset(str,0,500);
sprintf(str,"AT+CMGF=0%c%c",13,10);
m_outarray.SetSize(strlen(str));
memcpy((char*)m_outarray.GetData(),str,strlen(str));
COleVariant *CMGFolevar=new COleVariant(m_outarray);
m_varvalue=*LPCVARIANT(*CMGFolevar);
ctrlSMSCom.SetOutput (m_varvalue);
Sleep(100);
delete CMGFolevar;
memset(str,0,500);
sprintf(str,"AT+CMGS=%d%c",m_nSMFrameLen+9,13);
m_outcmgslen.SetSize(strlen(str));
memcpy((char*)m_outcmgslen.GetData(),str,strlen(str));
COleVariant *CMGFLENolevar=new COleVariant(m_outcmgslen);
m_varvalue=*LPCVARIANT(*CMGFLENolevar);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -