天天看点

WINCE如何通过AT指令发短信(支持中文短信)(一)

下面介绍WINCE下面AT指令发送中文短信

1、设置CSCA

int __stdcall setCSCA()
{

   int isOK=-1;

   DWORD dwWritenSize = 0;
   DWORD dwReadSize;
   if(m_serial == INVALID_HANDLE_VALUE)
   {
	   RETAILMSG(1,(TEXT("m_serial == INVALID_HANDLE_VALUE \r")));
	   return isOK;
   }

   CString m_quest("at+csca=\"+8613010200500\"\r");
   //CString m_quest("at+csq\r");
   int j=m_quest.GetLength();
   unsigned char *rel = new unsigned char[50];
   memset(rel,0,sizeof(rel));
   unsigned char *buf = new unsigned char[j];
   for(int i = 0; i < j;i++)
	   buf[i] = (unsigned char)m_quest.GetAt(i);		 /* 转换为单字节字符 */	
   	WriteFile(m_serial,buf,j,&dwWritenSize,NULL);
	Sleep(200);
	if(ReadFile(m_serial,rel,50,&dwReadSize,NULL))
	{
		CString tmp;
		//tmp.Format(_T("%s"),rel);

		DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, NULL, 0); 
		wchar_t *pwText; 
		pwText = new wchar_t[dwNum]; 
		MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, pwText, dwNum);// 开始转换
		tmp = pwText;
		if(tmp.Find(L"OK")!=-1)
			isOK=0;
		//RETAILMSG(1,(TEXT("isOK %d"),isOK));
		delete []pwText;
		
	}
	delete []buf;
	delete []rel;
	return isOK;

}
           

2、设置CMGF

int __stdcall setCMGF()
{
	//return 0;
	int isOK=-1;

	DWORD dwWritenSize = 0;
	DWORD dwReadSize;
	if(m_serial == INVALID_HANDLE_VALUE)
	{
		RETAILMSG(1,(TEXT("m_serial == INVALID_HANDLE_VALUE \r")));
		return isOK;
	}

	CString m_quest=L"at+cmgf=0\r";
	//CString m_quest("at+csq\r");
	int j=m_quest.GetLength();
	unsigned char *rel = new unsigned char[50];
	memset(rel,0,sizeof(rel));
	unsigned char *buf = new unsigned char[j];
	for(int i = 0; i < j;i++)
		buf[i] = (unsigned char)m_quest.GetAt(i);		 /* 转换为单字节字符 */	
	WriteFile(m_serial,buf,j,&dwWritenSize,NULL);
	Sleep(200);
	if(ReadFile(m_serial,rel,50,&dwReadSize,NULL))
	{
		CString tmp;

		DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, NULL, 0); 
		wchar_t *pwText; 
		pwText = new wchar_t[dwNum]; 
		MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, pwText, dwNum);// 开始转换
		tmp = pwText;
		if(tmp.Find(L"OK")!=-1)
			isOK=0;
		delete []pwText;
	}
	delete []buf;
	delete []rel;
	return isOK;
}
           

3、发送短信

int __stdcall sendMessage(const char *strNumber,const char *strContent)
{
    SM_PARAM SmParam;
	int j;
	j=strlen(strNumber);
	if(j < 11)
	{
		return 2;//手机号长度不对
	}
	CString strUnicode;
	WCHAR wchar[1024];
	CString strSmsc=L"8613010200500";
    int nConut=strlen(strContent);
	//RETAILMSG(1,(TEXT("content:%d "),strlen(strContent)));
	if(nConut<=1)
	{
		return 3;
	}
	else if(nConut>140)
	{
		return 4;
	}
	
	char phoneNum[100];
    memset(phoneNum,0,sizeof(phoneNum));
	if(strNumber[0]!='8'&& strNumber[0]!='6')
	{
       phoneNum[0]='8';
	   phoneNum[1]='6';
	   strcpy(phoneNum+2,strNumber);
	}
	else
	{
        strcpy(phoneNum,strNumber);
	}
     
    for(int i=0;i<strSmsc.GetLength();i++)
	{
		SmParam.SCA[i]=strSmsc.GetAt(i);
	}
    strcpy(SmParam.TPA,phoneNum);	
	strcpy(SmParam.TP_UD, strContent);
	//RETAILMSG(1,(TEXT("\r\nTP_UD lenght:%d"),strlen(SmParam.TP_UD)));
	SmParam.TP_PID = 0;
	SmParam.TP_DCS = 8;//使用UCS2编码
	if(setSMS(&SmParam)==0)
	{
		return 0;

	}
	return -1;
	
}
           

4、通过设置短信中心发短信

int __stdcall sendMessage1(const char *strsmsc,const char *strNumber,const char *strContent)

{
	SM_PARAM SmParam;
	int j,m;
	j=strlen(strNumber);
	m=strlen(strsmsc);
	if(j < 11 || m< 11)
	{
		return 2;//手机号长度不对
	}
	CString strUnicode;
	WCHAR wchar[1024];
	//CString strSmsc=L"8613010200500";
	int nConut=strlen(strContent);
	//RETAILMSG(1,(TEXT("content:%d "),strlen(strContent)));
	if(nConut<=1)
	{
		return 3;
	}
	else if(nConut>140)
	{
		return 4;
	}

	char phoneNum[100];
	memset(phoneNum,0,sizeof(phoneNum));
	if(strNumber[0]!='8'&& strNumber[0]!='6')
	{
		phoneNum[0]='8';
		phoneNum[1]='6';
		strcpy(phoneNum+2,strNumber);
	}
	else
	{
		strcpy(phoneNum,strNumber);
	}

	char smcs[100];
	memset(smcs,0,sizeof(smcs));
	if(strsmsc[0]!='8'&& strsmsc[0]!='6')
	{
		smcs[0]='8';
		smcs[1]='6';
		strcpy(smcs+2,strsmsc);
	}
	else
	{
		strcpy(smcs,strsmsc);
	}

	strcpy(SmParam.SCA,smcs);
	strcpy(SmParam.TPA,phoneNum);
	strcpy(SmParam.TP_UD, strContent);
	//RETAILMSG(1,(TEXT("\r\nSmParam.SCA")));
	SmParam.TP_PID = 0;
	SmParam.TP_DCS = 8;//使用UCS2编码
	if(setSMS(&SmParam)==0)
	{
		return 0;

	}
	return -1;

}
           

5、其它用到的函数和结构体

int __stdcall setSMS(SM_PARAM* pSrc)
{


	int nPduLength;		// PDU串长度
	unsigned char nSmscLength;	// SMSC串长度
	int nLength;		// 串口收到的数据长度
	char cmd[16];		// 命令串
	char pdu[512];		// PDU串
	char ans[128];		// 应答串
	int isOK=-1;
	DWORD dwWritenSize = 0;
	DWORD dwReadSize;
	//RETAILMSG(1,(TEXT("setMessage\r")));
	if(m_serial == INVALID_HANDLE_VALUE)
	{
		//RETAILMSG(1,(TEXT("m_serial == INVALID_HANDLE_VALUE \r")));
		return isOK;
	}
	nPduLength = gsmEncodePdu(pSrc, pdu);	// 根据PDU参数,编码PDU串
	strcat(pdu, "\x001a");		// 以Ctrl-Z结束

	gsmString2Bytes(pdu, &nSmscLength, 2);	// 取PDU串中的SMSC信息长度
	nSmscLength++;		// 加上长度字节本身


	// 命令中的长度,不包括SMSC信息长度,以数据字节计
	sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength);	// 生成命令
	//for(int i;i<strlen(cmd);i++)
	//    RETAILMSG(1,(TEXT("%c"),cmd[i]));
	//RETAILMSG(1,(TEXT("\r\n")));
	//for(int j;j<strlen(pdu);j++)
		//RETAILMSG(1,(TEXT("%c"),pdu[j]));
	WriteFile(m_serial,cmd,strlen(cmd),&dwWritenSize,NULL);
	//RETAILMSG(1,(TEXT("%s"),tmp3));
	Sleep(200);
	unsigned char *rel = new unsigned char[1024];
	//	int len;
	memset(rel,0,sizeof(rel));
	if(ReadFile(m_serial,rel,50,&dwReadSize,NULL))
	{
		CString tmp;
		//tmp.Format(_T("%s"),rel);


		DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, NULL, 0); 
		wchar_t *pwText; 
		pwText = new wchar_t[dwNum]; 
		MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel, -1, pwText, dwNum);// 开始转换
		tmp = pwText;
		if(tmp.Find(L">")!=-1)
			{
				WriteFile(m_serial,pdu,strlen(pdu),&dwWritenSize,NULL);
				int counter=0;
				unsigned char *rel1 = new unsigned char[1024];
				while(counter<10)
				{		
					Sleep(300);
					if(ReadFile(m_serial,rel1,200,&dwReadSize,NULL))
					{
						//RETAILMSG(1,(TEXT("ReadFile\r\n")));
						DWORD dwNum3 = MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel1, -1, NULL, 0); 
						wchar_t *pwText3; 
						CString tmp3;
						pwText3 = new wchar_t[dwNum3]; 
						MultiByteToWideChar (CP_ACP, 0, (LPCSTR)rel1, -1, pwText3, dwNum3);// 开始转换
						tmp3 = pwText3;
						//RETAILMSG(1,(TEXT("%s"),tmp3));
						if(tmp3.Find(L"OK")!=-1)
						{
                            
							isOK=0;
						}
						delete []pwText3;
						if(isOK==0)
						{
							break;
						}


					}
					counter++;
				}
				delete []rel1;
		}
		delete []pwText;
	}
	delete []rel;
	return isOK;
}
           

继续阅读