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

📄 smsoper.cpp

📁 PDA通讯网关服务器源码程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SmsOper.cpp: implementation of the CSmsOper class.
//
//////////////////////////////////////////////////////////////////////
//write by lyq,2/5/2005 
#include "stdafx.h"
#include "SmsOper.h"
#include "windows.h"
#include <iostream>
#include <stdio.h>
#include "direct.h"
#include "PublicBase.h"

/*
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
*/
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

extern int g_iSendPudDataTime;
//CRITICAL_SECTION    m_ComOperCritical;

CSmsOper::CSmsOper()
{
	
}

CSmsOper::~CSmsOper()
{

}

/*
// 从列表中解析出全部短消息
// 输入: pMsg - 短消息列表缓冲区
// 输出: pMsg - 短消息缓冲区
// 返回: 大于0则为短消息条数
int CSmsOper::OnRecvSms(int hCom,SM_PARAM* pMsg)
{
	//do with what the program received from serial device.
	char chBack[5000]={0};
	int nLength=OnReadCommOkErr(hCom,chBack,sizeof(chBack));
	if (nLength==0)
	{
		return -1;
	}

	char *pchFirst=strstr(chBack,"+CMTI:");
	if (pchFirst==NULL)
	{
		return -3;
	}

	char *token = strtok(chBack, ",");
	while( token != NULL )
	{
		token = strtok( NULL, "," );
		if (token==NULL)
		{
			break;
		}
	}
	char chCmd[20]={0};
	sprintf(chCmd,"AT+CMGR=%s",token);
	DoAtCmd(hCom,chCmd);
	memset(chBack,0x00,sizeof(chBack));
	nLength=OnReadCommOkErr(hCom,chBack,sizeof(chBack));

	sscanf(token, "%d", &pMsg->index);	// 读取序号

	char *pdest = strstr(chBack, "\r\n");	// 找下一行
	if (pdest==NULL) return -1;
	
	int nSartPdu = pdest - chBack + 1;
	char chPdu[5000]={0};
	strcpy(chPdu,&chBack[nSartPdu]);
	m_cSmsCode.gsmDecodePdu(chPdu, pMsg);	// PDU串解码
	return 0;
}
*/


// 从列表中解析出全部短消息
// 输入: pMsg - 短消息列表缓冲区
// 输出: pMsg - 短消息缓冲区
// 返回: 大于0则为短消息条数
int CSmsOper::OnRecvSms(int hCom,SM_PARAM* pMsg)
{
	//use in testing,读写所有的消息
//	DoAtCmd(hCom,"AT+CMGL=4");
	//读出新的消息
	DoAtCmd(hCom,"AT+CMGL=0");

	//do with what the program received from serial device.
	char chBack[5000]={0};
	int nLength=OnReadCommOkErr(hCom,chBack,sizeof(chBack));
	if (nLength==0)
	{
		return -1;
	}

	char *pchFirst=strstr(chBack,"+CMGL:");
	if (pchFirst==NULL)
	{
		pchFirst=strstr(chBack,"CMT");
		if (pchFirst!=NULL)
		{
			return OnParseAllSmsCMT(pMsg,chBack);
		}
		return -3;
	}

	//解析所有的短信
	return OnParseAllSms(pMsg,chBack);
}


//执行at命令的函数
//输入参数:at命令
void CSmsOper::DoAtCmd(int hCom,char *pchAtCmd)
{
	int nCmdLen=strlen(pchAtCmd)+3;
	char *pchCmd;
	pchCmd=new char[nCmdLen];

	memset(pchCmd,'\0',nCmdLen);
	strcpy(pchCmd, pchAtCmd);
	strcat(pchCmd, "\r\n");
	OnWriteComm(hCom,pchCmd,nCmdLen); 
	if (pchCmd!=NULL)
	{
		delete[] pchCmd;
		pchCmd=NULL;
	}	

}

// 从列表中删除指定的短消息
// 输入: hCom表示从哪个com接口接收的数据,nIndex哪条指定的消息
// 返回: 0表示成功,-1表示失败
int CSmsOper::OnDeleteAppointed(int hCom,int nIndex)
{
	char chCmd[16] = {0};
	sprintf(chCmd,"AT+CMGD=%d", nIndex);
	DoAtCmd(hCom,chCmd);

	//do with what the program received from serial device.
	char chBack[1000]={0};
	int nLength=OnReadComm(hCom,chBack,sizeof(chBack));
	if (nLength==0)
	{
		return -1;
	}
	// 根据能否找到"\r\n> "决定成功与否
	if(strstr(chBack, "OK") !=NULL)
	{
		return 0;
	}
	else
	{
		return -1;
	}
}

// All READ, SENT and UNSENT messages are deleted
// 输入: hCom表示从哪个com接口删除的数据
// 返回: 0表示成功,-1表示失败
int CSmsOper::OnDeleteReadAndSend(int hCom)
{
	DoAtCmd(hCom,"AT+CMGD=1,3");

	//do with what the program received from serial device.
	char chBack[200]={0};
	int nLength=OnReadComm(hCom,chBack,sizeof(chBack));
	if (nLength==0)
	{
		return -1;
	}
	// 根据能否找到"\r\n> "决定成功与否
	if(strstr(chBack, "OK") !=NULL)
	{
		return 0;
	}
	else
	{
		return -1;
	}
}


// 从列表中解析出全部短消息
// 输入: ptr - 短消息列表缓冲区
// 输出: pMsg - 短消息缓冲区
// 返回: 短消息条数
int CSmsOper::OnParseAllSms(SM_PARAM* pMsg, char *ptr)
{
	int nMsg=0;			// 短消息计数值
	// 循环读取每一条短消息, 以"+CMGL:"开头
	while((ptr = strstr(ptr, "+CMGL:")) != NULL)
	{
		ptr += 6;		// 跳过"+CMGL:", 定位到序号
		sscanf(ptr, "%d", &pMsg->index);	// 读取序号
//		TRACE("  index=%d\n",pMsg->index);

		ptr = strstr(ptr, "\r\n");	// 找下一行
		if (ptr != NULL)
		{
			ptr += 2;		// 跳过"\r\n", 定位到PDU
			
			m_cSmsCode.gsmDecodePdu(ptr, pMsg);	// PDU串解码

			pMsg++;		// 准备读下一条短消息
			nMsg++;		// 短消息计数加1
		}
	}
	return nMsg;
}


// 从列表中CMT消息解析出全部短消息
// 输入: ptr - 短消息列表缓冲区
// 输出: pMsg - 短消息缓冲区
// 返回: 短消息条数
int CSmsOper::OnParseAllSmsCMT(SM_PARAM* pMsg, char *ptr)
{
	int nMsg=0;			// 短消息计数值
	// 循环读取每一条短消息, 以"+CMGL:"开头
	while((ptr = strstr(ptr, "+CMT:")) != NULL)
	{
		ptr = strstr(ptr, "\r\n");	// 找下一行
		if (ptr != NULL)
		{
			ptr += 2;		// 跳过"\r\n", 定位到PDU
			
			m_cSmsCode.gsmDecodePdu(ptr, pMsg);	// PDU串解码

			pMsg++;		// 准备读下一条短消息
			nMsg++;		// 短消息计数加1
		}
	}
	return nMsg;
}

//得到短信中心号码
int CSmsOper::OnGetSmsCenterNum(int hCom,char *pchOut)
{

	DoAtCmd(hCom,"AT+CSCA?");
	//do with what the program received from serial device.
	char chBack[1000]={0};
	int nLength=OnReadCommOkErr(hCom,chBack,sizeof(chBack));
	if (nLength==0) return -1;
	//没有成功的响应
//	if (strstr(chBack, "OK") ==NULL) return -1;
	char chCenterMobileNumm[20]={0};

	char *pdest;
	int  result=0;
	pdest = strstr( chBack, "+86" );
	if (pdest==NULL) return -1;
	result = pdest - chBack + 1;
	memset(chCenterMobileNumm,'\0',sizeof(chCenterMobileNumm));
	memcpy(chCenterMobileNumm,chBack+result,13);
	memcpy(pchOut,chCenterMobileNumm,15);
	
	return 0;
}

//初始化短信at命令
int CSmsOper::OnSetInit(int hCom)
{
	char chBack[128]={0};// 应答串
	// 测试GSM-MODEM的存在性
	//DoAtCmd(hCom,"AT");
	OnWriteComm(hCom,"at\r",3); 
//	if (OnReadBack(hCom,chBack,sizeof(chBack),"OK","ERROR",3)<0) return -1;
	OnReadComm(hCom,chBack,sizeof(chBack));
	if (strstr(chBack, "OK") == NULL)  return -1;

	// ECHO OFF
	DoAtCmd(hCom,"ATE0");
	OnReadComm(hCom,chBack,sizeof(chBack));

	// PDU模式
	DoAtCmd(hCom,"AT+CMGF=0");
	OnReadComm(hCom,chBack,sizeof(chBack));

	DoAtCmd(hCom,"AT+CMEE=1");
	OnReadComm(hCom,chBack,sizeof(chBack));	 

//	DoAtCmd(hCom,"AT+CNMI=2,2,0,0,0");
//	OnReadComm(hCom,chBack,sizeof(chBack));	
	
	return 0;
}

// 发送短消息,仅发送命令,不读取应答
// 输入: pSrc - 源PDU参数指针
int CSmsOper::OnSendSms(int hCom,SM_PARAM* pSrc,int nType)
{
	int nPduLength;		// PDU串长度
	unsigned char nSmscLength;	// SMSC串长度
	int nLength;		// 串口收到的数据长度
	char cmd[16];		// 命令串
	char pdu[512];		// PDU串
	nPduLength = m_cSmsCode.gsmEncodePdu(pSrc, pdu,nType);	// 根据PDU参数,编码PDU串
//test
//CPublicBase cPub;

	strcat(pdu, "\x01a");		// 以Ctrl-Z结束
//cPub.OnWriteLog(pdu);
	m_cSmsCode.gsmString2Bytes(pdu, &nSmscLength, 2);	// 取PDU串中的SMSC信息长度
//cPub.OnWriteLog(pdu);
	nSmscLength++;		// 加上长度字节本身

	// 命令中的长度,不包括SMSC信息长度,以数据字节计
	sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength);	// 生成命令
//cPub.OnWriteLog(cmd);
	// 得到肯定回答,继续输出PDU串
	OnWriteComm(hCom,cmd, strlen(cmd));
	//DoAtCmd(hCom,cmd);	// 先输出命令串
	char chBack[128]={0};// 应答串
	nLength=OnReadComm(hCom,chBack,sizeof(chBack));
	if (strstr(chBack, "ERROR")!=NULL) return -1;
	if(nLength != 4) return -1;
	// 得到肯定回答,继续输出PDU串
	OnWriteComm(hCom,pdu, strlen(pdu));		
//cPub.OnWriteLog(pdu);
	memset(chBack,0x00,sizeof(chBack));
	Sleep(g_iSendPudDataTime);
	int iLen=OnReadCommOkErr(hCom,chBack,sizeof(chBack));
	//没有成功的响应
	if (strstr(chBack, "ERROR")!=NULL) return -1;
/*
//update
	long LastSaveBillTime=time(NULL);
	//循环接受通讯终端的数据
	while(1)
	{
		int iLen=OnReadComm(hCom,chBack,sizeof(chBack));
		if (strstr(chBack, "OK")!=NULL)
		{
			break;
		}
		if (strstr(chBack, "ERROR")!=NULL &&(strstr(chBack, "304")!=NULL) )
		{
			return -1;
			break;
		}
		if(time(NULL) - LastSaveBillTime >= 10)
		{
			return -1;
			break;
		}
	}
*/
	return 1;
}

//获得产品序列号
// 输入参数: pchSerial - 获取产品序列号
const char* CSmsOper::OnGetSerialNo(int hCom)
{
	const char* pchSerial;
	DoAtCmd(hCom,"AT+CGSN");
	//do with what the program received from serial device.
	char chBack[100]={0};
	int nLength=OnReadComm(hCom,chBack,sizeof(chBack));
	if (nLength==0) return NULL;
	//没有成功的响应
	if (strstr(chBack, "OK") ==NULL) return NULL;

	char chSerialNo[50];
	memset(chSerialNo,'\0',sizeof(chSerialNo));
	memcpy(chSerialNo,chBack+2,13);
	pchSerial=chSerialNo;
	return pchSerial;
}

//得到生产厂家的信息
// 输入参数: pchManufacturer - 获取厂家信息
const char* CSmsOper::OnGetManufacturer(int hCom)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -