?? mobile.cpp
字號:
//Mobile control class by SkyVense
//If you modified this file, please send a copy to skyvense@online.sh.cn
//Thank you!
//Last modifed 2002-02-29 by SkyVense
// Mobile.cpp: implementation of the CMobile class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Mobile.h"
#include <atlconv.h>
#include <stdio.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMobile::CMobile()
{
cs = NULL;
}
CMobile::~CMobile()
{
}
BOOL CMobile::ReadResponse()
{
char data[1024];
if (!cs) return FALSE;
int len,i;
for (i=0;i<300;i++)
{
len = cs->ReadData(data);
m_LastResponese.Format(_T("%s"),data);
if (len>0) break;
Sleep(100);
}
if (len>0)
{
CString str(data);
m_LastResponese = str;
return TRUE;
}
return FALSE;
}
BOOL CMobile::ConnectMobile(int nPort, int Speed)
{
cs = new CSerial;
return cs->Open(nPort,Speed);
}
void CMobile::DisConnectMobile()
{
cs->PortClose();
}
void CMobile::SendData(char *str)
{
char tosend[1024];
strcpy(tosend,str);
strcat(tosend,"\r");
cs->SendData(tosend,strlen(tosend)+1);
}
BOOL CMobile::CloseEcho()
{
SendData("ATE0");
if (ReadResponse())
{
return AnalysisResponse();
}
return FALSE;
}
BOOL CMobile::AnalysisResponse()
{
int i;
int fi,li;
m_LastResponese.TrimLeft();m_LastResponese.TrimRight();
m_LastResponese += _T("\r\n");
//Dispart:
m_LastQueryResult = _T("");
m_CommandResult = _T("");
for (fi=0,li=0,i=0;fi<m_LastResponese.GetLength();i++)
{
li = m_LastResponese.Find(_T("\r\n"),fi);
if (li<0) break;
if (i==0) m_LastQueryResult = m_LastResponese.Mid(fi,li-fi);
if (i==2) m_CommandResult = m_LastResponese.Mid(fi,li-fi);
fi = li + 1;
}
m_LastQueryResult.TrimLeft();m_LastQueryResult.TrimRight();
m_CommandResult.TrimLeft();m_CommandResult.TrimRight();
if (m_CommandResult.Find(_T("OK"),0)>=0||m_LastQueryResult.Find(_T("OK"),0)>=0) return TRUE;
else if (m_CommandResult.Find(_T("ERROR"),0)>=0||m_LastQueryResult.Find(_T("ERROR"),0)>=0) return FALSE;
else if (m_CommandResult.Find(_T(">"),0)>=0||m_LastQueryResult.Find(_T(">"),0)>=0) return TRUE;
else return FALSE;
return FALSE;
}
CString CMobile::GetMobileFactory()
{
SendData("AT+CGMI");
if (ReadResponse())
{
if (AnalysisResponse())
{
return m_LastQueryResult;
}
}
return _T("");
}
CString CMobile::GetMobileModel()
{
SendData("AT+CGMM");
if (ReadResponse())
{
if (AnalysisResponse())
{
return m_LastQueryResult;
}
}
return _T("");
}
CString CMobile::GetMobileFactorySerial()
{
SendData("AT+GSN");
if (ReadResponse())
{
if (AnalysisResponse())
{
return m_LastQueryResult;
}
}
return _T("");
}
CString CMobile::GetMobileFirmwareVer()
{
SendData("AT+CGMR");
if (ReadResponse())
{
if (AnalysisResponse())
{
return m_LastQueryResult;
}
}
return _T("");
}
CString CMobile::GetMobileIMEI()
{
SendData("AT+CGSN");
if (ReadResponse())
{
if (AnalysisResponse())
{
return m_LastQueryResult;
}
}
return _T("");
}
BOOL GetBit(BYTE bitnum,BYTE data)
{
BOOL IsTrue = FALSE;
switch (bitnum)
{
case 0:
IsTrue = data & 0x01;
break;
case 1:
IsTrue = data & 0x02;
break;
case 2:
IsTrue = data & 0x04;
break;
case 3:
IsTrue = data & 0x08;
break;
case 4:
IsTrue = data & 0x10;
break;
case 5:
IsTrue = data & 0x20;
break;
case 6:
IsTrue = data & 0x40;
break;
case 7:
IsTrue = data & 0x80;
break;
default:
IsTrue = data & 0x01;
break;
}
return IsTrue;
}
BYTE SetBit(BYTE bitnum,BYTE data,BOOL bit)
{
BYTE op;
BYTE t = data;
switch (bitnum)
{
case 0:
op = 0x01;
break;
case 1:
op = 0x02;
break;
case 2:
op = 0x04;
break;
case 3:
op = 0x08;
break;
case 4:
op = 0x10;
break;
case 5:
op = 0x20;
break;
case 6:
op = 0x40;
break;
case 7:
op = 0x80;
break;
default:
op = 0x01;
break;
}
if (bit) t = t | op;
return t;
}
BOOL IfUnicode(char *Text)
{
int i,len;
BYTE data[2048];
len = sizeof(Text);
memcpy(data,Text,len);
for (i=0;i<len;i++)
{
if (GetBit(7,data[i])) return TRUE;
}
return FALSE;
}
int Encode7bitPDU(char *src, char *output)
{
int i,j,k;
BYTE data[512],coded[512];
memcpy(data,src,strlen(src)+1);
for (i=0,j=1;i<(int)strlen(src);i++)
{
if (i%8==0) j--;
coded[j] = data[i] >> ((j) % 7);
for (k=0;k<=j%7;k++)
{
coded[j] = SetBit(7-k,coded[j],GetBit((j%7)-k,data[i+1]));
}
j++;
}
int total = j;
strcpy(output,"");
char str[3];
for (i=0;i<j;i++)
{
sprintf(str,"%.2X",coded[i]);
strcat(output,str);
}
return strlen(src);
}
int EncodeUnicodePDU(char *src, char *output)
{
OLECHAR unicodetext[2048];
BYTE data[2048];
int len,i;
MultiByteToWideChar(CP_ACP, 0, src, -1, unicodetext, 2048);
len = sizeof(unicodetext);
memcpy(data,unicodetext,len);
strcpy(output,"");
char str[5];
for (i=0;;i+=2)
{
if (data[i] == 0) break;
sprintf(str,"%.2X%.2X",data[i+1],data[i]);
strcat(output,str);
}
return (strlen(output)/2);
}
int EncodePDU(char *src, char *output)
{
BOOL bIfUnicode = IfUnicode(src);
if (bIfUnicode)
return EncodeUnicodePDU(src,output);
else
return Encode7bitPDU(src,output);
return 0;
}
int CMobile::EncodeData(
BOOL bNeedReply,
char *PhoneNumber,
char *Text,
char *ret
)
{
BYTE data[2048];
char *LocalText;
char str[1024];
int i,j;
LocalText = new char[2048];
strcpy(LocalText,Text);
if (bNeedReply) strcpy(str,"0031000B81");
else strcpy(str,"0011000B81");
memcpy(data,str,strlen(str));
data[10] = PhoneNumber[1];
data[11] = PhoneNumber[0];
data[12] = PhoneNumber[3];
data[13] = PhoneNumber[2];
data[14] = PhoneNumber[5];
data[15] = PhoneNumber[4];
data[16] = PhoneNumber[7];
data[17] = PhoneNumber[6];
data[18] = PhoneNumber[9];
data[19] = PhoneNumber[8];
data[20] = 'F';
data[21] = PhoneNumber[10];
data[22] = '0';
data[23] = '0';
//Code scheme
BOOL bIfUnicode = IfUnicode(LocalText);
if (bIfUnicode)
{
data[24] = '0';
data[25] = '8';
}
else
{
data[24] = '0';
data[25] = '0';
}
//Expire period:
data[26] = 'A';
data[27] = '7';
char *pdu_output;
pdu_output = new char[2048];
CString tmpstr(Text);
if (bIfUnicode)
{
tmpstr = tmpstr.Left(70);
}
else
{
tmpstr = tmpstr.Left(160);
}
#ifdef _UNICODE
USES_CONVERSION;
LocalText = W2A(tmpstr);
#else
strcpy(LocalText,tmpstr);
#endif
int len = EncodePDU(LocalText,pdu_output);
sprintf(str,"%.2X",len);
data[28] = str[0];
data[29] = str[1];
for (i=0,j=30;i<(int)strlen(pdu_output);i++,j++)
{
data[j] = pdu_output[i];
}
memcpy(ret,data,j);
ret[j] = 26;
j++;
return j;
}
BOOL CMobile::SendSMS(
BOOL bNeedReply,
char *PhoneNumber,
char *Text
)
{
SendData("AT+CMGF=0");
if (!ReadResponse()) return FALSE;
if (!AnalysisResponse()) return FALSE;
SendData("AT+CSMS=0");
if (!ReadResponse()) return FALSE;
if (!AnalysisResponse()) return FALSE;
char data[2048];
int datalen = EncodeData(bNeedReply,PhoneNumber,Text,data);
int validlen = (datalen - 3) / 2;
CString str;
str.Format(_T("AT+CMGS=%d"),validlen);
#ifdef _UNICODE
USES_CONVERSION;
SendData(W2A(str));
#else
SendData((char*)(LPCTSTR)str);
#endif
if (!ReadResponse()) return FALSE;
if (!AnalysisResponse()) return FALSE;
cs->SendData(data,datalen);
if (!ReadResponse()) return FALSE;
if (!AnalysisResponse()) return FALSE;
return TRUE;
}
BOOL CMobile::LockKeypad(BOOL bLock)
{
if (bLock) SendData("AT+CLCK=CS,1");
else SendData("AT+CLCK=CS,0");
if (ReadResponse())
{
return AnalysisResponse();
}
return FALSE;
}
BOOL CMobile::ShutdownMobile()
{
SendData("AT^SMSO");
if (ReadResponse())
{
return AnalysisResponse();
}
return FALSE;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -