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

📄 mobile.cpp

📁 功能介绍:通过COM口或红外线口连接手机发送短信、自动判断中英文进行PDU编码
💻 CPP
字号:
//Mobile control class by SkyVense
//If you modified this file, please send a copy to skyvense@online.sh.cn
//Thank you!


//Last modifed 2002-02-29 by SkyVense


// Mobile.cpp: implementation of the CMobile class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Mobile.h"
#include <atlconv.h>
#include <stdio.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMobile::CMobile()
{
	cs = NULL;
}

CMobile::~CMobile()
{

}

BOOL CMobile::ReadResponse()
{
	char data[1024];
	if (!cs) return FALSE;
	int len,i;
	for (i=0;i<300;i++)
	{
		len = cs->ReadData(data);
		m_LastResponese.Format(_T("%s"),data);
		if (len>0) break;
		Sleep(100);
	}
	if (len>0)
	{
		CString str(data);
		m_LastResponese = str;
		return TRUE;
	}
	return FALSE;
}

BOOL CMobile::ConnectMobile(int nPort, int Speed)
{
	cs = new CSerial;
	return cs->Open(nPort,Speed);
}

void CMobile::DisConnectMobile()
{
	cs->PortClose();
}


void CMobile::SendData(char *str)
{
	char tosend[1024];
	strcpy(tosend,str);
	strcat(tosend,"\r");
	cs->SendData(tosend,strlen(tosend)+1);
}

BOOL CMobile::CloseEcho()
{
	SendData("ATE0");
	if (ReadResponse())
	{
		return AnalysisResponse();
	}
	return FALSE;
}

BOOL CMobile::AnalysisResponse()
{
	int i;
	int fi,li;
	m_LastResponese.TrimLeft();m_LastResponese.TrimRight();
	m_LastResponese += _T("\r\n");
	//Dispart:
	m_LastQueryResult = _T("");
	m_CommandResult = _T("");
	for (fi=0,li=0,i=0;fi<m_LastResponese.GetLength();i++)
	{
		li = m_LastResponese.Find(_T("\r\n"),fi);
		if (li<0) break;
		if (i==0) m_LastQueryResult = m_LastResponese.Mid(fi,li-fi);
		if (i==2) m_CommandResult = m_LastResponese.Mid(fi,li-fi);
		fi = li + 1;
	}
	m_LastQueryResult.TrimLeft();m_LastQueryResult.TrimRight();
	m_CommandResult.TrimLeft();m_CommandResult.TrimRight();

	if (m_CommandResult.Find(_T("OK"),0)>=0||m_LastQueryResult.Find(_T("OK"),0)>=0) return TRUE;
	else if (m_CommandResult.Find(_T("ERROR"),0)>=0||m_LastQueryResult.Find(_T("ERROR"),0)>=0) return FALSE;
	else if (m_CommandResult.Find(_T(">"),0)>=0||m_LastQueryResult.Find(_T(">"),0)>=0) return TRUE;
	else return FALSE;
	return FALSE;
}

CString CMobile::GetMobileFactory()
{
	SendData("AT+CGMI");
	if (ReadResponse())
	{
		if (AnalysisResponse())
		{
			return m_LastQueryResult;
		}
	}
	return _T("");
}

CString CMobile::GetMobileModel()
{
	SendData("AT+CGMM");
	if (ReadResponse())
	{
		if (AnalysisResponse())
		{
			return m_LastQueryResult;
		}
	}
	return _T("");
}

CString CMobile::GetMobileFactorySerial()
{
	SendData("AT+GSN");
	if (ReadResponse())
	{
		if (AnalysisResponse())
		{
			return m_LastQueryResult;
		}
	}
	return _T("");
}

CString CMobile::GetMobileFirmwareVer()
{
	SendData("AT+CGMR");
	if (ReadResponse())
	{
		if (AnalysisResponse())
		{
			return m_LastQueryResult;
		}
	}
	return _T("");
}

CString CMobile::GetMobileIMEI()
{
	SendData("AT+CGSN");
	if (ReadResponse())
	{
		if (AnalysisResponse())
		{
			return m_LastQueryResult;
		}
	}
	return _T("");
}

BOOL GetBit(BYTE bitnum,BYTE data)
{
	BOOL IsTrue = FALSE;
	switch (bitnum)
	{
		case 0:
			IsTrue = data & 0x01;
			break;
		case 1:
			IsTrue = data & 0x02;
			break;
		case 2:
			IsTrue = data & 0x04;
			break;
		case 3:
			IsTrue = data & 0x08;
			break;
		case 4:
			IsTrue = data & 0x10;
			break;
		case 5:
			IsTrue = data & 0x20;
			break;
		case 6:
			IsTrue = data & 0x40;
			break;
		case 7:
			IsTrue = data & 0x80;
			break;
		default:
			IsTrue = data & 0x01;
			break;
	}
	return IsTrue;
}

BYTE SetBit(BYTE bitnum,BYTE data,BOOL bit)
{
	BYTE op;
	BYTE t = data;
	switch (bitnum)
	{
		case 0:
			op = 0x01;
			break;
		case 1:
			op = 0x02;
			break;
		case 2:
			op = 0x04;
			break;
		case 3:
			op = 0x08;
			break;
		case 4:
			op = 0x10;
			break;
		case 5:
			op = 0x20;
			break;
		case 6:
			op = 0x40;
			break;
		case 7:
			op = 0x80;
			break;
		default:
			op = 0x01;
			break;
	}
	if (bit) t = t | op;
return t;
}

BOOL IfUnicode(char *Text)
{
	int i,len;
	BYTE data[2048];
	len = sizeof(Text);
	memcpy(data,Text,len);
	for (i=0;i<len;i++)
	{
		if (GetBit(7,data[i])) return TRUE;
	}
	return FALSE;
}

int Encode7bitPDU(char *src, char *output)
{
	int i,j,k;
	BYTE data[512],coded[512];
	memcpy(data,src,strlen(src)+1);
	
	for (i=0,j=1;i<(int)strlen(src);i++)
	{
		if (i%8==0) j--;
		coded[j] = data[i] >> ((j) % 7);
		for (k=0;k<=j%7;k++)
		{
			coded[j] = SetBit(7-k,coded[j],GetBit((j%7)-k,data[i+1]));
		}
		j++;
	}
	int total = j;

	strcpy(output,"");
	char str[3];
	for (i=0;i<j;i++)
	{
		sprintf(str,"%.2X",coded[i]);
		strcat(output,str);
	}
	return strlen(src);
}

int EncodeUnicodePDU(char *src, char *output)
{
	OLECHAR unicodetext[2048];
	BYTE data[2048];
	int len,i;
	
	MultiByteToWideChar(CP_ACP, 0, src, -1, unicodetext, 2048);
	len = sizeof(unicodetext);
	memcpy(data,unicodetext,len);
	
	strcpy(output,"");
	char str[5];
	for (i=0;;i+=2)
	{
		if (data[i] == 0) break;
		sprintf(str,"%.2X%.2X",data[i+1],data[i]);
		strcat(output,str);
	}
	return (strlen(output)/2);
}

int EncodePDU(char *src, char *output)
{
	BOOL bIfUnicode = IfUnicode(src);
	
	if (bIfUnicode) 
		return EncodeUnicodePDU(src,output);
	else 
		return Encode7bitPDU(src,output);
	
	return 0;
}

int CMobile::EncodeData(
						BOOL bNeedReply,
						char *PhoneNumber,
						char *Text, 
						char *ret
						)
{
	BYTE data[2048];
	char *LocalText;
	char str[1024];
	int i,j;
	LocalText = new char[2048];

	strcpy(LocalText,Text);

	if (bNeedReply) strcpy(str,"0031000B81");
	else			strcpy(str,"0011000B81");
	
	memcpy(data,str,strlen(str));

	data[10] = PhoneNumber[1];
	data[11] = PhoneNumber[0];
	data[12] = PhoneNumber[3];
	data[13] = PhoneNumber[2];
	data[14] = PhoneNumber[5];
	data[15] = PhoneNumber[4];
	data[16] = PhoneNumber[7];
	data[17] = PhoneNumber[6];
	data[18] = PhoneNumber[9];
	data[19] = PhoneNumber[8];
	data[20] = 'F';
	data[21] = PhoneNumber[10];

	data[22] = '0';
	data[23] = '0';
	
	//Code scheme
	BOOL bIfUnicode = IfUnicode(LocalText);
	if (bIfUnicode)
	{
		data[24] = '0';
		data[25] = '8';
	}
	else
	{
		data[24] = '0';
		data[25] = '0';
	}

	//Expire period:
	data[26] = 'A';
	data[27] = '7';

	char *pdu_output;
	pdu_output = new char[2048];

	
	CString tmpstr(Text);

	if (bIfUnicode) 
	{
		tmpstr = tmpstr.Left(70);
	}
	else 
	{
		tmpstr = tmpstr.Left(160);
	}

#ifdef _UNICODE
	USES_CONVERSION;
	LocalText = W2A(tmpstr);
#else
	strcpy(LocalText,tmpstr);
#endif

	int len = EncodePDU(LocalText,pdu_output);
	sprintf(str,"%.2X",len);

	data[28] = str[0];
	data[29] = str[1];

	for (i=0,j=30;i<(int)strlen(pdu_output);i++,j++)
	{
		data[j] = pdu_output[i];
	}
	
	memcpy(ret,data,j);
	ret[j] = 26;
	j++;
	return j;
}

BOOL CMobile::SendSMS(
					BOOL bNeedReply,
					char *PhoneNumber,
					char *Text
					)
{
	SendData("AT+CMGF=0");
	if (!ReadResponse())  return FALSE;
	if (!AnalysisResponse()) return FALSE;
	
	SendData("AT+CSMS=0");
	if (!ReadResponse())  return FALSE;
	if (!AnalysisResponse()) return FALSE;

	char data[2048];
	int datalen = EncodeData(bNeedReply,PhoneNumber,Text,data);
	int validlen = (datalen - 3) / 2;

	CString str;
	str.Format(_T("AT+CMGS=%d"),validlen);

#ifdef _UNICODE	
	USES_CONVERSION;
	SendData(W2A(str));
#else
	SendData((char*)(LPCTSTR)str);
#endif

	if (!ReadResponse())  return FALSE;
	if (!AnalysisResponse()) return FALSE;
	
	cs->SendData(data,datalen);
	if (!ReadResponse())  return FALSE;
	if (!AnalysisResponse()) return FALSE;

	return TRUE;
}

BOOL CMobile::LockKeypad(BOOL bLock)
{
	if (bLock) SendData("AT+CLCK=CS,1");
	else SendData("AT+CLCK=CS,0");
	if (ReadResponse())
	{
		return AnalysisResponse();
	}
	return FALSE;
}

BOOL CMobile::ShutdownMobile()
{
	SendData("AT^SMSO");
	if (ReadResponse())
	{
		return AnalysisResponse();
	}
	return FALSE;
}

⌨️ 快捷键说明

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