📄 gsmmodem.cpp
字号:
//打开lvl文件,加入新图层
fileName=_T("..\\Data\\");
fileName+=mapname;
fileName+=_T(".lvl");
//AfxMessageBox(fileName);
// tempfile.Open(fileName,CFile::modeReadWrite);
int ContentNo=0;
tempfile.Remove(fileName);
if(tempfile.Open(fileName,CFile::modeReadWrite)==NULL)//新的文件
{
tempfile.Open(fileName,CFile::modeReadWrite|CFile::modeCreate);
}
else
{
char Content[21];
tempfile.Read(&ContentNo,sizeof(int));
for(i=0;i<ContentNo;i++)
{
tempfile.Read(&ContentNo,sizeof(int));
tempfile.Read(Content,sizeof(char)*21);
if(strcmp(Content,lvlname)==0)
{
nReturn=2;
tempfile.Close();
return nReturn;
}
}
}
ContentNo++;
tempfile.SeekToBegin();
tempfile.Write(&ContentNo,sizeof(int));
tempfile.SeekToEnd();
tempfile.Write(&ContentNo,sizeof(int));
tempfile.Write(lvlname,sizeof(char)*21);
tempfile.Close();
}
else//已有文件
{
//覆盖原有文件
recordfile.Close();
recordfile.Remove(fileName);
//fileName=g_SysStatus->strCurDirect;
//fileName+=_T("\\temp\\tempmsg.tmp");//写入此临时文件
tempfile.Open(fileName,CFile::modeCreate|CFile::modeReadWrite);
tempfile.Write(buffer,strlen(buffer));
tempfile.Close();
//tempfile.Open(fileName,CFile::modeReadWrite);
}
nReturn=2;
}
}
//文本格式
else
{
}
return nReturn;
}
////////////////////////////////////////////////////////////////////////////////
//功能:SIM卡短消息的使用的情况
//history: name data remarks
// wanfangjie 2003.09.09 create
//参数说明 int& nUsedNum=0;//已用的个数
// int& nTotalNum=0;
//返回值:若用完返回0 否者返回1
////////////////////////////////////////////////////////////////////////////////
int CGsmModem::SmsNumInSIM(int& nUsedNum,int& nTotalNum)
{
int nTimeOut=0;
int nDataLen=0;
int nReturn=0;
char *pFirst=NULL;
int nLimtNum=0;
char pTemp[16];
nTotalNum=0;
nUsedNum=0;
//清读缓冲区
ClearCommBuf(0);
//发送在SIM卡上短消息使用的情况
SendATCmd("AT+CPMS?\r");
while(nTimeOut<100)
{
nDataLen=GetCommEvent(0);
if(nDataLen>0)
{
ReadDataFromPort(m_pReadPool,nDataLen,1);
pFirst=strstr(m_pReadPool,"+CPMS");
if(pFirst!=NULL)
{
//跳过+CPMS:和空格
pFirst+=strlen("+CPMS: ");
//跳过"SM"
pFirst+=strlen("SM")+2;
//跳过逗号
pFirst+=1;
//已用的个数
nLimtNum=0;
while(nLimtNum<15)
{
if(pFirst[nLimtNum]==',')
{
break;
}
pTemp[nLimtNum]=pFirst[nLimtNum];
nLimtNum++;
}
pTemp[nLimtNum]=0;
nUsedNum=atoi(pTemp);
//总容量
pFirst+=nLimtNum;
//跳过逗号
pFirst+=1;
nLimtNum=0;
while(nLimtNum<15)
{
if(pFirst[nLimtNum]==',')
{
break;
}
pTemp[nLimtNum]=pFirst[nLimtNum];
nLimtNum++;
}
pTemp[nLimtNum]=0;
nTotalNum=atoi(pTemp);
}
break;
}//end of if(nDataLen!=0)
DelayTimer(100);
nTimeOut++;
}
if(nTotalNum==nUsedNum&&nTotalNum!=0)
{
return 0;
}
return 1;
}
////////////////////////////////////////////////////////////////////////////////
//功能:设置中心服务号码
//history: name data remarks
// wanfangjie 2003.09.11 create
//参数说明 char *pCenterNum 中心服务号码
// nType 0 查看中心号码,1设置中心号码
//返回值:若用完返回0 否者返回1
////////////////////////////////////////////////////////////////////////////////
int CGsmModem::OperCenterNum(char *pCenterNum,int nType)
{
int nTimeOut=0;
int nDataLen=0;
//SendATCmd("AT+CSCA?\r");
SendATCmd("AT+CSCA=+8613800371500\r");
nTimeOut=0;
while(nTimeOut<100)
{
nDataLen=GetCommEvent(0);
if(nDataLen>0)
{
ReadDataFromPort(m_pReadPool,nDataLen,1);
}
DelayTimer(100);
nTimeOut++;
}
return 1;
}
////////////////////////////////////////////////////////////////////////////////
//功能:显示SIM卡上短消息的状态
//history: name data remarks
// wanfangjie 2003.09.11 create
//参数说明 int nType 0 接受到未读的短消息
// 1 接受到已读的短消息
// 2 存储未发送的短消息
// 3 存储发送的短消息
// 4 所有短消息
// int *pSmsIndex 存放SIM卡中短消息的序号
//返回值 SIM卡中短消息的个数
////////////////////////////////////////////////////////////////////////////////
int CGsmModem::ShowMsgState(int nType,int *pSmsIndex)
{
int nTimeOut=0;
int nLastDataLen=0;
int nNextDataLen=0;
int nJumpLen=0;
int nIndex=0;
char *pFirst=NULL;
char *pTempPool=NULL;
char *pReadPool=NULL;
int nSmsNum=0;
//根据nType,发送AT命令
pReadPool=new char[1024*1024];
nSmsNum=0;
switch(nType)
{
case 0:
SendATCmd("AT+CMGL=0\r");
break;
case 1:
SendATCmd("AT+CMGL=1\r");
break;
case 2:
SendATCmd("AT+CMGL=2\r");
break;
case 3:
SendATCmd("AT+CMGL=3\r");
break;
case 4:
SendATCmd("AT+CMGL=4\r");
break;
default:
SendATCmd("AT+CMGL=0\r");
break;
}
nTimeOut=0;
while(nTimeOut<500)
{
nLastDataLen=GetCommEvent(0);
DelayTimer(100);
nNextDataLen=GetCommEvent(0);
nTimeOut++;
if(nNextDataLen==nLastDataLen)
{
ReadDataFromPort(pReadPool,nNextDataLen,1);
pFirst=strstr(pReadPool,"+CMGL:");
while(pFirst)
{
pFirst+=strlen("+CMGL:");
nIndex=SmsCharToInt(pFirst,',',nJumpLen);
pFirst+=nJumpLen;
pSmsIndex[nSmsNum++]=nIndex;
pTempPool=pFirst;
pFirst=strstr(pTempPool,"+CMGL:");
}
break;
}//结束读取
}
delete []pReadPool;
return nSmsNum;
}
////////////////////////////////////////////////////////////////////////////////
//功能:把SMS中的字符变为数字
//history: name data remarks
// wanfangjie 2003.09.16 create
//参数说明 char *pPool 输入的字符数组
// char cEndChar 结束标志字符
// int &nJumpLen 到标志字符跳过的长度
////////////////////////////////////////////////////////////////////////////////
int CGsmModem::SmsCharToInt(char *pPool, char cEndChar,int &nJumpLen)
{
int nIntValue=0;
int nLoopMaxNum=31;
nJumpLen=0;
char pTemp[32];
pTemp[0]=0;
while(nJumpLen<nLoopMaxNum)
{
if(pPool[nJumpLen]==cEndChar)
{
break;
}
pTemp[nJumpLen]=pPool[nJumpLen];
nJumpLen++;
}
pTemp[nJumpLen]=0;
nIntValue=atoi(pTemp);
return nIntValue;
}
///////////////////////////////////////////////////////////////////////////
//功能:发送数字键
//history: name data remarks
// wanfangjie 2003.09.18 create
//参数说明 char *pKey 输入的数字
///////////////////////////////////////////////////////////////////////////
int CGsmModem::SendNumKey(char *pKey)
{
char pAtCmd[32];
strcpy(pAtCmd,"at+vts=");
strcat(pAtCmd,pKey);
strcat(pAtCmd,"\r");
SendATCmd(pAtCmd);
return 1;
}
////////////////////////////////////////////////////////////////////////////////
//功能:读SMS中的字符
//history: name data remarks
// wanfangjie 2003.09.16 create
//参数说明 char *pSrc 输入的字符数组
// char *pDest 结果
// int &nJumpLen 到标志字符跳过的长度
////////////////////////////////////////////////////////////////////////////////
int CGsmModem::ReadSmsStr(char *pSrc, char *pDest, char cEndChar)
{
int nLoopMaxNum=31;
int i=0;
for(i=0;i<nLoopMaxNum;i++)
{
if(pSrc[i]==cEndChar)
{
break;
}
pDest[i]=pSrc[i];
}
pDest[i]=0;
if(i==nLoopMaxNum)
{
return 0;
}
else
{
return 1;
}
}
////////////////////////////////////////////////////////////////////////////////
//功能:读SMS中第nSmsIndex短消息
//history: name data remarks
// wanfangjie 2003.09.16 create
//参数说明 int nSmsIndex 短消息在SIM卡中的索引
////////////////////////////////////////////////////////////////////////////////
SHORTMSGINFO* CGsmModem::ReadIndexSms(int nSmsIndex)
{
//为短消息信息结构赋值
m_pShortMsgInfo->nMsgLen=0;
m_pShortMsgInfo->MsgData[0]=0;
m_pShortMsgInfo->nMsgType=0x00;
m_pShortMsgInfo->pSrcPhoneNum[0]=0;
m_pShortMsgInfo->pTime[0]=0;
ReadMsgFromSIM(nSmsIndex,m_pReadPool);
DecodeShortMsg(m_pReadPool,1);
//删除短消息
//DeleteShortMsg(nSmsIndex);
return m_pShortMsgInfo;
}
////////////////////////////////////////////////////////////////////////////////
//功能:删除所有短消息
//history: name data remarks
// wanfangjie 2003.09.16 create
////////////////////////////////////////////////////////////////////////////////
int CGsmModem::DeleteAllMsg()
{
int pSmsIndex[128];
int nNum=0;
int i=0;
CString strSmsMsg;
nNum=ShowMsgState(4,pSmsIndex);
for(i=0;i<nNum&&i<128;i++)
{
DeleteShortMsg(pSmsIndex[i]);
}
return 1;
}
int CGsmModem::GetCovLength(char *buffer, int nLength)
{
//本身是宽字节,进行转换
int nWCS = 0;
int i;
for (i = 0; i <= nLength;i+=2)
{
if (buffer[i] > 128)
{
nWCS++;
}
}
char *pContentText;
nLength -= nWCS;
pContentText = new char[nLength];
for (i = 0; i <= nLength;i++)
{
if (buffer[i] > 128)
{
pContentText[i] = buffer[i];
i++;
pContentText[i] = buffer[i];
}
else
{
pContentText[i] = buffer[i];
i++;
}
}
buffer = pContentText;
return nLength;
}
int CGsmModem::SaveMsgFile2(TCHAR *pathName)
{
int nReturn=1;
// TCHAR pStartName[64];
// TCHAR pEndName[64];
// long nFlag=0;
// char nPos=0;
// CFile msgFile;
// m_cGSMProtocol.StrCopy(pStartName,pathName);
// m_cGSMProtocol.StrCopy(pEndName,pathName);
// //数据格式
// int nMsgIndex = -1;
// if((m_pShortMsgInfo->nMsgType==0x015)&&(m_pShortMsgInfo->nMsgLen>0))
// {
// //得到了短信息,判断是否是同一个短消息
// int nFor;
// for (nFor = 0; nFor <= M_MAXMSGNUMBER; nFor++)
// {
// long lFlag;
// lFlag = ReadLong(m_pShortMsgInfo->MsgData);
// if (m_SaveMsg[nFor].nCount == -1) //接受到的第一个包
// {
//
// m_SaveMsg[nFor].nFlag = lFlag; //得到当前的标志
// nMsgIndex = nFor;
// break;
// }
//
// if (m_SaveMsg[nFor].nFlag == lFlag)
// {
// nMsgIndex = nFor;
// break;
// }
// }
//
// if (nMsgIndex == -1) //同时接受了超过最大数目的手机
// {
// return 1; //扔掉这个数据包
// }
//
// //取出短消息的数目
// m_SaveMsg[nMsgIndex].nCount = m_pShortMsgInfo->MsgData[4];
//
// //取出当前的模块
// int nCurrent;
// nCurrent = m_pShortMsgInfo->MsgData[5] - 1;
//
// //得到当前数据,设置数据标志
// m_SaveMsg[nMsgIndex].msg[nCurrent] = new char[m_pShortMsgInfo->nMsgLen - 6];
//
// //位移6个字节,前六个字节为其他的数据,前4个为标志码
// memcpy(m_SaveMsg[nMsgIndex].msg[nCurrent],m_pShortMsgInfo->MsgData+6,m_pShortMsgInfo->nMsgLen - 6);
// m_SaveMsg[nMsgIndex].bAccess[nCurrent] = TRUE;
// m_SaveMsg[nMsgIndex].nLength[nCurrent] = m_pShortMsgInfo->nMsgLen - 6;
//
// if (GetMsgComplete(nMsgIndex)) //所有短消息全部接受成功
// {
// //得到文件名和图层名称,文件名称和文件长度放在第一个包里面
// short nFileNameLength;
// int type;
// memcpy(&nFileNameLength,m_SaveMsg[nMsgIndex].msg[0],sizeof(short));
//
// char *cFileName;
// cFileName = new char[nFileNameLength+1];
// cFileName[nFileNameLength]=0;
// memcpy(cFileName,m_SaveMsg[nMsgIndex].msg[0] + sizeof(short),nFileNameLength);
//
// //更新第一条消息的信息
// m_SaveMsg[nMsgIndex].nLength[0] -= sizeof(short) + nFileNameLength;
//
// char *cTemp;
// cTemp = new char[m_SaveMsg[nMsgIndex].nLength[0]];
//
// //保存数据
// memcpy(cTemp,m_SaveMsg[nMsgIndex].msg[0]+sizeof(short)+nFileNameLength,m_SaveMsg[nMsgIndex].nLength[0]);
//
// delete m_SaveMsg[nMsgIndex].msg[0];
// m_SaveMsg[nMsgIndex].msg[0] = new char[m_SaveMsg[nMsgIndex].nLength[0]];
//
// memcpy(m_SaveMsg[nMsgIndex].msg[0],cTemp,m_SaveMsg[nMsgIndex].nLength[0]);
//
// delete cTemp;
//
// //从cFileName中取得地图名和图层名
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -