📄 cmppapi.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 + -