📄 amusecom.cpp
字号:
// 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 + -