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

📄 cmpplib.cpp

📁 中国移动的短信网关程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -