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

📄 smscomm.cpp

📁 收发短信ocx控件
💻 CPP
字号:
#include "stdafx.h"
#include "SmsComm.h"
#include "ShortMessage.h"
#include "MsgSend.h"

SmsComm::SmsComm(void)
{
}

SmsComm::~SmsComm(void)
{
}


CString SmsComm::GetComm(void)
{
	CString strResult;
	HKEY hKey;
	LONG ret;
	OSVERSIONINFO  osvi;
	BOOL bOsVersionInfoEx;
	char keyinfo[100],comm_name[200],ValueName[200];
	int i;
	DWORD sType,Reserved,cbData,cbValueName;

	ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

	memset(keyinfo,0,100);
	strcpy(keyinfo,"HARDWARE\\DEVICEMAP\\SERIALCOMM");
	i=0; sType=REG_SZ;Reserved=0;
	bOsVersionInfoEx =GetVersionEx(&osvi);
	ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyinfo,0,KEY_ALL_ACCESS,&hKey);
	if (ret==ERROR_SUCCESS)
	{
		if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
		{
			do 
			{
				cbData=200;cbValueName=200;
				memset(comm_name,0,200); 
				memset(ValueName,0,200);
				ret=RegEnumValue(hKey,i,ValueName,&cbValueName,NULL,&sType,(LPBYTE)comm_name,&cbData);
				if (ret==ERROR_SUCCESS)
				{
					 //m_list.Add(comm_name);
					 strResult = strResult + "|" + comm_name;
					 i++;
				}
			}while (ret==ERROR_SUCCESS);
		}
	}
	RegCloseKey(hKey);
	return strResult;
}

int SmsComm::SendData(char *buffer, DWORD dwBytesWritten)
{
	BOOL bWriteStat;
	//DWORD dwBytesRead;
	bWriteStat = WriteFile(m_hCom, buffer, dwBytesWritten, &dwBytesWritten, &m_OverlappedWrite );
	//CString s;
	//s.Format("SEND:%s",buffer);
	//AddDebug(s);
	if(!bWriteStat)
	{
		 if(GetLastError()==ERROR_IO_PENDING)
		{
			WaitForSingleObject(m_OverlappedRead.hEvent,1000);
			return ((int)dwBytesWritten);
		}
		return(0);
	}
	return ((int)dwBytesWritten);
}

int SmsComm::SendData(CString strPhone, CString strMessage)
{
	CMsgSend msg;
	CString m_mobile = strPhone;
	CString m_message = strMessage;


	msg.Pack(m_mobile,m_message);
	CString sendMsg = msg.GetMsgData();

    //AfxMessageBox("sendMsg:"+sendMsg);

	CString m;
	m.Format("AT+CMGS=%d\r",(sendMsg.GetLength()-msg.SCA.GetLength())/2);

	//AfxMessageBox("command:"+m);

	SendData((LPSTR)(LPCTSTR)m,m.GetLength());


	Sleep(300);
	

	m.Format("%s%c",sendMsg,0x1a);

	//AfxMessageBox("content:"+m);
	int iReturn = SendData((LPSTR)(LPCTSTR)m,m.GetLength());
	return iReturn;
}

int SmsComm::ReadData(char *buffer, DWORD dwBytesRead)
{
	BOOL   bReadStatus;
	bReadStatus = ReadFile( m_hCom, buffer, dwBytesRead, &dwBytesRead,&m_OverlappedRead);
	if(!bReadStatus)
	{
		if(GetLastError()==ERROR_IO_PENDING)
		{
			WaitForSingleObject(m_OverlappedRead.hEvent,1000);
			return ((int)dwBytesRead);
		}
		return(0);
	}
	return ((int)dwBytesRead);
}

int SmsComm::ReadUnReadMsg()
{
	CString m;
	m.Format("AT+CMGL=0\r");
	int iReturn = SendData((LPSTR)(LPCTSTR)m,m.GetLength());
	Sleep(500);
	return iReturn;
}

int SmsComm::ReadAllMsg()
{
	CString m;
	m.Format("AT+CMGL=4\r");
	int iReturn = SendData((LPSTR)(LPCTSTR)m,m.GetLength());
	Sleep(500);
	return iReturn;
}
	

int SmsComm::CommWatchProc(LPARAM parm)
{
	SmsComm * smsComm = (SmsComm *)parm;
	//HANDLE m_hComDev = dlg->m_hCom;
	DWORD dwBytesRead;
	char buffer[8000];

	DWORD ret;

	while(true)
	{
		memset(buffer,0,8000);
		int r = smsComm->ReadData(buffer,8000);
		// TRACE("%s",buffer);
		if(strlen(buffer) != 0)
		{	  
			CString s;
			s.Format("%s",buffer);

			CShortMessage Message;
			Message.Open(s);

			if(Message.GetCount() > 0)	//有消息
			{
				//CString szText;
				//szText.Format("接收短信成功,共收到%d条信息。", Message.GetCount());
				//AfxMessageBox(szText);

				while(!Message.GetEOF())
				{
					CString szCallCenter = Message.GetCallCenter();
					CString szCallFrom	 = Message.GetCallNumber();
					CString szSMSContent = Message.GetSMSContent();
					CString szDateTime   = Message.GetDateString();

					//szText.Format("短信中心:\t%s\r\n发送号码:\t%s\r\n短信内容:\t%s\r\n\r\n日期时间:\t%s", 
					//	Message.GetCallCenter(), Message.GetCallNumber(), Message.GetSMSContent(), Message.GetDateString());
					//AfxMessageBox(szText);
					//dlg->AddDebug(Message.GetSMSContent());

					AfxMessageBox(szSMSContent);

					Message.MoveNext();
				}
			}
		}
		Sleep(100);
	}
	return 0;
}


int SmsComm::OpenComm(CString strComm)
{
	int isOpen = 0;
	CString strOpenComm = strComm;
	DWORD dwThreadID;

	m_hCom = CreateFile(strComm,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);

	if(m_hCom == INVALID_HANDLE_VALUE)
	{
		//AfxMessageBox("对不起,连接失败!");
		return isOpen;
	}

	ASSERT(m_hCom!=INVALID_HANDLE_VALUE);

	SetCommMask(m_hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型

	SetupComm( m_hCom, 1024,512) ; //设置输入、输出缓冲区的大小

	PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); //清干净输入、输出缓冲区

	COMMTIMEOUTS CommTimeOuts ; //定义超时结构,并填写该结构

	CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
	CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
	CommTimeOuts.ReadTotalTimeoutConstant = 0;
	CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
	CommTimeOuts.WriteTotalTimeoutConstant = 5000;


	SetCommTimeouts( m_hCom, &CommTimeOuts ) ;//设置读写操作所允许的超时

	DCB dcb;

	GetCommState(m_hCom, &dcb ) ; //读串口原来的参数设置

	dcb.BaudRate =9600; 

	dcb.ByteSize =8; 

	dcb.Parity = NOPARITY;

	dcb.StopBits = ONESTOPBIT ;

	dcb.fBinary = TRUE ;

	dcb.fParity = FALSE;

	SetCommState(m_hCom, &dcb ) ; //串口参数配置
	memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
	memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );

	m_OverlappedRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	m_OverlappedWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	m_hExit = CreateEvent(NULL,NULL,FALSE,NULL);

	hCommWatchThread = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE)CommWatchProc,this,0, &dwThreadID );

	if(hCommWatchThread == NULL)
	{
		//AfxMessageBox("对不起,连接失败!");
		return isOpen;
	}



	ASSERT(hCommWatchThread!=NULL);

	isOpen = 1;

	SendData("AT\r\n",strlen("AT\r\n"));
	PurgeComm(m_hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); 
	return isOpen;
}

⌨️ 快捷键说明

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