📄 gprs_impl.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=#
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 + -