📄 cmpplib.cpp
字号:
p += MAX_SRC_TERMINALID_LEN;
#endif
*p++ = nTPPid;
*p++ = nTPUdhi;
*p++ = nMsgFmt;
if(sSpId != NULL)
memcpy(p, sSpId, MAX_SP_ID_LEN), p += MAX_SP_ID_LEN;
else
return -2;
sprintf(p, "0%d", nFeeType), p += MAX_FEE_TYPE_LEN;
if(sFeeCode != NULL)
strcpy(p, sFeeCode), p += MAX_FEE_CODE_LEN;
else
p += MAX_FEE_CODE_LEN;
p += MAX_VALID_TIME_LEN; //char sValidTime[MAX_VALID_TIME_LEN];
p += MAX_VALID_TIME_LEN; //char sAtTime[MAX_VALID_TIME_LEN];
if(sSrcTerminalId != NULL)
strcpy(p, sSrcTerminalId), p += MAX_SRC_TERMINALID_LEN;
else
return -3;
*p++ = nDstAddrNumber;
#ifndef CMPP_VERSION_20
if(sDstTerminalId != NULL)
strcpy(p, sDstTerminalId), p += MAX_DST_TERMINALID_LEN;
else
return -4;
*p++ = nDstTerminalType;
#else
if(sDstTerminalId != NULL)
strcpy(p, sDstTerminalId), p += MAX_SRC_TERMINALID_LEN;
else
return -4;
#endif
*p++ = nMsgLen;
if(sMsgContent != NULL)
memcpy(p, sMsgContent, nMsgLen);
p += nMsgLen;
#ifndef CMPP_VERSION_20
if(sLinkId != NULL)
memcpy(p, sLinkId, MAX_LINK_ID_LEN), p += MAX_LINK_ID_LEN;
else
p += MAX_LINK_ID_LEN;
#else
p += 8;
#endif
nTmpValue = htonl(p - sItem);
memcpy(sItem, &nTmpValue, 4);
nRet = SendPacketToMISC(sItem, p-sItem);
return nRet;
}
#define ToChar(c) (c)>=10?((c)-10+'a'):((c)+'0')
int CMPP_PraseMsgId(char *sMsgId, int nMsgIdLen, char *sStrMsgId)
{
int i=0, nLen=0;
unsigned char *p, *q;
if( nMsgIdLen == 0 || sMsgId == NULL || sStrMsgId == NULL)
return -1;
p = (unsigned char *)sMsgId;
q = (unsigned char *)sStrMsgId;
while( i++ < nMsgIdLen )
{
*(q++) = ToChar(((unsigned char)(*p)>>4)&0x0f);
*(q++) = ToChar((unsigned char)(*p)&0x0f);
p++;
nLen += 2;
}
*q = 0x00;
return nLen;
}
void CMPP_PraseReport(char *sReport, TCmppReportMsg *pCmppReportMsg)
{
char *p;
char sStat[8] = {0x00};
int nTempValue = 0;
if(sReport == NULL || pCmppReportMsg == NULL)
return;
p = sReport;
CMPP_PraseMsgId(p, MAX_MSG_ID_LEN, pCmppReportMsg->sMsgId);
p += MAX_MSG_ID_LEN;
strncpy(sStat, p, 7), p += 7;
if(strcmp(sStat, "DELIVRD") == 0)
pCmppReportMsg->nState = 0;
else if(strcmp(sStat, "ACCEPTD") == 0)
pCmppReportMsg->nState = 1;
else
pCmppReportMsg->nState = 2;
strncpy(pCmppReportMsg->sSubmitTime, p, 10), p += 10;
strncpy(pCmppReportMsg->sDoneTime, p, 10), p += 10;
strncpy(pCmppReportMsg->sDstTerminalId, p, 32), p += 32;
memcpy(&nTempValue, p, 4);
pCmppReportMsg->nSeqId = ntohl(nTempValue);
}
// begin define function for SMG server
void OnCMPPClientReceiveData(int nHandle,char *sIpAddr,int nPort,char *sBuf,unsigned short nLen)
{
TCmppPacket rPacket;
char *p;
unsigned int nTmpValue = 0;
char *sMsgId[64] = {0x00};
memset(&rPacket, 0x00, sizeof(TCmppPacket));
CMPP_UnpackMsgHead(&rPacket.rMsgHead, sBuf);
p = sBuf+sizeof(TCmppHead);
switch(rPacket.rMsgHead.nCommandId)
{
case CMPP_CONNECT_RESP: // 0x80000001 // 请求连接应答
#ifndef CMPP_VERSION_20
memcpy(&nTmpValue, p, 4), p += 4;
rPacket.rMsgBody.rConnectRep.nStatus = ntohl(nTmpValue); //ntohl(nTmpValue);
#else
rPacket.rMsgBody.rConnectRep.nStatus = *p, p += 1;
#endif
memcpy(rPacket.rMsgBody.rConnectRep.sAuthenticatorSource, p, 16), p += 16;
rPacket.rMsgBody.rConnectRep.nVersion = *p;
break;
case CMPP_SUBMIT_RESP: // 0x80000004 // 提交短信应答
memcpy(rPacket.rMsgBody.rSubmitRep.sMsgId, p, MAX_MSG_ID_LEN), p += MAX_MSG_ID_LEN;
#ifndef CMPP_VERSION_20
memcpy(&nTmpValue, p, 4);
rPacket.rMsgBody.rSubmitRep.nResult = ntohl(nTmpValue);
#else
rPacket.rMsgBody.rSubmitRep.nResult = *p;
#endif
break;
case CMPP_DELIVER: // 0x00000005 // 短信下发
memcpy(rPacket.rMsgBody.rDeliverReq.sMsgId, p, MAX_MSG_ID_LEN), p += MAX_MSG_ID_LEN;
strcpy(rPacket.rMsgBody.rDeliverReq.sDstTerminalId, p), p += MAX_SRC_TERMINALID_LEN;
strcpy(rPacket.rMsgBody.rDeliverReq.sServiceId, p), p += MAX_SERVICE_ID_LEN;
rPacket.rMsgBody.rDeliverReq.nTPPid = *p++;
rPacket.rMsgBody.rDeliverReq.nTPUdhi = *p++;
rPacket.rMsgBody.rDeliverReq.nMsgFmt = *p++;
#ifndef CMPP_VERSION_20
strcpy(rPacket.rMsgBody.rDeliverReq.sSrcTerminalId, p), p += MAX_DST_TERMINALID_LEN;
rPacket.rMsgBody.rDeliverReq.nSrcTerminalType = *p++;
#else
strcpy(rPacket.rMsgBody.rDeliverReq.sSrcTerminalId, p), p += MAX_SRC_TERMINALID_LEN;
#endif
rPacket.rMsgBody.rDeliverReq.nRegistered = *p++;
rPacket.rMsgBody.rDeliverReq.nMsgLen = *p++;
if(rPacket.rMsgBody.rDeliverReq.nMsgLen > MAX_MSG_CONTENT_LEN)
{
memcpy(rPacket.rMsgBody.rDeliverReq.sMsgContent, p, MAX_MSG_CONTENT_LEN);
p += rPacket.rMsgBody.rDeliverReq.nMsgLen;
rPacket.rMsgBody.rDeliverReq.nMsgLen = (unsigned char)MAX_MSG_CONTENT_LEN;
}
else
{
memcpy(rPacket.rMsgBody.rDeliverReq.sMsgContent, p, rPacket.rMsgBody.rDeliverReq.nMsgLen);
p += rPacket.rMsgBody.rDeliverReq.nMsgLen;
}
#ifndef CMPP_VERSION_20
memcpy(rPacket.rMsgBody.rDeliverReq.sLinkID, p, MAX_LINK_ID_LEN);
#endif
CMPP_SendDeliverRep(rPacket.rMsgBody.rDeliverReq.sMsgId, rPacket.rMsgHead.nSeqId);
break;
case CMPP_QUERY_RESP: // 0x80000006 // 发送短信状态查询应答
memcpy(rPacket.rMsgBody.rQueryRep.sTime, p, 8), p += 8;
rPacket.rMsgBody.rQueryRep.nQueryType = *p++;
strcpy(rPacket.rMsgBody.rQueryRep.sQueryCode, p), p += MAX_SERVICE_ID_LEN;
memcpy(&nTmpValue, p, 4), p += 4;
rPacket.rMsgBody.rQueryRep.nMT_TLMsg = ntohl(nTmpValue);
memcpy(&nTmpValue, p, 4), p += 4;
rPacket.rMsgBody.rQueryRep.nMT_Tlusr = ntohl(nTmpValue);
memcpy(&nTmpValue, p, 4), p += 4;
rPacket.rMsgBody.rQueryRep.nMT_Scs = ntohl(nTmpValue);
memcpy(&nTmpValue, p, 4), p += 4;
rPacket.rMsgBody.rQueryRep.nMT_WT = ntohl(nTmpValue);
memcpy(&nTmpValue, p, 4), p += 4;
rPacket.rMsgBody.rQueryRep.nMT_FL = ntohl(nTmpValue);
memcpy(&nTmpValue, p, 4), p += 4;
rPacket.rMsgBody.rQueryRep.nMO_Scs = ntohl(nTmpValue);
memcpy(&nTmpValue, p, 4), p += 4;
rPacket.rMsgBody.rQueryRep.nMO_WT = ntohl(nTmpValue);
memcpy(&nTmpValue, p, 4), p += 4;
rPacket.rMsgBody.rQueryRep.nMO_FL = ntohl(nTmpValue);
break;
case CMPP_CANCEL_RESP: // 0x80000007 // 删除短信应答
memcpy(&nTmpValue, p, 4);
rPacket.rMsgBody.rCancelRep.nResult = ntohl(nTmpValue);
break;
case CMPP_TERMINATE: // 0x00000002 // 终止连接
CMPP_SendTerminateRep(rPacket.rMsgHead.nSeqId);
break;
case CMPP_TERMINATE_RESP: // 0x80000002 // 终止连接应答
break;
case CMPP_ACTIVE_TEST: // 0x00000008 // 激活测试
CMPP_SendActiveTestRep(rPacket.rMsgHead.nSeqId);
break;
case CMPP_ACTIVE_TEST_RESP: // 0x80000008 // 激活测试应答
break;
default:
break;
}
SmgProcessCMPPPacket(rPacket);
}
static void OnCMPPClientConnected(int nHandle,char *sIpAddr,unsigned short nPort)
{
g_bSmscConnectionActive = TRUE;
// Trace("Success connect to MISC, Handle=%d, IP=%s, Port=%d", nHandle, sIpAddr, nPort);
SmgTrace(2, "Success connect to MISC, Handle=%d, IP=%s, Port=%d", nHandle, sIpAddr, nPort);
}
static void OnCMPPClientDisconnected(int nHandle,char *sIpAddr,unsigned short nPort)
{
SmgTrace(2, "Disconnect from MISC, Handle=%d, IP=%s, Port=%d", nHandle, sIpAddr, nPort);
//Trace("Disconnect from MISC, Handle=%d, IP=%s, Port=%d", nHandle, sIpAddr, nPort);
g_bSmscConnectionActive = FALSE;
}
int CMPP_InitClient(char *sMiscIp, int nMiscPort)
{
strcpy(g_sSmscIP, sMiscIp);
g_nSmscPort = nMiscPort;
g_tOldTime = time(NULL);
g_nSeqId = 1;
g_rCMPPClient.rCommFunc_.OnRecvData = OnCMPPClientReceiveData;
g_rCMPPClient.rCommFunc_.OnConnected = OnCMPPClientConnected;
g_rCMPPClient.rCommFunc_.OnDisconnected = OnCMPPClientDisconnected;
while((g_nCMPPClientHandle = g_rCMPPClient.InitClient(sMiscIp, nMiscPort)) < 0)
Sleep(1000);
return g_nCMPPClientHandle;
}
void CMPP_GetClientEvent()
{
time_t tCurTime = 0;
tCurTime = time(NULL);
if(tCurTime - g_tOldTime >= g_tActiveTestTimeval)
{
CMPP_SendActiveTestReq();
g_tOldTime = time(NULL);
}
if(g_bSmscConnectionActive == FALSE)
{
if(CMPP_InitClient(g_sSmscIP, g_nSmscPort) > 0)
{
SmgTrace(2, "Try to reconnect to MISC Server %d times", g_nReConnectTimes++);
CMPP_Connect(g_sSpID, g_sSpPWD);
}
#ifndef _OS_UNIX
Sleep(1000);
#else
sleep(1);
#endif
}
else
g_rCMPPClient.RunClient();
}
void CMPP_CloseClient()
{
CMPP_SendTerminateReq();
g_rCMPPClient.CloseClient();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -