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

📄 cmpplib.cpp

📁 中国移动的短信网关程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "CmppLib.h"
#include "TcpLib.h"
#include "MD5Checksum.h"
#include "share.h"
static int g_nCMPPClientHandle = -1;
static CTcpClient g_rCMPPClient;

static time_t g_tOldTime = 0;
static int	g_tActiveTestTimeval = 30;

extern char g_sSpNumber[];
extern char g_sPrefixNumber[];

static char g_sSmscIP[18] = {0x00};
static int g_nSmscPort;
static char g_sSpID[8] = {0x00};
static char g_sSpPWD[8] = {0x00};
static UINT g_nSeqId;
BOOL g_bSmscConnectionActive;

static UINT g_nReConnectTimes=1;

extern void SmgTrace(int, char *, ...);
//extern int Trace(char *szFormat, ...);
extern void SmgProcessCMPPPacket(TCmppPacket rPacket);

static void CMPP_UnpackMsgHead(TCmppHead *prMsgHead, char *sBuf)
{
	char	*ptr;
	UINT	lval;

	ptr = sBuf;
	memcpy(&lval, ptr, 4);
	prMsgHead->nTotalLen = ntohl(lval);
	ptr += 4;

	memcpy(&lval, ptr, 4);
	prMsgHead->nCommandId = ntohl(lval);
	ptr += 4;

	memcpy(&lval, ptr, 4);
	prMsgHead->nSeqId = ntohl(lval);
}

static int SendPacketToMISC(char *sBuf, int nLen)
{
	int nRet = 0;
 	nRet = g_rCMPPClient.SendMsg(g_nCMPPClientHandle, sBuf, nLen);
	if(nRet == 104)
		g_bSmscConnectionActive = FALSE;
	return nRet;
}

void CMPP_SendTerminateReq()
{
	TCmppHead rCmppHead;

	memset(&rCmppHead, 0x00, sizeof(TCmppHead));
	rCmppHead.nTotalLen = htonl(sizeof(TCmppHead));
	rCmppHead.nSeqId = htonl(g_nSeqId++);
	rCmppHead.nCommandId = htonl(CMPP_TERMINATE);

	SendPacketToMISC((char *)&rCmppHead, sizeof(TCmppHead));
}

void CMPP_SendTerminateRep(unsigned int nSeqId)
{
	TCmppHead rCmppHead;

	memset(&rCmppHead, 0x00, sizeof(TCmppHead));
	rCmppHead.nTotalLen = htonl(sizeof(TCmppHead));
	rCmppHead.nSeqId = htonl(nSeqId);
	rCmppHead.nCommandId = htonl(CMPP_TERMINATE_RESP);

	SendPacketToMISC((char *)&rCmppHead, sizeof(TCmppHead));
}

void CMPP_SendActiveTestReq()
{
	TCmppHead rCmppHead;

	memset(&rCmppHead, 0x00, sizeof(TCmppHead));
	rCmppHead.nTotalLen = htonl(sizeof(TCmppHead));
	rCmppHead.nSeqId = htonl(g_nSeqId++);
	rCmppHead.nCommandId = htonl(CMPP_ACTIVE_TEST);

	SendPacketToMISC((char *)&rCmppHead, sizeof(TCmppHead));
}

void CMPP_SendActiveTestRep(unsigned int nSeqId)
{
	TCmppHead rCmppHead;

	memset(&rCmppHead, 0x00, sizeof(TCmppHead));
	rCmppHead.nTotalLen = htonl(sizeof(TCmppHead));
	rCmppHead.nSeqId = htonl(nSeqId);
	rCmppHead.nCommandId = htonl(CMPP_ACTIVE_TEST_RESP);

	SendPacketToMISC((char *)&rCmppHead, sizeof(TCmppHead));
}

void CMPP_SendDeliverRep(char *sMsgId, unsigned int nSeqId)
{
	TCmppPacket rPacket;

	int nPacketLen = sizeof(TCmppHead) + sizeof(TCmppDeliverRep);

	memset(&rPacket, 0x00, sizeof(TCmppPacket));

	rPacket.rMsgHead.nTotalLen = htonl(nPacketLen);
	rPacket.rMsgHead.nSeqId = htonl(nSeqId);
	rPacket.rMsgHead.nCommandId = htonl(CMPP_DELIVER_RESP);

#ifndef CMPP_VERSION_20
	rPacket.rMsgBody.rDeliverRep.nResult = htonl(0);
	memcpy(rPacket.rMsgBody.rDeliverRep.sMsgId, sMsgId, MAX_MSG_ID_LEN);
	SendPacketToMISC((char *)&rPacket, nPacketLen);
#else
	rPacket.rMsgBody.rDeliverRep.nResult = 0;
	memcpy(rPacket.rMsgBody.rDeliverRep.sMsgId, sMsgId, MAX_MSG_ID_LEN);
	SendPacketToMISC((char *)&rPacket, nPacketLen); // cmpp2.0的deliverrep的包结果为1字节
#endif
}

int  CMPP_Connect(char *sSpId, char *sSpPwd)
{
	int nRet = 0;
	TCmppPacket rPacket;
	char *p;
	int nPacketLen = sizeof(TCmppHead) + sizeof(TCmppConnectReq);

	struct tm rTm;
	time_t nTime;
	char sTmp[16];
	char sAuth[128];

	memset(sTmp, 0x00, 16);
	memset(sAuth, 0x00, 128);
	memset(&rPacket, 0x00, sizeof(TCmppPacket));

	strcpy(g_sSpID, sSpId);
	strcpy(g_sSpPWD, sSpPwd);
	
	rPacket.rMsgHead.nTotalLen = htonl(nPacketLen);
	rPacket.rMsgHead.nCommandId = htonl(CMPP_CONNECT);
	rPacket.rMsgHead.nSeqId = htonl(g_nSeqId++);
	strcpy(rPacket.rMsgBody.rConnectReq.sSpId, sSpId);

	time(&nTime);
	memcpy(&rTm,localtime(&nTime), sizeof(tm));
	sprintf(sTmp, "%02d%02d%02d%02d%02d", rTm.tm_mon+1, rTm.tm_mday, rTm.tm_hour, rTm.tm_min, rTm.tm_sec);	

	p = sAuth;
	strcpy(p, sSpId), p += strlen(sSpId);
	p += 9;
	strcpy(p, sSpPwd), p += strlen(sSpPwd);
	strncpy(p, sTmp, 10), p += 10;
	CMD5Checksum::GetMD5((unsigned char *)sAuth, p-sAuth,
		(unsigned char *)rPacket.rMsgBody.rConnectReq.sAuthenticatorSource);
	
#ifndef CMPP_VERSION_20
	rPacket.rMsgBody.rConnectReq.nVersion = 0x30;
#else
	rPacket.rMsgBody.rConnectReq.nVersion = 0x20;
#endif

	rPacket.rMsgBody.rConnectReq.nTimeStamp = htonl(atol(sTmp));
	nRet = SendPacketToMISC((char *)&rPacket, nPacketLen);

	return nRet;
}

void CMPP_SendQureyReq(char * sServiceId, char *sTime, unsigned char nQueryType)
{
	TCmppPacket rPacket;

	int nPacketLen = sizeof(TCmppHead) + sizeof(TCmppQueryReq);

	memset(&rPacket, 0x00, sizeof(TCmppPacket));

	rPacket.rMsgHead.nTotalLen = htonl(nPacketLen);
	rPacket.rMsgHead.nSeqId = htonl(g_nSeqId++);
	rPacket.rMsgHead.nCommandId = htonl(CMPP_QUERY);

	if(sServiceId != NULL)
		strcpy(rPacket.rMsgBody.rQueryReq.sQueryCode, sServiceId);
	rPacket.rMsgBody.rQueryReq.nQueryType =  nQueryType;
	strcpy(rPacket.rMsgBody.rQueryReq.sTime, sTime);

	SendPacketToMISC((char *)&rPacket, nPacketLen);
}

void CMPP_SendCancelReq(char *sMsgId)
{
	TCmppPacket rPacket;

	int nPacketLen = sizeof(TCmppHead) + sizeof(TCmppCancelReq);

	memset(&rPacket, 0x00, sizeof(TCmppPacket));

	rPacket.rMsgHead.nTotalLen = htonl(nPacketLen);
	rPacket.rMsgHead.nSeqId = htonl(g_nSeqId++);
	rPacket.rMsgHead.nCommandId = htonl(CMPP_CANCEL);

	memcpy(rPacket.rMsgBody.rCancelReq.sMsgId, sMsgId, MAX_MSG_ID_LEN);

	SendPacketToMISC((char *)&rPacket, nPacketLen);
}


int  CMPP_SendSubmitReq(unsigned int *pnSeqId,
						char *sMsgId,
						unsigned char nPkTotal,
						unsigned char nPkNumber,
						unsigned char nRegister,
						unsigned char nMsgLevel,
						char *sServiceId,
						unsigned char nFeeUserType,
						char *sFeeTerminalId,
						unsigned char nFeeTerminalType,
						unsigned char nTPPid,
						unsigned char nTPUdhi,
						unsigned char nMsgFmt,
						char *sSpId,
						unsigned char nFeeType,
						char *sFeeCode,
						char *sSrcTerminalId,
						unsigned char nDstAddrNumber,
						char *sDstTerminalId,
						unsigned char nDstTerminalType,
						unsigned char nMsgLen,
						char *sMsgContent,
						char *sLinkId)
{
	int nTmpValue=0;
	char sItem[2048];
	char *p;
	int nRet = 0;
	
	memset(sItem, 0x00, 2048);
	p = sItem;

	p += 4;

	nTmpValue = htonl(CMPP_SUBMIT);
	memcpy(p, &nTmpValue, 4), p += 4;
	*pnSeqId = g_nSeqId;
	nTmpValue = htonl(g_nSeqId++);
	memcpy(p, &nTmpValue, 4), p += 4;

	if(sMsgId == NULL)
		p += MAX_MSG_ID_LEN;
	else
		memcpy(p, sMsgId, MAX_MSG_ID_LEN), p += MAX_MSG_ID_LEN;
	*p++ = nPkTotal;
	*p++ = nPkNumber;
	*p++ = nRegister;
	*p++ = nMsgLevel;
	if( sServiceId != NULL)
		strcpy(p, sServiceId), p += MAX_SERVICE_ID_LEN;
	else
		p += MAX_SERVICE_ID_LEN;
	*p++ = nFeeUserType;
	
#ifndef CMPP_VERSION_20
	if(sFeeTerminalId != NULL)
		strcpy(p, sFeeTerminalId), p += MAX_FEE_TERMINALID_LEN;
	else
		p += MAX_FEE_TERMINALID_LEN;
	*p++ = nFeeTerminalType;
#else
	if(sFeeTerminalId != NULL)
		strcpy(p, sFeeTerminalId), p += MAX_SRC_TERMINALID_LEN;
	else

⌨️ 快捷键说明

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