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

📄 gsmcontrol.cpp

📁 嵌入式pxa 270平台上的GPS和GSM通信实验
💻 CPP
字号:
#include "gsmcontrol.h"#include <qmessagebox.h>#include <qstring.h>#include  <stdio.h>      #include  <stdlib.h>     #include  <unistd.h>     #include  <sys/types.h> GsmControl::GsmControl(){       serialfd=-1;      pSerial =new Serial();}GsmControl::~GsmControl(){   // delete receiver;}int GsmControl::Open(int index, int nBaud){    if(serialfd)    {	pSerial->closePort(serialfd);	serialfd=-1;    }    serialfd=pSerial->openPort(index);    if(serialfd)    	pSerial->setPara(serialfd, nBaud,8,1,0);     return serialfd;    }void GsmControl::Close(){    if(serialfd)    {	pSerial->closePort(serialfd);	serialfd=-1;    }		}void GsmControl::InitGPRS()	{        int len=0;    char *ATE0="ATE0\r\n";    char *CNMI="AT+CNMI=1,1,0,0,1\r\n";    char *CMGF="AT+CMGF=0\r\n";    if(serialfd>0)    {	len=::strlen(ATE0);	if(pSerial->nwrite(serialfd, ATE0,len)!=len)	    QMessageBox::information(NULL,"information","write Error"); 	//::sleep(1);	len=::strlen(CNMI);  	if(pSerial->nwrite(serialfd, CNMI,len)!=len)	   QMessageBox::information(NULL,"information","write Error");  	//::sleep(1);	len=::strlen(CMGF);  		if(pSerial->nwrite(serialfd, CMGF,len)!=len)	    QMessageBox::information(NULL,"information","write Error");        }    else	QMessageBox::information(NULL,"information","Open port first");	}void GsmControl::DeleteMessage( QString strMsgIndex){    char *enter="\r\n";    if(serialfd>0)    {	const char *chCmd;			QString strCmdDele="AT+CMGD="+strMsgIndex;	strCmdDele+=enter;			chCmd=strCmdDele.latin1();	int len=::strlen(chCmd);	pSerial->nwrite( serialfd, chCmd, len);    }  }QString GsmControl::ProcessMessage( QString strMsg){    char *strmb="From: ";    char *strdd="Time: ";     char *strcontent="Content: ";			    QString ctrlouttmp;    QString strupper;    //const char *ctrlout;    int n, nPDULength, i, len ;    QString strData,strSrc,strDes,nType,strPDULength;    QString strnumber , strdate, strnumtmp, strdatetmp;    const char *charPDULength;    QString messagecontent;				    // find the last "," first    n = strMsg.findRev(',');				    // get the PDU data length    strPDULength = strMsg.mid(n+1,2);    charPDULength=strPDULength.latin1();          nPDULength=(*charPDULength-48)*10;    nPDULength+=*(charPDULength+1)-48;        // get the TPDU content    strData = strMsg.mid(n+23,nPDULength*2);			    // get the mobile phone number    strnumber=strData.mid(6,14);	//modify 6,12    // decode the mobile phone number    len=strnumber.length();    for(i=0;i<len-2;i=i+2)		    {	strnumtmp+=strnumber.mid(i+1,1);	strnumtmp+=strnumber.mid(i,1);    }    strnumtmp+=strnumber.mid(i+1,1);		    // 1. add the decoded mobile phone number into the message content    messagecontent+=QString( strmb+strnumtmp+"\n" );		    // get the date and time    strdate=strData.mid(24,12);	//22,12    len=strdate.length();    // decode the date and time    for(i=0;i<len;i=i+2)		    {	strdatetmp+=strdate.mid(i+1,1);	strdatetmp+=strdate.mid(i,1);	if(i<4)	    strdatetmp+="-";	if(i==4)	    strdatetmp+="  ";	if((i>4)&&(i<10))	    strdatetmp+=":";    }	    // 2. add the decoded date & time into the message content    messagecontent+=QString( strdd+strdatetmp+"\n" );				    nType=strData.mid(22,2);//20,2    // get the content string    strSrc = strData.mid(40,(nPDULength-19)*2);  	//			    if(nType.find("00",false)>=0)	// 7 bits decoding	strDes=Bit7Decode(strSrc);    else	// PDU decoding ( it's what we use in this contest )	strDes=DecToUnicode(strSrc); 	    strDes=strDes.lower();    // 3. add the decoded date & time into the message content    messagecontent+=QString(strcontent+strDes+"\n");			   //return strDes;    return messagecontent;    }void GsmControl::ReadMessage( QString strMsgIndex){    char *enter="\r\n";    if(serialfd>0)    {	const char *chCmd;			QString strCmdRead="AT+CMGR="+strMsgIndex;	strCmdRead+=enter;			chCmd=strCmdRead.latin1();	int len=::strlen(chCmd);	pSerial->nwrite( serialfd, chCmd, len);    }      }QString GsmControl::PreSendMessage( QString strSendMsg, QString strPhoneNumber, QString strServerNumber){    // define the Message content    char *chMsgHead0="089168";    char *charMsgHead1="11000B81";           char *chMsgTail="0008AA";    char *enter="\r\n";    char esc=0x1A;    	    QString strEncodeMsg="";      QString strSendTemp="";    if ( serialfd>0 )    {			// add the message head first	strSendTemp=chMsgHead0;		// encode the SMS server number 	strSendTemp+=NumberConversion(strServerNumber);/*	int length=strServerNumber.length(); 	int i;		for(i=0;i<length-1;i=i+2)	{		    strSendTemp+=strServerNumber.mid(i+1,1);	    strSendTemp+=strServerNumber.mid(i,1);	}	strSendTemp+="F";	strSendTemp+=strServerNumber.mid(i,1);*/		strSendTemp+=charMsgHead1;		// encode the mobilephone number 	strSendTemp+=NumberConversion(strPhoneNumber);	/*length=strPhoneNumber.length(); 	for(i=0;i<length-1;i=i+2)	{		    strSendTemp+=strPhoneNumber.mid(i+1,1);	    strSendTemp+=strPhoneNumber.mid(i,1);	}	strSendTemp+="F";	strSendTemp+=strPhoneNumber.mid(i,1);	*/			// add the message tail	strSendTemp+=chMsgTail; 			// encode the message content	strEncodeMsg=ToUnicode(strSendMsg); 			// get the whole encoded ready sent message data length except for the SMS Center number	bool ok;	int Msglen;	Msglen=strEncodeMsg.mid(0,2).toInt(&ok ,16);    	Msglen+=14;								strSendTemp+=strEncodeMsg;		strSendTemp+=esc;  				strSendTemp+=enter;							QString sendata=QString("AT+CMGS=%1").arg(Msglen);     	sendata+=enter;    	const char *send=sendata.latin1();    	int len=::strlen( send );    			pSerial->nwrite( serialfd, send, len); 					return strSendTemp; 	    }    return strSendTemp;}QString GsmControl::NumberConversion(QString strNumber){    QString strTempNumber;    int length=strNumber.length();     int i;	    for(i=0;i<length-1;i=i+2)    {		strTempNumber+=strNumber.mid(i+1,1);	strTempNumber+=strNumber.mid(i,1);    }    strTempNumber+="F";    strTempNumber+=strNumber.mid(i,1);    return strTempNumber;    }void GsmControl::SendMessage(QString strSendMsg){    const char *sendata=strSendMsg.latin1();    int len=::strlen(sendata);    if(serialfd>0)		pSerial->nwrite( serialfd,sendata,len );         }QString GsmControl::DecToUnicode(QString strSrc){	int strlength;	QString strMsgtmp,str0;	bool ok;	QString strMsgout;	ushort num;	strlength=strSrc.length();	const ushort *data;	for(int i=0;i<strlength;i=i+4)	{	    str0=strSrc.mid(i,4);	    num=str0.toUShort(&ok,16);	    data=&num;	    strMsgtmp=strMsgtmp.setUnicodeCodes(data,1);	    strMsgout+=strMsgtmp;		}	return strMsgout;}QString GsmControl::ToUnicode( QString strSrc ){		const QChar *qchar;	QChar test;	QString str0;	QString strout;	ushort num;	qchar=strSrc.unicode();	int strlength=strSrc.length()*2;	const char *buffer;	QString qstrlen;	qstrlen=qstrlen.setNum(strlength,16);   	buffer=qstrlen.latin1();		if (::strlen(buffer)==2)	{		strout=*buffer++;		strout+=*buffer;	} 	else	{		strout='0';		strout+=*buffer;	}    	for(int i=0;i<strlength/2;i++)	{		test=(QChar)*qchar++;		num=test.unicode();		if(num<255)			strout+="00";	   		str0=str0.setNum(num,16);		strout+=str0;	}  	return strout;}QString GsmControl::Bit7Decode(QString &strSrc){	unsigned char pDst[4096]; 	char pSrc[4096]; 	int i, length;		int strlength=strSrc.length(); 	for(i=0;i<strlength;i++) 	{ 		pSrc[i]=strSrc.at(i).latin1(); 		}	 	for(i=0;  i<strlength;i=i+2) 	{ 		char c[2]; 		char *p; 		unsigned long t; 		c[0]=pSrc[i]; 		c[1]=pSrc[i+1]; 		t=strtoul (c,&p,16); 		pDst[i/2]=t;   	}	 	length=GSMDecode7bit(pDst,pSrc,strlength/2);	QString textout=pSrc; 	return textout;}int GsmControl::GSMDecode7bit( const unsigned char *pSrc, char *pDst, int nSrcLength ){	int nSrc=0;  	int nDst=0;  	int nByte=0;  	unsigned char nLeft=0; 	while(nSrc<nSrcLength)	{	    *pDst = ((*pSrc << nByte) | nLeft) & 0x7f;	    nLeft = *pSrc >> (7-nByte);		    pDst++;	    nDst++;	    nByte++;	    if(nByte == 7)	    {		*pDst = nLeft ;		pDst++;		nDst++;		nByte = 0;		nLeft = 0;	    }	    pSrc++;	    nSrc++;	}		*pDst = 0;	return nDst; }

⌨️ 快捷键说明

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