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

📄 gprs_impl.cpp

📁 一个linux下的用QT2编写的关于gprs的发短信,拨打电话的源码
💻 CPP
字号:
#include "gprs_impl.h"
#include "gprs.h"

/************************************************************************/
gprs_impl::gprs_impl( QWidget* parent,  const char* name, bool modal, WFlags fl ,int _fd)
    : gprs( parent, name, modal, fl ),fd(_fd)
{
	//system init!
	if(fd!=0)
	{
		Txt_State->insertLine("Serial port already open.",-1);
	}
	isinit=0;
	BRead=0;
        BSend=0;
        BNew=0;
	BInit=0;
	BRing=0;
	initAT();
	InitPic();	
    // signals and slots connections
	
//	QObject::connect( TimerRead, SIGNAL(timeout()), this, SLOT(read_timeout_slot()) );
	QObject::connect(Btn_Close,SIGNAL(clicked () ),this,SLOT(close_slot()));
	QObject::connect(Btn_Open,SIGNAL(clicked () ),this,SLOT(open_slot()));
	QObject::connect(Btn_Send,SIGNAL(clicked () ),this,SLOT(send_slot()));
	QObject::connect(Btn_Call,SIGNAL(clicked () ),this,SLOT(call_slot()));
}

/************************************************************************/
gprs_impl::~gprs_impl()
{

}


/************************************************************************/
void gprs_impl::InitPic()
{
	QString strPicDir="/pic/";
	Btn_Close->setPixmap(QPixmap (strPicDir+"1_exit.png"));
	Btn_Open->setPixmap(QPixmap (strPicDir+"1_open.png"));
	Btn_Call->setPixmap(QPixmap (strPicDir+"1_call.png"));
	Btn_Send->setPixmap(QPixmap (strPicDir+"1_send.png"));
	BackImg->setPixmap(QPixmap (strPicDir+"msm.png"));
}

/************************************************************************/
void gprs_impl::initAT()
{	
	if(isinit==1)//check if init
		return;
	if(fd==0)
	{
		if((fd=MySerial::open_port(fd,2))<0){
               		 Txt_State->insertLine("Open port error",-1);
               		 return;
        	}
		else
			Txt_State->insertLine("Open port success",-1);

	        if((MySerial::set_opt(fd,9600,8,'N',1))<0){
        	        Txt_State->insertLine("Set port error",-1);
                	return;
		}
		else
                	Txt_State->insertLine("Set port success",-1);
	}
		memset(buff,0,sizeof(buff));

		TimerRead = new QTimer;
	        TimerRead->start( 200, FALSE );
		QObject::connect( TimerRead, SIGNAL(timeout()), this, SLOT(read_timeout_slot()) );


		MySerial::nwrite(fd,"AT+CSCA?\r\n",sizeof("AT+CSCA?\r\n"));
		BInit=1;
		read_timeout_slot();
		isinit=1;
}

/************************************************************************/
void gprs_impl::open_slot()
{
	QString s_tmp=Txt_TargetNum->text();
	if(s_tmp=="ALL"||s_tmp=="all")
	{
		MySerial::nwrite(fd,"AT+CMGL=4\r\n",sizeof("AT+CMGL=4\r\n"));
	}
	else if(s_tmp=="NEW"||s_tmp=="new")
	{	
		MySerial::nwrite(fd,"AT+CMGL=0\r\n",sizeof("AT+CMGL=0\r\n"));
	}
	else
		ReadMessage(Txt_TargetNum->text());
}

/************************************************************************/
void gprs_impl::call_slot()
{
	call_impl *w=new call_impl(0,0,0,0,fd);
	w->show();
}

/************************************************************************/
void gprs_impl::close_slot()
{
	close();
	qApp->quit();
//	QMessageBox::information( this, "New call","Do you want to answer?\n","ok","no",0,0,1 );
//	BRead=1;
//	ReadMsg("0011000D91683176116125F0000801064F60597DFF01");
//	ReadMsg("0891683158706100F011000B815129563107F30008AA0c00680065006c006c006f0021");
//	Txt_State->insertLine(PreSendMessage("hello!" , "15926513703","13850716000") ,-1);
}

/************************************************************************/
void gprs_impl::send_slot()
{
	
//	init strServerNumber

	QString strSendMsg=Txt_HostMsg->text();
	QString strMobilephonenumber=Txt_TargetNum->text();
    
	if(strMobilephonenumber.length()!=11)
	{
		QMessageBox::information(this,"information","Moble Phone Number is error!"+strMobilephonenumber);
		return;
    	}
	if(strServerNumber.length()!=11)
   	{
		QMessageBox::information(this,"information","SMS Server Number is error!"+strServerNumber);
		return;
    	}
    
    	if(strSendMsg.isEmpty())
    	{
		QMessageBox::information(this,"information","Message content is empty!"+strSendMsg);
		return;
    	}
	if(fd)
    	{
		strEncodeMsg=PreSendMessage(strSendMsg , strMobilephonenumber,strServerNumber) ;
		BSend=TRUE;
    	}
}

/************************************************************************/
QString gprs_impl::PreSendMessage(QString strSendMsg, QString strPhoneNumber, QString strServerNumber)
{
	char *chMsgHead0="089168";
    	char *charMsgHead1="11000B81";
       
    	char *chMsgTail="0008AA";
    	char *enter="\r\n";
    	char esc=0x1A;    
	
    	strEncodeMsg="";  
    	QString strSendTemp="";
    	if ( fd>0 )
    	{		
	// add the message head first
	strSendTemp=chMsgHead0;	
	// encode the SMS server number 
	strSendTemp+=NumberConversion(strServerNumber);

	strSendTemp+=charMsgHead1;
	
	// encode the mobilephone number 
	strSendTemp+=NumberConversion(strPhoneNumber);
	
	// 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 );    		
	MySerial::nwrite( fd, send, len);
    }
    return strSendTemp;
}

/************************************************************************/
QString gprs_impl::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;
}

/************************************************************************/
QString gprs_impl::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;
}


/************************************************************************/
void gprs_impl::read_timeout_slot()
{
	if(fd)
    	{
		if(read(fd,buff,sizeof(buff))!=0)
		{
		       // printf("%s",buff);//for debug
		        Txt_State->insertLine(buff,-1);
		        Txt_State->setCursorPosition(Txt_State->numLines(),0,FALSE);
	       		ReadMsg(QString(buff));
			memset(buff,0,sizeof(buff));
		}
	}	
}

/************************************************************************/
void gprs_impl::ReadMsg(QString strRecv)
{	
	if(BRead)
	{
		BRead=0;
		QString strNum;
		strMsgContent=ProcessMessage(strRecv,strNum);
		Txt_HostMsg->insertLine(strNum);
		Txt_TargetMsg->insertLine(strMsgContent);
		Txt_State->insertLine("read success");   //for debug
	}
	if(BInit)
	{
		int ITmp=strRecv.find("+CSCA: \"+86", false);
		if(ITmp>0 )
		{
	    		BInit=FALSE;
			strServerNumber=strRecv.mid(ITmp+sizeof("+CSCA: \"+86")-1,11);
			Txt_State->insertLine("Init success"+strServerNumber);
			Txt_HostNum->setText(strServerNumber);
		}
		else
			Txt_State->insertLine("Init fail");
	}
	if(BSend)
	{
		BSend=0;
		const char *sendata=strEncodeMsg.latin1();
	 	int len=strlen(sendata);
		if(fd>0)
			MySerial::nwrite( fd,sendata,len );
                Txt_State->insertLine("send success");
		strEncodeMsg="";
	}
	if(strRecv.find("+CMTI",false)>=0)
	{
		int index=strRecv.find(",");		
		QString msgIndex=strRecv.mid(index+1,2);	
		BRead=TRUE;
		Txt_State->insert("New Message arrive\n");
//		BNew=TRUE;		
		ReadMessage(msgIndex);
	}
	if(strRecv.find("RING",false)>=0)
	{
		if(BRing==1)
			return;
		BRing=1;
		if(0==QMessageBox::information( this, "New call","Do you want to answer?\n","ok","no",0,0,1 ))
		{
			MySerial::nwrite( fd,"ATA\r\n",sizeof("ATA\r\n") );
		}
		else
			MySerial::nwrite( fd,"ATH\r\n",sizeof("ATH\r\n") );
		
		BRing=0;
	}
}

/************************************************************************/
void gprs_impl::ReadMessage(QString strMsgIndex)
{
	if(fd>0)
    	{
		BRead=1;
		const char *chCmd;		
		QString strCmdRead="AT+CMGR="+strMsgIndex;
		strCmdRead+="\r\n";		
		chCmd=strCmdRead.latin1();
		int len=::strlen(chCmd);
		MySerial::nwrite( fd, chCmd, len);
    	} 
}

/************************************************************************/
QString gprs_impl::ProcessMessage(QString strMsg,QString &strNum)
{
    char *strdd="Time: "; 
    char *strcontent="Content: ";			
    QString ctrlouttmp;
    QString strupper;
    int n, nPDULength, i, len ;
    QString strData,strSrc,strDes,nType,strPDULength;
    QString strnumber , strdate, strnumtmp, strdatetmp;
    const char *charPDULength;
    QString messagecontent;				

    n = strMsg.findRev(',');			
	
    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);	
	strNum=strnumtmp;		
    // 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;
}

/************************************************************************/
QString gprs_impl::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 gprs_impl::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 gprs_impl::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 + -