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

📄 amusecom.cpp

📁 模拟手机源程序,做短信系统(源码)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// AmuseCom.cpp : implementation file
//

#include "StdAfx.h"
#include "AmuseCom.h"
#include "SMPProtocol.h"
#include "SMPPAgentDlg.h"
#include "SMSCSocket.h"
#include "SMPPAgent.h"

int g_n112DelayTime;   //add by yan
/////////////////////////////////////////////////////////////////////////////
// CAmuseCom
extern CSMPPAgentApp theApp;

CAmuseCom::CAmuseCom(CSMPPAgentDlg* pcDlg)
{
	int		nDestSMSC;
	char	szServiceNum[10];
	int		nHaveRcvLink,nHaveTrnLink;

	m_pcDlg = pcDlg;

	m_nProfileStat = 0;

	nDestSMSC = GetPrivateProfileInt("SMSC", "电信SMSC", -1,PROFILE_NAME);
	if(nDestSMSC == -1)
	{
		ProfileErr("SMSC","电信SMSC");
		return ;
	}	

	if(nDestSMSC == 1)
	{
		m_nDestSMSC = 1;
		strcpy(m_szDestSMSCKey,"移动SMSC");
	}
	else
	{
		m_nDestSMSC = 2;
		strcpy(m_szDestSMSCKey,"联通SMSC");
	}

	char szTemp[100];
	CString str;
	theApp.m_pMainWnd->GetWindowText(str);
	sprintf(szTemp,"%s---%s",str,m_szDestSMSCKey);

	theApp.m_pMainWnd->SetWindowText(szTemp);


	if(!GetPrivateProfileString(m_szDestSMSCKey, "ServiceNum", NULL, 
			szServiceNum, sizeof(szServiceNum),PROFILE_NAME))
	{
		ProfileErr(m_szDestSMSCKey,"ServiceNum");
		return;
	}

	if(!GetPrivateProfileString(m_szDestSMSCKey, "ServiceNum", NULL, 
			m_szServiceNum, sizeof(m_szServiceNum),PROFILE_NAME))
	{
		ProfileErr(m_szDestSMSCKey,"ServiceNum");
		return;
	}

	nHaveRcvLink = GetPrivateProfileInt(m_szDestSMSCKey, "HaveRcvLink", -1,PROFILE_NAME);
	if(nHaveRcvLink == -1)
	{
		ProfileErr(m_szDestSMSCKey,"HaveRcvLink");
		return;
	}

	nHaveTrnLink = GetPrivateProfileInt(m_szDestSMSCKey, "HaveTrnLink", -1,PROFILE_NAME);
	if(nHaveTrnLink == -1)
	{
		ProfileErr(m_szDestSMSCKey,"HaveTrnLink");
		return;
	}

	m_nProfileStat = 1;

	m_pcSMPProtocol = new CSMPProtocol(m_nDestSMSC,szServiceNum,nHaveRcvLink,nHaveTrnLink);
	m_pcAmuseSocket = new CSMSCSocket(APP_AMUSECOM,this);	

	m_nAmuseStatus = NO_LOGIN_AMUSE;
	m_nSMPPAppStatus = NO_LOGIN_SMPPAPP;

	m_n8102Count = 0;
	m_nSendAmuseSeq = 0;

	m_hEventMapMt = CreateEvent(NULL,FALSE,TRUE,"EVENT_MAP_MT");
	m_hEventMapMtRep = CreateEvent(NULL,FALSE,TRUE,"EVENT_MAP_MTREP");
	m_hEventMapSendAmuse = CreateEvent(NULL,FALSE,TRUE,"EVENT_MAP_SENDAMUSE");
}

CAmuseCom::~CAmuseCom()
{
	delete m_pcSMPProtocol;
	delete m_pcAmuseSocket;
}

int CAmuseCom::SplitRecvMsg(char* szRecvMsg,int nMsgLen)
{
	char szOnePack[MAX_PACKAGE_LNE];
	while(m_cPack.GetPackage(szRecvMsg,szOnePack))
		ProcRecvPackage(szOnePack);

	return strlen(szRecvMsg);
}

int	CAmuseCom::ProcRecvPackage(char* szPackage)
{
	long nCmd,nCmdAckID;

	if(!m_cPack.PullInt(szPackage,&nCmd))
		return 0;
	if(!m_cPack.PullInt(szPackage,&m_nCmdID))
		return 0;
	if(!m_cPack.PullInt(szPackage,&nCmdAckID))
		return 0;

	m_nAmuseTestStatus = 1;
	switch(nCmd)
	{
	case 5000://链路检测响应
		m_nAmuseTestStatus = 1;
		break;

	case 8001://登录请求的响应
		if(nCmdAckID == 0)
			m_nAmuseStatus = LOG_AMUSE_SUCCESS;
		break;

	case 8101://从引擎模块传来的submit请求
		AmuseProc8101(szPackage);
		break;

	case 8102://8102响应
		WaitForSingleObject(m_hEventMapSendAmuse,INFINITE);
		m_cmapSendAmuse.RemoveKey(m_nCmdID);//在8102数据包链表中将相应的键值删除
		SetEvent(m_hEventMapSendAmuse);

	default:
		break;
	}

	return 1;
}


int CAmuseCom::AmuseLogIn()
{
	Print(" ");
	Print("=========================================");
	Print("[LOGIN.]系统正在注册游戏引擎,请稍后...");

	ShowStatus(APP_AMUSECOM + STAT_AMUSE_LINK,0,NULL);

	char szAmuseIP[20],szAmuseSysID[20],szAmusePwd[20];
	int  nAmusePort;

	if(!GetPrivateProfileString("游戏引擎", "IP", NULL, 
			szAmuseIP, sizeof(szAmuseIP),PROFILE_NAME))
	{
		ProfileErr("游戏引擎","IP");
		return 0;
	}

	nAmusePort = GetPrivateProfileInt("游戏引擎", "PORT", 0,PROFILE_NAME);
	if(nAmusePort == 0)
	{
		ProfileErr("游戏引擎","PORT");
		return 0;
	}

	if(!GetPrivateProfileString("游戏引擎", "SYSID", NULL, 
			szAmuseSysID, sizeof(szAmuseSysID),PROFILE_NAME))
	{
		ProfileErr("游戏引擎","SYSID");
		return 0;
	}

	if(!GetPrivateProfileString("游戏引擎", "PWD", NULL, 
			szAmusePwd, sizeof(szAmusePwd),PROFILE_NAME))
	{
		ProfileErr("游戏引擎","PWD");
		return 0;
	}

	char szArea[10];

	if(!GetPrivateProfileString("游戏引擎", "AREA", NULL, 
			szArea, sizeof(szArea),PROFILE_NAME))
	{
		ProfileErr("游戏引擎","AREA");
		return 0;
	}

	if(!GetPrivateProfileString("游戏引擎", "SERVICENUMBER", NULL, 
			m_szSrvNum, sizeof(m_szSrvNum),PROFILE_NAME))
	{
		ProfileErr("游戏引擎","SERVICENUMBER");
		return 0;
	}

	int nTno = GetPrivateProfileInt("游戏引擎", "TNO", 0,PROFILE_NAME);

	if(!m_pcAmuseSocket->SMSConnect(szAmuseIP,nAmusePort))
	{
		Print("[LOGIN.][ERROR]系统游戏连接引擎失败!");
		return 0;
	}

	char szSendMsg[50];
	//if(strcmp(szArea,"00000") == 0)
	//	sprintf(szSendMsg,"8001 0 0 %s %s 1\n",szAmuseSysID,szAmusePwd);	
	//else		
		sprintf(szSendMsg,"8001 0 0 %s %s 1 %s 0 1 %s %d\n",szAmuseSysID,szAmusePwd,szArea,m_szSrvNum,nTno);
	

	//发送8001注册数据包
	if(!m_pcAmuseSocket->SMSCSendMsg(szSendMsg,strlen(szSendMsg)))
	{
		Print("[LOGIN.][ERROR]系统注册游戏引擎失败!");
		return 0;
	}

	long lTimeStart,lTimeNow;
	time(&lTimeStart);	time(&lTimeNow);
	m_nAmuseStatus = NO_LOGIN_AMUSE;
	while(((lTimeNow-lTimeStart) <= LOG_TIMEOUT_SEC)&&(m_nAmuseStatus == NO_LOGIN_AMUSE))
	{
		MSG Msg;
		//通过这个循环将消息(主要是OnReceive)分发到系统消息队列中,使其他消息能够得到处理
		while(PeekMessage(&Msg,NULL,NULL,NULL,PM_REMOVE)) //单线程能够处理其他消息
		{
			TranslateMessage(&Msg);
			DispatchMessage(&Msg);
		}
		Sleep(10);

		time(&lTimeNow);
	}

	//在ProcRecvPackage中更新m_nAmuseStatus
	if(m_nAmuseStatus == NO_LOGIN_AMUSE)
		Print("[LOGIN.][ERROR]系统注册游戏引擎失败!");
	else
	{
		Print("[LOGIN.]系统注册游戏引擎成功!");
		ShowStatus(APP_AMUSECOM + STAT_AMUSE_LINK,1,NULL);
	}

	return m_nAmuseStatus;
}

//处理从[游戏引擎]收到的数据包
int CAmuseCom::AmuseProc8101(char* szMsg)
{
	char szDisMsg[MAX_PACKAGE_LNE];

	char szHandset[30],szSourceNum[30],szValidPeriod[30];
	char szFeeCode[30],szTradeCode[30],szShortMsg[161];
	long nChannelType;

	if(!m_cPack.PullStr(szMsg,szHandset,sizeof(szHandset)))
		return 0;

	if(!m_cPack.PullStr(szMsg,szSourceNum,sizeof(szSourceNum)))
		return 0;
	if(!m_cPack.PullStr(szMsg,szValidPeriod,sizeof(szValidPeriod)))
		return 0;
	if(!m_cPack.PullInt(szMsg,&nChannelType))
		return 0;
	if(!m_cPack.PullStr(szMsg,szFeeCode,sizeof(szFeeCode)))
		return 0;
	if(!m_cPack.PullStr(szMsg,szTradeCode,sizeof(szTradeCode)))
		return 0;
	if(!m_cPack.PullStr(szMsg,szShortMsg,sizeof(szShortMsg)))
		return 0;

//	sprintf(szDisMsg,"[<==AMUSE]8101 %d 0%s",m_nCmdID,szMsg);
	sprintf(szDisMsg,"从[游戏引擎]收到数据包: 类型:[8101    ] , 手机号:%s , 内容:%s",szHandset,szShortMsg);
	Print(szDisMsg);	

	//发送8101数据包的回应
	char szAckMsg[50];
	sprintf(szAckMsg,"8101 %d 0\n",m_nCmdID);
	if(!m_pcAmuseSocket->SMSCSendMsg(szAckMsg,strlen(szAckMsg)))
		return 0;

	//向短信中心提交短信
	SMPPAppSubmit(m_nCmdID,szHandset,szSourceNum,szShortMsg);

	return 1;
}

int	CAmuseCom::AmuseSend8102(char* szSourHandset,char* szServiceNum,char* szShortMsg)
{
	char szSendMsg[MAX_PACKAGE_LEN];	
	int nTno = GetPrivateProfileInt("游戏引擎", "TNO", 0,PROFILE_NAME);
	sprintf(szSendMsg,"8102 %d %d %s %s %d",++m_nSendAmuseSeq,++m_n8102Count,szSourHandset,szServiceNum,nTno);
	m_cPack.PushStr(szSendMsg,szShortMsg);
	m_cPack.PushStr(szSendMsg,m_szSrvNum);
	m_cPack.SetPackageEnd(szSendMsg);

	char szDisMsg[MAX_PACKAGE_LNE];
	//sprintf(szDisMsg,"   [===>AMUSE]%s",szSendMsg);
	sprintf(szDisMsg,"向[游戏引擎]发送数据包: 类型:[8102    ] , 手机号:%s , 内容:%s",szSourHandset,szShortMsg);
	Print(szDisMsg);

	if((m_nAmuseStatus != LOG_AMUSE_SUCCESS)||(!m_pcAmuseSocket->SMSCSendMsg(szSendMsg,strlen(szSendMsg))))
	{
		ShowStatus(APP_AMUSECOM + STAT_AMUSE_LINK,0,NULL);
		SMPPAppSubmit(0,szSourHandset,m_szServiceNum,"网络繁忙,请稍后再试!-C");
		return 0;
	}

	struSENDAMUSE struSendAmuse;
	struSendAmuse.nSendAmuseSeq = m_nSendAmuseSeq;
	strcpy(struSendAmuse.szMsg,szSendMsg);
	struSendAmuse.nSendCount = 1;
	time(&struSendAmuse.lSendTime);

	WaitForSingleObject(m_hEventMapSendAmuse,INFINITE);
	m_cmapSendAmuse.SetAt(m_nSendAmuseSeq,struSendAmuse);
	SetEvent(m_hEventMapSendAmuse);


	return 1;
}

int	CAmuseCom::AmuseSend8103(int nAmuseID,int nStatus)
{
	if(nAmuseID <=0)
		return 0;

	char szSendMsg[MAX_PACKAGE_LEN];
	char szErrorMsg[MAX_PACKAGE_LEN];
	sprintf(szSendMsg,"8103 %d 0 null 1 %d\n",nAmuseID,nStatus);
	
	char szDisMsg[MAX_PACKAGE_LNE];
	sprintf(szDisMsg,"   [===>AMUSE]%s",szSendMsg);
	Print(szDisMsg);
	if((nStatus!=0)&&((nStatus!=7)))
	{	
		sprintf(szErrorMsg,"[ERROR] 8103 ERROR , THE MT_ID IS %d ,THE STATUS IS %d .\r\n",nAmuseID,nStatus);
		Print(szErrorMsg);
	}
	if(!m_pcAmuseSocket->SMSCSendMsg(szSendMsg,strlen(szSendMsg)))
		return 0;

	return 1;
}

int	CAmuseCom::SMPPAppSubmit(int nAmuseID,char* szDestHandset,char* szSourceAddress,char* szShortMsg)
{
	char	szMsg[1000];
	int		nMsgLen;

	strcpy(szMsg,szShortMsg);	
	nMsgLen = strlen(szMsg);

	m_pcSMPProtocol->StrToUnicode(szMsg,&nMsgLen);

	//如果短信超长
	if(nMsgLen >140)
	{	
		AmuseSend8103(nAmuseID,16);
		return 0;
	}

	CSMPProtocol::struSMPPSUBMIT struSmppSubmit;
	memset(&struSmppSubmit,0,sizeof(struSmppSubmit));

	//填充提交短信的格式
	strcpy(struSmppSubmit.szServiceType,"");
	//struSmppSubmit.nSourceAddressTon = BYTE(2);	//2001-12-18
	//struSmppSubmit.nSourceAddressNpi = BYTE(0);
	struSmppSubmit.nSourceAddressTon = BYTE(1);	//2001-12-18
	struSmppSubmit.nSourceAddressNpi = BYTE(1);
	strcpy(struSmppSubmit.szSourceAddress,szSourceAddress);
	
	//struSmppSubmit.nDestAddressTon = BYTE(2);
	//struSmppSubmit.nDestAddressNpi = BYTE(0);
	struSmppSubmit.nDestAddressTon = BYTE(2);
	struSmppSubmit.nDestAddressNpi = BYTE(1);
	strcpy(struSmppSubmit.szDestAddress,szDestHandset);

	struSmppSubmit.nEsmClass = BYTE(0);
	struSmppSubmit.nProtocolID = BYTE(0);
	struSmppSubmit.nPriorityFlag = BYTE(0);

	struSmppSubmit.nRegisteredDeliveryflag = BYTE(1);
	struSmppSubmit.nReplaceIfPresentFlag = BYTE(0);
	struSmppSubmit.nDataCoding = BYTE(8);
	struSmppSubmit.nSmDefaultMsgID = BYTE(0);

	struSmppSubmit.nSmLength = strlen(szShortMsg);
	strcpy(struSmppSubmit.szShortMessageText,szShortMsg);

	DWORD dwSubmitID = m_pcSMPProtocol->SMPPSubmit(struSmppSubmit);

	struMTSTATUS struMtStatus;

	struMtStatus.dwSubmitID = dwSubmitID;//提交短信的流水号
	struMtStatus.dwMessageID = 0;//短消息ID
	struMtStatus.nAmuseID = nAmuseID;//m_nCmdID命令序号即MT流水号
	struMtStatus.nHaveSend = 1;

	if( dwSubmitID >= 0x80000000 )//如果dwSubmitID是负值(发送不成功)
	{
		struMtStatus.dwSubmitID = -dwSubmitID;
		struMtStatus.nHaveSend = 0;	

⌨️ 快捷键说明

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