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

📄 spsms.c

📁 使用标准C开发的同时支持CMPP3.0 和 CMPP2.0 的SP短信网关程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		if (SendMsgLink.P_S < (SendMsgLink.LWE_S+ISMGMESWIDOW) && \
			SendMsgLink.P_S >= SendMsgLink.LWE_S)
		{
			IsmgMsg->SendMsg->buf->rMsgHead.nSeqId = SendMsgLink.P_S;
 			nRet = SendMsg(SpSmc.sock, IsmgMsg->SendMsg->buf, IsmgMsg->SendMsg->len);
			if(nRet == 104)
			{
				SpSmc.state = SPSMC_ISMGNOOK;
			}
			else
			{
				if (IsmgMsg->SendMsg->buf->rMsgHead.nCommandId == htonl(CMPP_SUBMIT))
				{
					SendMsgToIsmgWriteLog(IsmgMsg->SendMsg->buf->rMsgBody.rSubmitReq.sSrcTerminalId, \
								IsmgMsg->SendMsg->buf->rMsgBody.rSubmitReq.sDstTerminalId,\
								IsmgMsg->SendMsg->md5);
				}

				if (GetIsmgTimer(IsmgMsg->SendMsg) == -1)
				{
					PutIdleBlock(&(IsmgMsg->SendMsg->buf));
					PutIdleBlock(&IsmgMsg->SendMsg);
				}
				SendMsgLink.LWE_R = SendMsgLink.P_R;
				SendMsgLink.P_S = (unsigned char)((SendMsgLink.P_S+1)%ISMGMESWIDOW);
			}
		}
		else
		{
			break;
		}
	}

	//! 根据包头信息做相应的处理
	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;

		//测试,先submit信息,然后模拟器会根据submit生成diliver信息,下发消息。
/*
		scanf(&ch);
		Test_Submit();
//*/
		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);

		//! 判断下发的短信是否为状态报告0为非状态报告,然后根据下发短信的内容调用相应的数据库接口
		//*
		if (!rPacket.rMsgBody.rDeliverReq.nRegistered)
		{
			printf("%s\n%s\n%s\n%s\n",
				rPacket.rMsgBody.rDeliverReq.sSrcTerminalId,
				rPacket.rMsgBody.rDeliverReq.sDstTerminalId,
				rPacket.rMsgBody.rDeliverReq.sMsgContent,
				&rPacket.rMsgBody.rDeliverReq.nRegistered);

			nAllLen = 2;
			len = strlen(rPacket.rMsgBody.rDeliverReq.sSrcTerminalId);
			*(unsigned short*)(strSendToDB + nAllLen) = len;
			nAllLen += 2;
			memcpy(strSendToDB + nAllLen, rPacket.rMsgBody.rDeliverReq.sSrcTerminalId, len);
			nAllLen += len;
			len = strlen(rPacket.rMsgBody.rDeliverReq.sDstTerminalId);
			*(unsigned short*)(strSendToDB + nAllLen) = len;
			nAllLen += 2;
			memcpy(strSendToDB + nAllLen, rPacket.rMsgBody.rDeliverReq.sDstTerminalId, len);
			nAllLen += len;
			
			*(unsigned short*)strSendToDB = nAllLen - 2;
			GetMsgFromIsmgWriteLog(rPacket.rMsgBody.rDeliverReq.sSrcTerminalId, rPacket.rMsgBody.rDeliverReq.sDstTerminalId, rPacket.rMsgBody.rDeliverReq.sMsgContent);
			if (0 == strcmp(_strupr(rPacket.rMsgBody.rDeliverReq.sMsgContent), "ZC"))
			{
				/*
				for(i=0; i<32; i++)
				{
					printf("%x ", strSendToDB[i]);
				}
				printf("\n");
				//*/
				printf("return code: %d", SendRegToDB(strSendToDB));
			}
			else if (0 == strcmp(_strupr(rPacket.rMsgBody.rDeliverReq.sMsgContent),"ZX"))
			{
				/*
				for(i=0; i<32; i++)
				{
					printf("%x ", strSendToDB[i]);
				}
				printf("\n");
				//*/
				printf("return code: %d", SendUnRegToDB(strSendToDB));
			}
			
		}
		//*/
		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	// 激活测试应答
		SpSmc.Tswitch = 0;
		SpSmc.CheckN = MAXCHECK_N;
		SmcReleaseTimer(&SysTestResTv);
		SmgTrace(2, "Recv ActiveTestRes From MISC.\n");

		break;
	default:
		break;
	}
	PutIdleBlock(&ptr);
}


void IsmgStateConnect(IsmgState_Prim_Type * ptr)
{

	if(ptr == NULL)
	{
		printf("IsmgStateConnect Mem error !!\n");
		return ;
	}

	SpSmc.state = SPSMC_ISMGOK;
	SpSmc.CheckN = MAXCHECK_N;
	SpSmc.sock = ptr->sock;
	SmcSetTimer(&SysTestTv);
	SmgTrace(2, "Success connect to MISC, Soc=%d, IP=%s\n", ptr->sock, SpSmc.ismgip);
	CMPP_Connect(SpSmc.spid,SpSmc.sppwd);

	PutIdleBlock(&ptr);
}

void IsmgStateDisconnect(IsmgState_Prim_Type * ptr)
{

	if(ptr == NULL)
	{
		printf("IsmgStateDisconnect Mem error !!\n");
		return ;
	}

	SpSmc.state = SPSMC_ISMGNOOK;
	SmcSetTimer(&SysTestTv);
	SpSmc.sock = -1;
	SmgTrace(2, "Disconnect from MISC, Sock=%d, IP=%s\n", ptr->sock, SpSmc.ismgip);
	PutIdleBlock(&ptr);
}

void RecvVscpMsgWriteLog(VscpSmcReq_Prim_Type * ptr)
{
	FILE *fp;
	int i;

	if (ptr == NULL)
		return;

	fp = fopen("vscpsmc.log", "a");
	if (fp == NULL)
		return;
	/*
	printf("RecvSmcReqFromVscp Caller = %s; Called = %s; Mes = %s; check =\n",
		ptr->cp->No,ptr->cd->No,ptr->buf->No,ptr->md5->No);

	for (i=0 ; i<16; i++)
		printf("%x",ptr->md5->No[i]);
	printf("\n");
	//*/


	fprintf(fp, "cp=%s; cd=%s; check=", ptr->cp->No, ptr->cd->No);
	for (i=0 ; i<16; i++)
		fprintf(fp,"%x",ptr->md5->No[i]);
	fprintf(fp,"\n");
	fclose(fp);
}

void SendMsgToIsmgWriteLog(char * cp,char * cd, char * md5)
{
	FILE *fp;
	int i;


	fp = fopen("smcok.log", "a");
	if (fp == NULL)
		return;

	printf("RecvSmcReqFromVscp Caller = %s; Called = %s; check = %s\n",
		cp,cd,md5);


	fprintf(fp, "cp=%s; cd=%s; check=", cp,cd);
	for (i=0 ; i<16; i++)
		fprintf(fp,"%x",md5[i]);
	fprintf(fp,"\n");

	fclose(fp);
}

void GetMsgFromIsmgWriteLog(char* cp, char* cd, char* msgcontent)
{
	FILE* fp;
	int i;

	fp = fopen("smcget.log", "a");
	if (NULL == fp)
	{
		return;
	}

	fprintf(fp, "cp=%s; cd=%s; msgcontent=%s\n", cp, cd, msgcontent);


	fclose(fp);
}

void RecvSMCReqFromVscp(VscpSmcReq_Prim_Type * ptr)
{
	char sMsgId[8];
	char sFeeTerminalId[32];
	char sFeeCode[6];
	char sSrcTerminalId[21];
	char sDstTerminalId[32];
	unsigned nMsgLen;
	char sMsgContent[160];
	char sLinkId[20];


	if (ptr ==  NULL)
	{
		return;
	}

	memset(sSrcTerminalId,0,sizeof(sSrcTerminalId));
	memset(sDstTerminalId,0,sizeof(sDstTerminalId));
	memset(sMsgContent,0,sizeof(sMsgContent));

	if (ptr->md5 != NULL)
	{

		ptr->md5->len = 16;
		ptr->md5->No[16] = 0;
	}

	if (ptr->cp != NULL)
	{
		ptr->cp->No[ptr->cp->len] = 0;
		if (ptr->cp->len <= sizeof(sSrcTerminalId))
			memcpy(sSrcTerminalId,ptr->cp->No,ptr->cp->len);
		else
			memcpy(sSrcTerminalId,ptr->cp->No,sizeof(sSrcTerminalId));
	}

	if (ptr->cd != NULL)
	{
		ptr->cd->No[ptr->cd->len] = 0;
		if (ptr->cd->len <= sizeof(sDstTerminalId))
			memcpy(sDstTerminalId,ptr->cd->No,ptr->cd->len);
		else
			memcpy(sDstTerminalId,ptr->cd->No,sizeof(sDstTerminalId));
	}

	if (ptr->buf != NULL)
	{
		ptr->buf->No[ptr->buf->len] = 0;
		if (ptr->buf->len <= sizeof(sMsgContent))
		{
			memcpy(sMsgContent,ptr->buf->No,ptr->buf->len);
			nMsgLen = ptr->buf->len;
		}
		else
		{
			memcpy(sMsgContent,ptr->buf->No,sizeof(sMsgContent));
			nMsgLen = sizeof(sMsgContent);
		}
	}
	//test
	printf("Msg:%s\n", sMsgContent);

	RecvVscpMsgWriteLog(ptr);

	memset(sMsgId,0,sizeof(sMsgId));
	memset(sFeeTerminalId,0,sizeof(sFeeTerminalId));
	memset(sFeeCode,0,sizeof(sFeeCode));
	strcpy(sLinkId,"1234567890123456789");
	//strcpy(sLinkId,"0123");

	CMPP_SendSubmitReq(	1,
						sMsgId,
						1,
						1,
						1,
						1,
						SpSmc.sServiceId,
						2,
						sFeeTerminalId,
						0,
						1,
						1,
						0,
						SpSmc.spid,
						0,
						sFeeCode,
						sSrcTerminalId,
						1,
						sDstTerminalId,
						0,
						nMsgLen,
						sMsgContent,
						sLinkId,
						ptr->md5->No
						);

/*	{
		unsigned char buf[1024], * ptr;
		unsigned char Nolen;
		struct tm rTm;
		time_t nTime;
		char sTmp[16];

		ptr = buf;
		*(unsigned int *)ptr = 0;
		ptr += 4;
		*(unsigned short *)ptr = len;
		ptr +=2 ;

		ptr = 1; //source MobileNO
		ptr +=1;
		Nolen = strlen(sSrcTerminalId);
		*(unsigned short *)ptr = Nolen;
		ptr +=2;
		memcpy(ptr,sSrcTerminalId,Nolen);
		ptr += Nolen;


		ptr = 2; //source MobileNO
		ptr +=1;
		Nolen = strlen(sDstTerminalId);
		*(unsigned short *)ptr = Nolen;
		ptr +=2;
		memcpy(ptr,sDstTerminalId,Nolen);
		ptr += Nolen;

		ptr = 3;
		ptr += 1;
		if (ptr->md5 != NULL)
		{
			*(unsigned short *)ptr = nMsgLen+ptr->md5->len;
			ptr += 2;
			memcpy(ptr,sMsgContent,nMsgLen);
			ptr += nMsgLen;
			memcpy(ptr,ptr->md5,ptr->md5->len);
			ptr += ptr->md5->len;
		}
		else
		{
			*(unsigned short *)ptr = nMsgLen;
			ptr += 2;
			memcpy(ptr,sMsgContent,nMsgLen);
		}

		ptr = 4; //source MobileNO
		ptr += 1;
		time(&nTime);
		memcpy(&rTm,localtime(&nTime), sizeof(rTm));
		sprintf(sTmp, "%02d%02d%02d%02d%02d", rTm.tm_mon+1, rTm.tm_mday, rTm.tm_hour, rTm.tm_min, rTm.tm_sec);	

		*(unsigned short *)ptr = 10;
		ptr +=2;
		memcpy(ptr,sTmp,10);
		ptr += 10;

	}*/
	PutIdleBlock(&ptr->cd);
	PutIdleBlock(&ptr->cp);
	PutIdleBlock(&ptr->buf);
	PutIdleBlock(&ptr->md5);
	PutIdleBlock(&ptr);

}


void CMPP_CloseClient()
{
	CMPP_SendTerminateReq();
	CloseClient();
}


⌨️ 快捷键说明

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