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

📄 cmppapi.cpp

📁 中国移动的短信网关程序
💻 CPP
字号:
#include "stdafx.h"
#include "CmppLib.h"
#include "TimerAdmin.h"
#include "SmGateway.h"

extern void SubmitPacketToSmsc(int , TSmgSubmitReq);
extern int SendMsgToUnicomMoClient(int nHandle, char *sBuf, int nLen);
extern void SendAlarmMsgToSupporter(char *sDstAddr, char *sServiceId, char *sContent, int nMsgLen);
extern void SendMonitorMsg(int nMoniType, char *sMonMsg);

extern void SmgTrace(int, char *, ...);
extern int g_nInterfaceType;
extern char g_sSpNumber[];
extern CTimerQueue g_rTimerQueue;
extern char g_sPrefixNumber[];
extern unsigned char g_nSmgNodeId;
extern UINT g_nMOCounts;
extern char g_sChatNumber[];
extern int g_nInerChatUserBeginId;
extern int g_nInerChatUserEndId;

static void ProcessReportReq(TCmppPacket rPacket)
{
	UINT nSeqId=0;
	int nStat=0;
	char sSrcTerminalId[32] = {0x00};
	char sTmp[1024] = {0x00};
	char sMsgId[24] = {0x00};
	TCmppReportMsg rCmppReportMsg;

	memset(&rCmppReportMsg, 0x00, sizeof(TCmppReportMsg));

	CMPP_PraseReport(rPacket.rMsgBody.rDeliverReq.sMsgContent, &rCmppReportMsg);

	strcpy(sMsgId, rCmppReportMsg.sMsgId);
	strcpy(sSrcTerminalId, rCmppReportMsg.sDstTerminalId);
	nStat = rCmppReportMsg.nState;
	nSeqId = rCmppReportMsg.nSeqId;

	SmgTrace(0, (char *)"Receive ReportReq from SMSC,UserAddr=%s,State=%d,SeqId=%d",
		sSrcTerminalId, nStat, nSeqId);

	sprintf(sTmp, "RP:%d%s%d%s%s%s%d%s", 
		nSeqId, SPACE_MARK, nStat, SPACE_MARK,sSrcTerminalId, SPACE_MARK,
		time(NULL), SPACE_MARK);
	strcat(sTmp, sMsgId);
	WriteSmsCDR(sTmp);
//	SendMonitorMsg(MONI_CDR_INFO, sTmp);
	
}
static void ProcessSubmitRespone(TCmppPacket rPacket) 
{
    int nIndex;
    int nRet;
	UINT nSeqId;
    unsigned int nResult;
    TSmgSubmitRep rSubmitRep;
	TMsgHead rMsgHead;
	TSmgPacket rSmgPacket;
    char sMsgId[65] = {0x00};
	char sTmp[2048] = {0x00};

	memset(&rMsgHead, 0x00, sizeof(TMsgHead));
	memset(&rSmgPacket, 0x00, sizeof(TSmgPacket));

    memset(&rSubmitRep, 0x00, sizeof(TSmgSubmitRep));
 	nSeqId = rPacket.rMsgHead.nSeqId;
	nResult = rPacket.rMsgBody.rSubmitRep.nResult;


    nIndex = FindSmscChannelBySeqId(nSeqId);
    if(0 > nIndex)
    {
		SmgTrace(0, (char *)"Error: received CMPP_SUBMIT_REP event, SeqId=0x%08x, Result=%d", nSeqId, nResult);
        SmgInitSmscChannel(nIndex);
		return;
    }

    if(g_rSmgChan[nIndex].ucStat == IDLE)
    {
		SmgTrace(0, (char *)"Error: Id-%03d is in idle stat", nIndex);
		return;
    }


    // construct the TWWSubmitRep and sent it to client
    rMsgHead.nCmdId = SMG_SubmitRep;
    rMsgHead.nChannelId = nIndex;
	rMsgHead.nLinkId = g_rSmgChan[nIndex].nHandle;
    rSubmitRep.ucActionType = g_rSmgChan[nIndex].ucActionType;
    rSubmitRep.nClientSeqId = g_rSmgChan[nIndex].nClientSeqId;
    rSubmitRep.ucResult = nResult;
//	memcpy(rSubmitRep.sMsgId, rPacket.rMsgBody.rSubmitRep.sMsgId, MAX_MSG_ID_LEN);
	CMPP_PraseMsgId((char *)rPacket.rMsgBody.rSubmitRep.sMsgId, MAX_MSG_ID_LEN, rSubmitRep.sMsgId);

    SmgTrace(0, (char *)"ID-%03d: Receive CMPP_SUBMIT_REP from SMSC,SeqId=0x%08x, MsgId=%s, Result=%d", 
		nIndex, nSeqId, rSubmitRep.sMsgId, rSubmitRep.ucResult);
    sprintf(sTmp, "%s%s%d%s", g_rSmgChan[nIndex].sMTCDR, SPACE_MARK, 
		rSubmitRep.ucResult, SPACE_MARK);
	strcat(sTmp, rSubmitRep.sMsgId);
    WriteSmsCDR(sTmp);
	SendMonitorMsg(MONI_CDR_INFO, sTmp);
  
    nRet = SMG_SendSubmitRep(rMsgHead, rSubmitRep);
    if(0 < nRet)
		SmgTrace(0, (char *)"Error: failed to send SMG_SubmitRep to client: <%d>.\n", nRet);
    else
		SmgTrace(0, (char *)"ID-%03d: Send SMG_SubmitRep to %s,ClientSeqId=%d\n", nIndex, g_rSmgChan[nIndex].sSmscClientIp,rSubmitRep.nClientSeqId );
   
	SmgInitSmscChannel(nIndex);
}

static void SubmitDeliverReqToClient(int nIndex, TSmgDeliverReq *prDeliverReq)
{
    int nHandle;
    int nRet;
	TMsgHead rMsgHead;
	char sClientIp[18] = {0x00};
	char sTmp[2560] = {0x00};
	char sMsgContent[256] = {0x00};
	char sErrorCDR[512] = {0x00};
	
	memcpy(prDeliverReq->sDstAddr, g_sPrefixNumber, strlen(g_sPrefixNumber));  // 增加测试接入号的处理

    SmgTrace(0, (char *)"    SrcAddr=%s, DstAddr=%s, ServiceId=%s",
		prDeliverReq->sSrcAddr, prDeliverReq->sDstAddr, prDeliverReq->sServiceId);
    SmgTrace(0, (char *)"    MsgLen=%d, MsgFmt=%d, Msg=\"%s\"", 
		prDeliverReq->ucMsgLen, prDeliverReq->ucMsgFmt, prDeliverReq->usMsgContent);

    sprintf(sTmp, "MO:%d%s%s%s%s%s%d%s%d%s%d%s%s", g_rSmgChan[nIndex].nSeqId, SPACE_MARK, 
		prDeliverReq->sDstAddr, SPACE_MARK, prDeliverReq->sSrcAddr, SPACE_MARK,
		prDeliverReq->ucMsgFmt, SPACE_MARK, time(NULL), SPACE_MARK, 
		prDeliverReq->ucMsgLen, SPACE_MARK, prDeliverReq->usMsgContent);
    WriteSmsCDR(sTmp);
//	SendMonitorMsg(MONI_CDR_INFO, sTmp);

	// 处理内部聊天业务
	if(strstr(prDeliverReq->sDstAddr, g_sChatNumber) != NULL && g_sChatNumber[0] != 0x00)
	{
		char sChatUserId[16] = {0x00};
		strncpy(sChatUserId, prDeliverReq->sDstAddr+strlen(g_sChatNumber), 5); // 获取5位用户ID
		if(atoi(sChatUserId) >= g_nInerChatUserBeginId && atoi(sChatUserId) <= g_nInerChatUserEndId)
		{
			nHandle = FindClientByServiceNumber(g_sSpNumber, sClientIp, prDeliverReq->sSrcAddr);
		    rMsgHead.nLinkId = g_rSmgChan[nIndex].nHandle = nHandle;
			rMsgHead.nChannelId = nIndex;
			rMsgHead.nCmdId = SMG_DeliverReq;
			strcpy(g_rSmgChan[nIndex].sSmscClientIp, sClientIp);
	
		    nRet = SMG_SendDeliverReq(rMsgHead, *prDeliverReq);
			return;
		}
	}

	
/*	if(strcmp(prDeliverReq->sDstAddr, g_sPrefixNumber) == 0
		&& strstr((char *)prDeliverReq->usMsgContent, "0000") != NULL)
	{
		strcat(prDeliverReq->sDstAddr, "99");
	}
	else */
	if(strcmp(prDeliverReq->sDstAddr, g_sPrefixNumber) == 0
		&& strcmp((char *)prDeliverReq->usMsgContent, g_sPrefixNumber) == 0)
	{
		sprintf(sMsgContent, "%s", "4496手机社区客服电话0791-8194869,发送您问题到0449600获取帮助,退订服务回复0000");
		SendAlarmMsgToSupporter(prDeliverReq->sSrcAddr, "-HTERR", sMsgContent, strlen(sMsgContent));
		return;
	}
	else if(strcmp(prDeliverReq->sDstAddr, g_sPrefixNumber) == 0
		&& strlen((char *)prDeliverReq->usMsgContent) <= 8)
	{
		char *p, *q;
		q = sMsgContent;
		p = (char *)prDeliverReq->usMsgContent;
		while(*p != (char)NULL)
		{
			*q = toupper(*p);
			p++;
			q++;
		}

		if(strcmp(sMsgContent, "CMCCTEST") == 0)
		{
			time_t nTime;
			struct tm rCurTm;
			time(&nTime);
			memcpy(&rCurTm, localtime(&nTime), sizeof(rCurTm));
			sprintf(sMsgContent, "江西先锋科技, %s, %s, %02d月%02d日%02d:%02d",
				g_sPrefixNumber, g_sSpId, rCurTm.tm_mon+1, rCurTm.tm_mday, rCurTm.tm_hour, rCurTm.tm_min);
			SendAlarmMsgToSupporter(prDeliverReq->sSrcAddr, "CMCCTEST", sMsgContent, strlen(sMsgContent));
			return;
		}
		//取消所有订阅的业务。
		else if(strstr(sMsgContent, "0000") != NULL)
		{
			nHandle = FindClientByServiceNumber("044968", sClientIp, prDeliverReq->sSrcAddr);
			if(nHandle < 0)
			{
				SmgTrace(0, (char *)"Error: fail to find the client when DstAddr=%s", prDeliverReq->sDstAddr);
				sprintf(sMsgContent, "您无业务可注销%s", "!");
				SendAlarmMsgToSupporter(prDeliverReq->sSrcAddr, "-HTERR", sMsgContent, strlen(sMsgContent));
				return ;
			}

			rMsgHead.nCmdId = SMG_OpationUnReq;
		    rMsgHead.nLinkId = g_rSmgChan[nIndex].nHandle = nHandle;
			rMsgHead.nChannelId = nIndex;
			strcpy(g_rSmgChan[nIndex].sSmscClientIp, sClientIp);

			TSmgOpationUnRegisterReq rUnRegisterReq;
			strcpy(rUnRegisterReq.sServiceNumber, "044968");
			strcpy(rUnRegisterReq.sSrcAddr, prDeliverReq->sSrcAddr);

			nRet = SMG_SendOpationUnRegisterReq(rMsgHead, rUnRegisterReq);
			return ;
		}
		/*//else if(strncmp(sMsgContent, "QX", 2) == 0 || strstr(sMsgContent, "0000") != NULL || strncmp(sMsgContent, "114", 3) == 0)
		{
			strcat(prDeliverReq->sDstAddr, "00");
		}*/
	}
	
	//订阅服务
	if(strstr((char *)prDeliverReq->usMsgContent, "1111") != NULL)
	{
		nHandle = FindClientByServiceNumber(prDeliverReq->sDstAddr, sClientIp, prDeliverReq->sSrcAddr);
		if(nHandle < 0)
		{
			SmgTrace(0, (char *)"Error: fail to find the client when DstAddr=%s", prDeliverReq->sDstAddr);
			sprintf(sMsgContent, "您无业务可订阅%s", "!");
			SendAlarmMsgToSupporter(prDeliverReq->sSrcAddr, "-HTERR", sMsgContent, strlen(sMsgContent));
			return ;
		}
		
		rMsgHead.nCmdId = SMG_OpationReq;
		rMsgHead.nLinkId = g_rSmgChan[nIndex].nHandle = nHandle;
		rMsgHead.nChannelId = nIndex;
		strcpy(g_rSmgChan[nIndex].sSmscClientIp, sClientIp);
		
		TSmgOpationRegisterReq rRegisterReq;
		strcpy(rRegisterReq.sServiceNumber, prDeliverReq->sDstAddr);
		strcpy(rRegisterReq.sSrcAddr, prDeliverReq->sSrcAddr);
		
		nRet = SMG_SendOpationRegisterReq(rMsgHead, rRegisterReq);
		return ;	
	}

    nHandle = FindClientByServiceNumber(prDeliverReq->sDstAddr, sClientIp, prDeliverReq->sSrcAddr);
    if(nHandle == -3)
    {
		// 查找客服业务程序
		nHandle = FindClientByServiceNumber(g_sSpNumber, sClientIp, prDeliverReq->sSrcAddr);
		if(nHandle == -3)
		{
			SmgTrace(0, (char *)"Error: fail to find the client when DstAddr=%s", prDeliverReq->sDstAddr);
			sprintf(sMsgContent, 
				"用户您好,您发送号码%s可能为错误号码或未开通,拨打0791-8194869电话咨询。", 
				prDeliverReq->sDstAddr, g_sPrefixNumber);

			SendAlarmMsgToSupporter(prDeliverReq->sSrcAddr, "-HTERR", sMsgContent, strlen(sMsgContent));
			sprintf(sErrorCDR, "%d%s%s%s%s%s%s", time(NULL),SPACE_MARK,
				prDeliverReq->sDstAddr, SPACE_MARK, 
				prDeliverReq->sSrcAddr, SPACE_MARK,
				sMsgContent);
//			SendMonitorMsg(MONI_CDR_ERR_INFO, sErrorCDR);
			return;
		}
		SmgInitSmscChannel(nIndex);
    }

    rMsgHead.nLinkId = g_rSmgChan[nIndex].nHandle = nHandle;
	rMsgHead.nChannelId = nIndex;
	rMsgHead.nCmdId = SMG_DeliverReq;
	strcpy(g_rSmgChan[nIndex].sSmscClientIp, sClientIp);
	
    nRet = SMG_SendDeliverReq(rMsgHead, *prDeliverReq);
    if(0 < nRet)
    {
		SmgTrace(0, (char *)"Error: failed to send SMG_DeliverReq to client: <%d>.",	nRet);
		SmgInitSmscChannel(nIndex);
    }
    else
    {
		SmgTrace(0, (char *)"ID-%03d: Send SMG_DeliverReq to %s", nIndex, sClientIp);
	}
}


static void ProcessDeliverRequest(TCmppPacket rPacket)
{
    int nIndex=0, nRet=0, nSeqId=0;
	TSmgDeliverReq rDeliverReq;

	memset(&rDeliverReq, 0x00, sizeof(TSmgDeliverReq));

	if(rPacket.rMsgBody.rDeliverReq.nRegistered == 1) // this message is a report
	{
		ProcessReportReq(rPacket);
		return;
	}

	++g_nMOCounts;

    if(nRet != 0)
    {
		SmgTrace(0, "Error: fail to send CMPP_DELIVER_REP to SMSC!, Ret=%d", nRet);
        return ;
    }
	
    nIndex = 1; // FindIdleSmscChannel();
 	if(0 > nIndex || MAX_CHANNEL_NUM <= nIndex)
    {
		SmgTrace(0, (char *)"Error: received CMPP_DELIVER event from SMSC, but no resource");
		return;
	}
	nSeqId = rPacket.rMsgHead.nSeqId;
	SmgTrace(0, (char *)"ID-%03d: Received CMPP_DELIVER event from SMSC, SeqId=0x%08x",nIndex, nSeqId);
	SmgTrace(0, (char *)"ID-%03d: Send CMPP_DELIVER_REP event to SMSC", nIndex);

	strcpy(rDeliverReq.sDstAddr, rPacket.rMsgBody.rDeliverReq.sDstTerminalId);
	if(rPacket.rMsgBody.rDeliverReq.sSrcTerminalId[0] == '8' &&
		rPacket.rMsgBody.rDeliverReq.sSrcTerminalId[1] == '6')
		strcpy(rDeliverReq.sSrcAddr,  rPacket.rMsgBody.rDeliverReq.sSrcTerminalId+2);
	else
		strcpy(rDeliverReq.sSrcAddr,  rPacket.rMsgBody.rDeliverReq.sSrcTerminalId);

	if(rPacket.rMsgBody.rDeliverReq.nMsgFmt == UCS2_CODE)
	{
		int nMsgLen=0;
		char sMsg[256] = {0x00};
		ConvertUnicodeToAsci(rPacket.rMsgBody.rDeliverReq.sMsgContent,
			rPacket.rMsgBody.rDeliverReq.nMsgLen, sMsg, &nMsgLen);
		if(nMsgLen < 140)
			strcpy((char *)rDeliverReq.usMsgContent, sMsg);
		else
			strncpy((char *)rDeliverReq.usMsgContent, sMsg, 140);
	}
	else
	{
		memcpy(rDeliverReq.usMsgContent,
			rPacket.rMsgBody.rDeliverReq.sMsgContent,
			rPacket.rMsgBody.rDeliverReq.nMsgLen);
	}
	
	rDeliverReq.ucMsgFmt =  rPacket.rMsgBody.rDeliverReq.nMsgFmt;
	rDeliverReq.ucMsgLen =  rPacket.rMsgBody.rDeliverReq.nMsgLen;
	rDeliverReq.ucRegister = 0;
	rDeliverReq.ucSmgNodeId = g_nSmgNodeId;

	memcpy(rDeliverReq.sMsgId, rPacket.rMsgBody.rDeliverReq.sMsgId, MAX_MSG_ID_LEN);
	memcpy(rDeliverReq.sLinkId, rPacket.rMsgBody.rDeliverReq.sLinkID, MAX_LINK_ID_LEN);

    g_rSmgChan[nIndex].nSeqId = nSeqId;
        if(strcmp(rDeliverReq.sDstAddr, g_sPrefixNumber) == 0
                && strcmp((char *)rDeliverReq.usMsgContent, "04496") == 0)
	  g_rSmgChan[nIndex].ucActionType = MT_ACTION;
        else
	  g_rSmgChan[nIndex].ucActionType = MO_ACTION;

    SubmitDeliverReqToClient(nIndex, &rDeliverReq);
}


void SmgProcessCMPPPacket(TCmppPacket rPacket)
{
	switch(rPacket.rMsgHead.nCommandId)
	{
	case CMPP_CONNECT_RESP: //	0x80000001		// 请求连接应答
		SmgTrace(2, "ID-%d: Status=0x%x, Version=0x%x, Auth=%s", 
			rPacket.rMsgHead.nSeqId, 
			rPacket.rMsgBody.rConnectRep.nStatus,
			rPacket.rMsgBody.rConnectRep.nVersion,
			rPacket.rMsgBody.rConnectRep.sAuthenticatorSource);
		break;
	case CMPP_SUBMIT_RESP: //	0x80000004		// 提交短信应答
		ProcessSubmitRespone(rPacket);
		break;
	case CMPP_DELIVER: //		0x00000005		// 短信下发
		ProcessDeliverRequest(rPacket);
		break;
	case CMPP_QUERY_RESP: //	0x80000006		// 发送短信状态查询应答
		break;
	case CMPP_CANCEL_RESP: //	0x80000007		// 删除短信应答
		break;
	case CMPP_TERMINATE: //		0x00000002		// 终止连接
		break;
	case CMPP_TERMINATE_RESP:	// 0x80000002		// 终止连接应答
		break;
	case CMPP_ACTIVE_TEST: //	0x00000008		// 激活测试
		break;
	case CMPP_ACTIVE_TEST_RESP: //	0x80000008	// 激活测试应答
		break;
	default:
		break;
	}
}

⌨️ 快捷键说明

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