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

📄 gsmsms.cpp

📁 sms sender 察到布局图全貌
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -