📄 cmpplib.cpp
字号:
#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 + -