?? gsmcontrol.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=# 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 + -