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

📄 gsmmodem.cpp

📁 使用gsm收发短信的方式传递文件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				//打开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 + -