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

📄 smstest.cpp

📁 短信收发测试程序。程序通过手机发送短信给自己
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
//#include "SMSTest.h"

#include "MMSYSTEM.H"
#pragma comment(lib,"winmm.lib")

HWND g_notifyhWnd;
UINT g_DevID;
UINT g_TestCount;
UINT g_TestInterval;
BOOL* g_IsTerminal ;

#ifdef _DEBUG
	CFile DebugFile;
#endif

CSMSTest::~CSMSTest()
{
	if ( DllInst ) FreeLibrary (DllInst);
	if ( DllInst2 ) FreeLibrary (DllInst2);
}

CSMSTest::CSMSTest()
{
	com_handle=NULL;		
	m_SMSIndex = 1;
}

/*BOOL CSMSTest::InitialComPort()
{	
	//DllInst = LoadLibrary (".\\PlugIn\\MFCComPortDll.dll");
	CString Pathee=SysTemPath+"PlugIn\\MFCComPortDll.dll";
	DllInst = LoadLibrary (Pathee);
	
	if(DllInst==NULL)
	{
		DWORD  errcode = GetLastError();
		AfxMessageBox("MFCComPortDll.dll Initial error");
		LPVOID lpMsgBuf;
		if (!FormatMessage( 
			FORMAT_MESSAGE_ALLOCATE_BUFFER | 
			FORMAT_MESSAGE_FROM_SYSTEM | 
			FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL,
			errcode,
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
			(LPTSTR) &lpMsgBuf,
			0,
			NULL ))
			
		{	
			AfxMessageBox("ErrorCode:"+errcode); 
		}
		
		AfxMessageBox((LPCTSTR)lpMsgBuf); 

		// Free the buffer.
		LocalFree( lpMsgBuf );
		return FALSE;
	}

    Send = (BOOL (__stdcall *) (UINT bComId,char *sendstr,int len))
            GetProcAddress ( DllInst, "_Send@12" );
    Receive = (BOOL (__stdcall *) (UINT bComId,char *recvstr,int &len))
            GetProcAddress ( DllInst, "_Receive@12" );

    OpenPort = (BOOL (__stdcall *) (UINT bComId,DWORD dwBaudRate))
            GetProcAddress ( DllInst, "_OpenPort@8" );
    ClosePort = (BOOL (__stdcall *) (UINT bComId))
            GetProcAddress ( DllInst, "_ClosePort@4" );

	//DllInst2 = LoadLibrary ( "..\\Bin\\PlugIn\\GSMPDUCode.dll" );
	Pathee=SysTemPath+"PlugIn\\GSMPDUCode.dll";
	DllInst2 = LoadLibrary (Pathee);

	if(DllInst2==NULL)
	{
		AfxMessageBox("GSMPDUCode.dll Initial error");
		return FALSE;
	}

	gsmString2Bytes = (int (__stdcall *) (const char* pSrc, unsigned char* pDst, int nSrcLength))
            GetProcAddress ( DllInst2, "_gsmString2Bytes@12" );
    gsmEncodePdu = (int (__stdcall *) (const SM_PARAM* pSrc, char* pDst))
            GetProcAddress ( DllInst2, "_gsmEncodePdu@8" );
    gsmDecodePdu = (int (__stdcall *) (const char* pSrc, SM_PARAM* pDst))
            GetProcAddress ( DllInst2, "_gsmDecodePdu@8" );

	return TRUE;

}*/

/*void CSMSTest::FreeComPort()
{
	FreeLibrary(DllInst);
	FreeLibrary(DllInst2);
	return;
}*/
int CSMSTest::recvsms(int portB,SMS_PARAM *param)
{
	char* ptr;
	SM_PARAM pMsg;
	time_t current=time(NULL);
	CString temp=ctime(&current);	
	temp = temp.Mid(4,15);		

	temp.SetAt(3 , '_');
	temp.SetAt(6 , '_');
	temp.SetAt(9 , '_');
	temp.SetAt(12 , '_');	
	temp.Format("PDU@"+temp + ".txt" );		

	m_recvFolder=param->recvfolder;

	temp = m_recvFolder + temp;

	CFile datafile;		
	if(!datafile.Open(temp,CFile::modeWrite|CFile::modeCreate))
	  {
		 // SendWMMessage(WM_FILE_STATUS , File_OpenFail , 0);	
		  QDDataService()->ParseSMS_ReceiveTestData(SMSR_FileFall  , 0, _T(""));
		 //break;
		  AfxMessageBox("接收文件创建失败");
	  }
	int recvlen=0;
	//char *recvstr=new char[4096];

	CString cmd,ans;
	int pos=0;
	DWORD starttime=0;

//	memset(recvstr,0,4096);
	starttime=timeGetTime();

	//QDDataService()->ParseSMS_SendTestData(SMS_AtInit    , 0, _T(""));

	cmd = "AT+CMGF=0\r";
	Senddata( portB,(char*)(LPCTSTR)cmd ,cmd.GetLength());	
	ans=ReceiveData( );
	//ans=recvstr;
	//memset(recvstr,0,4096);


	QDDataService()->ParseSMS_SendTestData(SMSR_SetAt , 0, _T(""));

	int a=2;
	int b=1;
//	cmd="AT+CPMS=";
	cmd.Format( "AT+CNMI=%d,%d\r" ,a,b);
	Senddata(portB,(char*)(LPCTSTR)cmd,cmd.GetLength());

	cmd = "AT+CMGF=0\r";
	Senddata( portB,(char*)(LPCTSTR)cmd ,cmd.GetLength());	
	ans=ReceiveData( );
	//ans=recvstr;
	//memset(recvstr,0,4096);


	//QDDataService()->ParseSMS_SendTestData(SMSR_SetAt , 0, _T(""));

	a=2;
	b=1;
//	cmd="AT+CPMS=";
	cmd.Format( "AT+CNMI=%d,%d\r" ,a,b);
	Senddata(portB,(char*)(LPCTSTR)cmd,cmd.GetLength());
	

	Sleep(50);
	ans=ReceiveData();	// 读应答数据

	//ans=recvstr;
	if((pos=ans.Find("OK")) == -1) 
	{
		QDDataService()->ParseSMS_SendTestData(SMSR_SetAtFail  , 0, _T(""));
		return -1;
	}
	if(*g_IsTerminal) return -1;
//	memset(recvstr,0,4096);


	DWORD ETime=timeGetTime();


	while(1)
	{
		if(*g_IsTerminal) return -1;

		ans=ReceiveData();	// 读应答数据

		//if(recvlen!=0)ans=recvstr;

		ptr=(char*)(LPCTSTR)ans;
		//recvlen=0;
		
		if((pos=ans.Find("ERROR")) != -1) 
		{
		//	SendWMMessage(WM_SMS_STATUS , SMSRecv_Success ,timeGetTime());	
			QDDataService()->ParseSMS_SendTestData(SMSR_Fail  , 0, _T(""));
			return -1;
		}			
		//if((pos=ans.Find("+CMT:")) != -1) 
		if((ptr = strstr(ptr, "+CMTI:")) != NULL)
		{
			//SendWMMessage(WM_SMS_STATUS , SMSRecv_Success ,timeGetTime());
			QDDataService()->ParseSMS_SendTestData(SMSR_Success , 0, _T(""));

			//break;
			//AfxMessageBox("zzf");
			//--------------------------确定信息位置-------------------------
             pos=ans.Find(",");
			 ans.Delete(0,pos+1);
			 //recvlen=ans.StringLength();
			 int me=atoi(ans/*.Left(2)*/);
			// if(me>99)me=atoi(ans.Left(1));


			//-----------------------------此处添加短信读取程序--------------------
			cmd.Format( "AT+CMGR=%d\r" , me);                        // 生成命令--------  ?  m_SMSIndex=0

	        Senddata(param->recvcomport,(char*)(LPCTSTR)cmd,cmd.GetLength());	 // 输出命令串---端口号+命令--------

			do
			{
				ans=ReceiveData();	      // 读取短信内容
			    //ans=recvstr;
			}while(ans.Find("+CMGR:")==-1);
			//------------------------------保存数据-------------------------------------

			strcpy(param->Pushdata,ans);              //后来添加的用于保存push数据的单元

			datafile.Write(ans,ans.GetLength());
			datafile.Close();

			//break;
			////------------------------------------------------------------------
			ptr=(char*)(LPCTSTR)ans;
			if((ptr = strstr(ptr, "+CMGR:")) != NULL)
			{
				ptr += 6;		// 跳过"+CMGL:"
				//sscanf(ptr, "%d", &pMsg.index);	// 读取序号
				//		TRACE("  index=%d\n",pMsg->index);

				ptr = strstr(ptr, "\r\n");	// 找下一行
				ptr += 2;		// 跳过"\r\n"

				CString Trans=ptr;
				
				//TRACE("%s" , ptr);

				char* Myptr=(char*)(LPCTSTR)Trans;

			
				GsmDecodePdu(Myptr, &pMsg);	// PDU串解码	

				//AfxMessageBox(ptr);
				//AfxMessageBox(ans);
				

				strcpy(param->phonenum,pMsg.TPA);
				strcpy(param->content,pMsg.TP_UD);
				QDDataService()->ParseSMS_SendTestData(SMSR_Phone , 0,pMsg.TPA);
				QDDataService()->ParseSMS_SendTestData(SMSR_Content , 0, pMsg.TP_UD);
				//delete ptr;
			    return 1;	
			}
		}
//		memset(recvstr,0,4096);

		


		if((int)(timeGetTime()-ETime)>300000)
		{
		QDDataService()->ParseSMS_SendTestData(SMSR_TimeOut , 0, _T(""));
		return -1;
		}


		if(*g_IsTerminal) return -1;
	}

	//delete ptr;

	return -1;
}

void SethWnd(HWND hWnd)
{
	return;
}
BOOL CSMSTest::sendsms(int portA ,char *phonenum,char *SMScontent ,CString centernum)
{
	int nPduLength;		// PDU串长度
	unsigned char nSmscLength;	// SMSC串长度
//	int nLength;		// 串口收到的数据长度
	CString cmd;		// 命令串
	char pdu[512];		// PDU串
	CString ans;     	// 应答串
	SM_PARAM SmParam;         //短消息参数结构
	BOOL status=FALSE;

	char *recvstr=new char[4096];
	char *sendstr=new char[512];	

	int recvlen=0;
//	int iCount;
	DWORD starttime=0;

	memset(sendstr,0,512);
	memset(recvstr,0,4096);

	CString CenterNum;

	WCHAR wchar[1024];
	int nCount = ::MultiByteToWideChar(CP_ACP, 0, SMScontent, -1, wchar, 1024);
	if(nCount <= 1)
	{
		AfxMessageBox("消息内容为空!");
		delete recvstr;
		delete sendstr;
		return FALSE;
	}
	else if(nCount > 70)		// UCS2编码,最大70个字符(半角/全角)
	{
		AfxMessageBox("消息内容太长,无法发送!");		
		delete recvstr;
		delete sendstr;
		return FALSE;
	}
//-------------------------------------------------------------------
	//QDDataService()->ParseSMS_SendTestData(SMSS_AtInit  , 0, _T(""));

	cmd = "AT+CMGF=1\r";
	Senddata( portA,(char*)(LPCTSTR)cmd ,cmd.GetLength());	
	ReceiveData( );
//	CString kk=recvstr;
	//memset(recvstr,0,4096);

	//QDDataService()->ParseSMS_SendTestData(SMSS_AtInit  , 0, _T(""));

	cmd = "AT+CSCA=\"+";
	cmd =cmd+centernum;
	cmd=cmd+"\"\r";
	Senddata( portA,(char*)(LPCTSTR)cmd ,cmd.GetLength());	
	ReceiveData( );
	//memset(recvstr,0,4096);

	//QDDataService()->ParseSMS_SendTestData(SMSS_AtInit  , 0, _T(""));

	cmd = "AT+CMGF=0\r";
	Senddata( portA,(char*)(LPCTSTR)cmd ,cmd.GetLength());	
	ReceiveData( );
	//memset(recvstr,0,4096);


//--------------------------------------------------------------------
	Sleep(500);
	cmd = "AT+CSCA?\r";
	Senddata( portA,(char*)(LPCTSTR)cmd ,cmd.GetLength());	
	Sleep(500);
	CenterNum=ReceiveData( );
	//CenterNum=recvstr;
	//memset(recvstr,0,4096);

	//QDDataService()->ParseSMS_SendTestData(SMSS_SMSC  , 0, _T(""));

	int pos=0;
	if((pos=CenterNum.Find("86"))!=-1)
	{
		CenterNum=CenterNum.Mid(pos,13); 
		QDDataService()->ParseSMS_SendTestData(SMSS_SMSC  , 0, _T(""));
		//PostMessage Get CenterNum		
		/*DWORD Hi = 0x10000 * g_DevID;
		WPARAM wParam = Hi + SMSCenterNum;
		SendMessage(g_notifyhWnd , WM_SMS_STATUS , wParam , (LPARAM)(void*)(LPCTSTR)CenterNum);*/
		
	}		
	else	
	{
		//PostMessage Get CenterNum Fail
//		SendWMMessage(WM_SMS_STATUS , SMSCenterNum_Fail ,0);
		QDDataService()->ParseSMS_SendTestData( SMSS_SMSCFall  , 0, _T(""));
		return FALSE;
	}
	

	memset(&SmParam, 0, sizeof(SM_PARAM));
	strcpy(SmParam.TPA, phonenum);
	//strcpy(SmParam.SCA, "8613800756500");
	strcpy(SmParam.SCA, centernum);
	//SmParam.SCA=centernum;
	strcpy(SmParam.TP_UD, SMScontent);
	SmParam.TP_PID = 0;
	SmParam.TP_DCS = GSM_UCS2;
	//SmParam.TP_DCS = GSM_7BIT;

⌨️ 快捷键说明

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