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

📄 sms.cpp

📁 用VC6++对串口编程的实现,主要对SMS的实现,可以模拟发短信,收短信,不过要相应的MODON
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	int		retval = -1;
	
	SetEvent(m_hStopMonitor);
	WaitForSingleObject(m_hStoppedEvent, INFINITE);

	sprintf((char*) command, "at+cmgr=%d\n", nLocation);
	command_len = strlen((char*) command);
	ret = m_pComm->WriteBytes(command, command_len);
	if(ret != command_len)
	{
		goto _out;
	}	
	ret = m_pComm->ReadLine((PBYTE) resp, 1024);		// 命令回显
	if(!ret || strncmp((char*) resp, (char*) command, command_len) != 0)
	{
		goto _out;
	}

	ret = m_pComm->ReadLine((PBYTE) resp, 1024);		// a short response header
	if(strcmp((char*) resp, "ERROR\r\n") == 0)
	{
		goto _out;
	}
	if(strncmp((char*) resp, "+CMGR: ", strlen("+CMGR: ")) != 0)
	{
		goto _out;
	}
	ret = m_pComm->ReadLine((PBYTE) resp, 1024);
	decode_rpdu((char*) resp, szTel, szTime, szMessage);	
	
	ret = m_pComm->ReadLine((PBYTE) resp, 1024);	//\r\n
	ret = m_pComm->ReadLine((PBYTE) resp, 1024);	//OK\r\n

	retval = 1;	// success

_out:
	SetEvent(m_hReMonitor);
	WaitForSingleObject(m_hRestartEvent, INFINITE);

	return retval;
}

int CSMS::read_message_by_type(int type, char** szTel, char** szTime, char** szMessage, int* location)
/*
	0: un read. 1: read, 2: un send, 3: sent, 4: all
*/
{
	BYTE	command[256], resp[1024];
	int		command_len, ret, i;

	int retval = -1;
	
	SetEvent(m_hStopMonitor);
	WaitForSingleObject(m_hStoppedEvent, INFINITE);
	
	//1. get 
	sprintf((char*) command, "at+cmgl=%d\n", type);
	command_len = strlen((char*) command);
	ret = m_pComm->WriteBytes(command, command_len);
	if(ret != command_len)
	{
		goto _out;
	}
	Sleep(30);
	ret = m_pComm->ReadLine((PBYTE) resp, 1024);			// 命令回显	
	if(!ret || strncmp((char*) resp, (char*) command, command_len) != 0 ||
		strncmp((char*) resp, (char*) "+CMGL: ", strlen("+CMGL: ")) != 0)
	{
		goto _out;
	}	
	for(i = 0; ; i++)
	{
		Sleep(10);
		if(strncmp((char*) resp, (char*) "+CMGL: ", strlen("+CMGL: ")) != 0)
		{
			if(m_pComm->ReadLine((PBYTE) resp, 1024) <= 0 || 
				strncmp((char*) resp, "ERROR\r\n", strlen("ERROR\r\n")) == 0)
			{
				goto _out;
			}
			if(strncmp((char*) resp, "OK\r\n", strlen("OK\r\n")) == 0)
				break;
		}
		location[i] = atoi((char*) resp + 7);
		Sleep(10);
		if(m_pComm->ReadLine((PBYTE) resp, 1024) <= 0)
		{
			goto _out;
		}
		if(strncmp((char*) resp, "OK\r\n", strlen("OK\r\n")) == 0)
			break;
		szTel[i] = (char*) malloc(32);
		szTime[i] = (char*) malloc(64);
		szMessage[i] = (char*) malloc(256);
		decode_rpdu((char*) resp, szTel[i], szTime[i], szMessage[i]);
	}

	retval = i;

_out:
	SetEvent(m_hReMonitor);
	WaitForSingleObject(m_hRestartEvent, INFINITE);

	return retval;
}

int CSMS::read_phone_book(char** szName, char** szTel)
{
	BYTE	command[256], resp[1024];
	int		len, command_len, ret, used, total, i, j;
	char	*pResp, *pNumber, delimiter[] = ",\r\n", pTel[32], pName[64], pAnsiName[64];
	USHORT	t1, t2;

	int		retval = -1;
	
	SetEvent(m_hStopMonitor);
	WaitForSingleObject(m_hStoppedEvent, INFINITE);
	
	//1. get 
	sprintf((char*) command, "at+cpbs?\n");
	command_len = strlen((char*) command);
	ret = m_pComm->WriteBytes(command, command_len);
	if(ret != command_len)
		goto _out;

	ret = m_pComm->ReadLine((PBYTE) resp, 1024);
	if(!ret || strncmp((char*) resp, (char*) command, command_len) != 0)
		goto _out;

	ret = m_pComm->ReadLine((PBYTE) resp, 1024);
	if(strncmp((char*) resp, "+CPBS: ", 7) != 0)
		goto _out;

	pResp = (char*) &resp[7];				//1.2. get storage type
	pResp = strtok(pResp, delimiter);		//1.3. get entries	
	pResp = strtok(NULL, delimiter);
	used = atoi(pResp);		
	pResp = strtok(NULL, delimiter);		//1.4. get capacity
	total = atoi(pResp);
	
	ret = m_pComm->ReadLine((PBYTE) resp, 1024);	//read OK\r\n
	ret = m_pComm->ReadLine((PBYTE) resp, 1024);	//read OK\r\n
	
	pResp = (char*) malloc(4 * 1024 * 1024);	
	sprintf((char*) command, "at+cpbr=1,%d\n", total);	//because, they didn't occupied continuous addresses.
	command_len = strlen((char*) command);
	ret = m_pComm->WriteBytes(command, command_len);
	if(ret != command_len)
		goto _out;

	ret = m_pComm->ReadLine((PBYTE) pResp, 4 * 1024 * 1024);
	while(ret > 0 && strncmp((char*) pResp, (char*) command, command_len) != 0)
		ret = m_pComm->ReadLine((PBYTE) resp, 1024);		// 命令回显	
	if(ret <= 0)
		goto _out;

	for(i = 0; i < used && ret != -1; i++)
	{
		ret = m_pComm->ReadLine((PBYTE) pResp, 4 * 1024 * 1024);
		if(strncmp(pResp, "ERROR\r\n", strlen("ERROR\r\n")) == 0)
		{
			goto _out;
		}
		pNumber = pResp + 7;
		pNumber = strtok(pNumber, delimiter);		// position
		pNumber = strtok(NULL, delimiter);			// No.
		if(strncmp(pNumber, "\"+86", 4) == 0)
			strcpy(pTel, pNumber + 4);				//eat two "
		else
			strcpy(pTel, pNumber + 1);				//eat two "
		pTel[strlen(pTel) - 1] = 0;
		
		pNumber = strtok(NULL, delimiter);			// type of address
		pNumber = strtok(NULL, delimiter);			// name
		strcpy(pName, pNumber + 1);					//eat two "		
		pName[strlen(pName) - 1] = 0;		
		len = strlen(pName);
		if(len > 4 && pName[0] == '8' && pName[1] == '0' && strncmp(pName + len - 4, "FFFF", 4) == 0) //Chinese
		{
			WCHAR wcharName[32];
			len = len - 4;
			for(j = 2; j < len; j += 4)	//skip '80'
			{	
				t1 = ((USHORT) hex_str2int(pName[j], pName[j + 1])) & 0x00FF;
				t2 = ((USHORT) hex_str2int(pName[j + 2], pName[j + 3])) & 0x00FF;
				wcharName[(j - 2) / 4] = ((t1 << 8) | t2);
			}
			wcharName[(len - 2) / 4] = 0;
			WideCharToMultiByte(CP_ACP, 0, wcharName, -1, pAnsiName, 64, NULL, NULL);
		}
		else
			strcpy(pAnsiName, pName);
		szTel[i] = (char*) malloc(strlen(pTel) + 1);
		szName[i] = (char*) malloc(strlen(pAnsiName) + 1);
		strcpy(szTel[i], pTel);
		strcpy(szName[i], pAnsiName);
	}
	ret = m_pComm->ReadLine((PBYTE) pResp, 4 * 1024 * 1024); //\r\n
	ret = m_pComm->ReadLine((PBYTE) pResp, 4 * 1024 * 1024); //read the last OK\r\n	
	free(pResp);

	retval = used;
	
_out:
	SetEvent(m_hReMonitor);
	WaitForSingleObject(m_hRestartEvent, INFINITE);
	
	return retval;
}

int CSMS::remove_message_by_type(int type)
{
	char command[256], resp[512];
	int  ret, command_len;

	int  retval = -1;
	
	sprintf(command, "at+cmgd=1,%d\n", type);
	command_len = strlen(command);	
	SetEvent(m_hStopMonitor);
	WaitForSingleObject(m_hStoppedEvent, INFINITE);	
	Sleep(10);
	ret = m_pComm->WriteBytes((PBYTE) command, command_len);
	if(ret != command_len)
		goto _out;

	ret = m_pComm->ReadLine((PBYTE) resp, 512);	
	if(!ret || strncmp((char*) resp, (char*) command, command_len) != 0)
		goto _out;

	ret = m_pComm->ReadLine((PBYTE) resp, 512);	//\r\n
	if(strcmp(resp, "ERROR\r\n") == 0)
		goto _out;

	retval = 1;

_out:
	SetEvent(m_hReMonitor);
	WaitForSingleObject(m_hRestartEvent, INFINITE);
	return retval;
}

int CSMS::remove_message(int nLocation)
{
	char command[256], resp[512];
	int  ret, command_len;

	int	 retval = -1;
	
	sprintf(command, "at+cmgd=%d\n", nLocation);
	command_len = strlen(command);	
	SetEvent(m_hStopMonitor);
	WaitForSingleObject(m_hStoppedEvent, INFINITE);	
	ret = m_pComm->WriteBytes((PBYTE) command, command_len);
	if(ret != command_len)
		goto _out;
	
	ret = m_pComm->ReadLine((PBYTE) resp, 512);	
	if(!ret || strncmp((char*) resp, (char*) command, command_len) != 0)
		goto _out;
	
	ret = m_pComm->ReadLine((PBYTE) resp, 512);	//\r\n
	if(strcmp(resp, "ERROR\r\n") == 0)
		goto _out;

	retval = 1;
	
_out:
	SetEvent(m_hReMonitor);
	WaitForSingleObject(m_hRestartEvent, INFINITE);	

	return retval;
}

DWORD WINAPI CSMS::MonitorThread(LPVOID lpParam)
{
	CSMS		*pSms = (CSMS*) lpParam;
	CSerialPort *pPort = pSms->m_pComm;	
	DWORD		dwEventMask;
	HANDLE		hEvents[2];	
	int			ret, len, location;
	OVERLAPPED	ov = { 0 };
	char		line[512], *pPos, szTel[32], szTime[32], szMessage[256];
	
	ov.hEvent = CreateEvent(NULL, false, false, NULL);
	hEvents[0] = ov.hEvent;
	hEvents[1] = pSms->m_hStopMonitor;

	while(pSms->m_bMonitor)
	{
		if(pPort->WaitEvents(&dwEventMask, &ov) == -1)
		{
			CloseHandle(ov.hEvent);
			return 0;
		}		
		ret = WaitForMultipleObjects(2, hEvents, false, INFINITE);
		//pPort->SelectEvents(0);
		switch(ret)
		{
		case WAIT_OBJECT_0 + 0:
			if(dwEventMask & EV_RXCHAR)
			{	//new message ???
				if(pPort->ReadLine((PBYTE) line, 1024) > 0)
				{
					if(strcmp(line, "\r\n") == 0 && pPort->ReadLine((PBYTE) line, 1024) > 0)
					{
						len = strlen("+CMTI: ");
						if(strncmp(line, "+CMTI: ", len) == 0)
						{
							pPos = strtok(&line[len], ",\"\r\n");
							pPos = strtok(NULL, ",\"\r\n");
							location = atoi(pPos);

							// set events for call to read_message
							SetEvent(pSms->m_hStoppedEvent);
							SetEvent(pSms->m_hRestartEvent);
							pSms->read_message(location, szTel, szTime, szMessage);							
							ResetEvent(pSms->m_hStopMonitor);
							ResetEvent(pSms->m_hReMonitor);

							CDialog			*pDlg = (CDialog*) AfxGetApp()->GetMainWnd();
							SHORT_MESSAGE	short_message;
							strcpy(short_message.szTel, szTel);
							strcpy(short_message.szTime, szTime);
							strcpy(short_message.szMessage, szMessage);
							pDlg->SendMessage(USERMSG_RECEIVE_SM, (WPARAM) &short_message, 0);
						}
					}
				}
			}
			break;
		case WAIT_OBJECT_0 + 1:
			SetEvent(pSms->m_hStoppedEvent);
			WaitForSingleObject(pSms->m_hReMonitor, INFINITE);			
			SetEvent(pSms->m_hRestartEvent);			
			break;
		}		
		//pPort->SelectEvents();
	}
	CloseHandle(ov.hEvent);
	return 0;
}

⌨️ 快捷键说明

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