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

📄 spsms.c

📁 使用标准C开发的同时支持CMPP3.0 和 CMPP2.0 的SP短信网关程序
💻 C
📖 第 1 页 / 共 3 页
字号:

#include <time.h>
#include <windows.h>
#include <stdio.h>
#include "vscp_os.h"
#include "iblock.h"
#include "smctimer.h"
#include "./coding/coding.h"
#include "spsms.h"
#include "interface.h"

extern void GetMD5(unsigned char* pBuf, unsigned int nLength,unsigned char *pMD5);
extern unsigned int GetIsmgQCount(void);
extern int SendToIsmgq(void * ptr);
extern int SendMsg(unsigned int sock,char * sBuf,int nLen);

#if defined WIN32 || defined LINUX
#pragma pack(push,1)
#endif

	typedef struct CALLNUMBER_STR
	{
		unsigned short	len;
		unsigned char	No[32];
	}CALLNUMBER_T, * P_CALLNUMBER_T;

	typedef struct RecvIsmg_Prim_STR
	{
		unsigned short	type;
		unsigned short	len;
	} RecvIsmg_Prim_Type;

	typedef struct IsmgState_Prim_STR
	{
		unsigned short	type;
		unsigned int	sock;
	} IsmgState_Prim_Type;

	typedef struct IsmgSendQ_Prim_STR
	{
		unsigned short		type;
		IsmgMsgType *		SendMsg;	
	} IsmgSendQ_Prim_Type;

	typedef struct IsmgSQTimerSTR
	{
		unsigned char	state;
		unsigned char	CheckN;
		TIMER_T			Tv;	
	} IsmgSQTimerType;

typedef struct VscpSmcReq_Prim_STR
{
	unsigned short		type;
	P_CALLNUMBER_T		cp;
	P_CALLNUMBER_T		cd;	
	P_CALLNUMBER_T		buf;
	P_CALLNUMBER_T		md5;		
} VscpSmcReq_Prim_Type;


#if defined(WIN32)||defined(LINUX)
#pragma pack(pop)
#endif


IsmgSQTimerType	 	IsmgMsgTv [ISMGMESWIDOW];
void SendMsgToIsmgWriteLog(char * cp,char * cd, char * md5);
void GetMsgFromIsmgWriteLog(char* cp, char* cd, char* msgcontent);

/*
//测试,先submit信息,然后模拟器会根据submit生成diliver信息,下发消息。
void Test_Submit()
{
	char sMsgId[8];
	char sFeeTerminalId[32];
	char sFeeCode[6];
	char sSrcTerminalId[21];
	char sDstTerminalId[32];
	unsigned nMsgLen;
	char sMsgContent[160];
	char sLinkId[20];
	char md5_no[32] = {0};
	char testBuf[10] = "ZX";
	//int nSeqId = 1;
	
	memset(sSrcTerminalId,0,sizeof(sSrcTerminalId));
	memset(sDstTerminalId,0,sizeof(sDstTerminalId));
	memset(sMsgContent,0,sizeof(sMsgContent));

	memcpy(sSrcTerminalId, "12580", 5);

	memcpy(sDstTerminalId, "15991661938", 11);


	nMsgLen = sizeof(testBuf);
	memcpy(sMsgContent, testBuf, 10);

	//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,
		0,
		1,
		SpSmc.sServiceId,
		2,
		sFeeTerminalId,
		0,
		1,
		1,
		0,
		SpSmc.spid,
		0,
		sFeeCode,
		sSrcTerminalId,
		1,
		sDstTerminalId,
		0,
		nMsgLen,
		sMsgContent,
		sLinkId,
		md5_no
		);

}
*/

void InitIsmgMsgTv()
{
	int i;
	for(i=0; i<ISMGMESWIDOW; i++)
	{
		IsmgMsgTv[i].Tv.Value = (60*1*1000);
		IsmgMsgTv[i].Tv.pre = 0;
		IsmgMsgTv[i].Tv.suc = 0;
		IsmgMsgTv[i].Tv.TimerTime = 0;
		IsmgMsgTv[i].Tv.TimeType = 4;
		IsmgMsgTv[i].CheckN = MAXCHECK_N;
	}
}


static int ReSendPacketToMISC(TCmppPacket *sBuf, int nLen,char * md5,int TimerIndex)
{
	int nRet = 0;
	IsmgMsgType * ptr;
	unsigned char * qp ; 
	unsigned int count;

	ptr = GetIdleBlock((nLen+16),M_SPSMS_C);

	if (ptr == NULL)
	{
		return (-1);
	}

	ptr->len = nLen;
	memcpy(ptr->buf,sBuf,nLen);
	if (md5 != NULL)
	{
		memcpy(ptr->md5,md5,16);
	}
	else
	{
		memset(ptr->md5,0,16);
	}
	
	count = GetIsmgQCount();

	
	if (count != 0)
	{
		qp = GetIdleBlock(32,M_SPSMS_C);
		if(qp == NULL)
		{
			PutIdleBlock(&ptr);
			return (-2);
		}

		*(unsigned short *)(qp+0) = ISMGP|0;
		*(unsigned int *)(qp+2) = ptr;
		if (SendToIsmgq(qp) == 1)
		{
			PutIdleBlock(&ptr);
			PutIdleBlock(&qp);
		}
	}
	else
	{
		
		if (SendMsgLink.P_S < (SendMsgLink.LWE_S+ISMGMESWIDOW) && \
			SendMsgLink.P_S >= SendMsgLink.LWE_S)
		{
			sBuf->rMsgHead.nSeqId = htonl(SendMsgLink.P_S);
 			nRet = SendMsg(SpSmc.sock, sBuf, nLen);
			if(nRet == 104)
			{
				SpSmc.state = SPSMC_ISMGNOOK;
			}
			else
			{
			
				if (sBuf->rMsgHead.nCommandId == htonl(CMPP_SUBMIT))
				{
					SendMsgToIsmgWriteLog(sBuf->rMsgBody.rSubmitReq.sSrcTerminalId, \
								sBuf->rMsgBody.rSubmitReq.sDstTerminalId,\
								md5);
				}

				IsmgMsgTv[TimerIndex].Tv.para = ptr;
				SmcSetTimer(&IsmgMsgTv[TimerIndex].Tv);
				SendMsgLink.LWE_R = SendMsgLink.P_R;
			}

			return (nRet);
		}
		else
		{
			qp = GetIdleBlock(32,M_SPSMS_C);
			if(qp == NULL)
			{
				PutIdleBlock(&ptr);
				return (-2);
			}

			*(unsigned short *)(qp+0) = ISMGP|0;
			*(unsigned int *)(qp+2) = ptr;
			if (SendToIsmgq(qp) == 1)
			{
				PutIdleBlock(&ptr);
				PutIdleBlock(&qp);
			}
		}
		SendMsgLink.P_S = (unsigned char)((SendMsgLink.P_S+1)%ISMGMESWIDOW);
	}
	return (0);
}

void IsmgMsgExpire(void * para,void *para1)
{
	int i;
	IsmgMsgType * buf;

	for (i=0; i<ISMGMESWIDOW; i++)
	{
		if (&IsmgMsgTv[i].Tv != para1)
			continue;

		printf("TestResExprie and CheckN = %d; \n",SpSmc.CheckN);
		IsmgMsgTv[i].CheckN --;
		buf = IsmgMsgTv[i].Tv.para;
		if (IsmgMsgTv[i].CheckN == 0)
		{
			break;//// send smc error;
		}

		ReSendPacketToMISC(buf->buf,buf->len,buf->md5,i);
		PutIdleBlock(&(buf->buf));
		PutIdleBlock(&buf);
	}
}

void SmgTrace(int nMode, char *szFormat, ...)
{
    va_list pArguments;
    char szBuffer[1024] = {0x00};
	

    va_start(pArguments, szFormat);
    vsprintf(szBuffer, szFormat, pArguments);
    va_end(pArguments);
	if(2 == nMode) 
    {
       WriteLog(szBuffer);
    }
}


int GetIsmgTimer(void * para)
{
	int i;

	for (i=0; i<ISMGMESWIDOW; i++)
	{
		if (IsmgMsgTv[i].state == 0)
		{
			IsmgMsgTv[i].state = 1;
			IsmgMsgTv[i].Tv.para = para;
			SmcSetTimer(&IsmgMsgTv[i].Tv);
			return (i);
		}
	}
	return (-1);
}

void PutIsmgTimer(int i)
{
	if (IsmgMsgTv[i].state == 1)
	{
		IsmgMsgTv[i].state = 0;
		SmcReleaseTimer(&IsmgMsgTv[i].Tv);
		PutIdleBlock(&IsmgMsgTv[i].Tv.para);
	}
}

/**
 *@brief 向ISMG发送组好的CMPP短信包
 *
 * 
 *@param sBuf [in] 由各种CMPP类型组好的消息体
 *@param nLen [in] 消息的长度
 *@param md5 [in] 校验码
 *@return
*/
static int SendPacketToMISC(TCmppPacket *sBuf, int nLen,char * md5)
{
	int nRet = 0;
	IsmgMsgType * ptr;
	unsigned char * qp ; 
	unsigned int count;

	ptr = GetIdleBlock(32,M_SPSMS_C);

	if (ptr == NULL)
	{
		return (-1);
	}

	if (md5 != NULL)
	{
		memcpy(ptr->md5,md5,16);
	}
	else
	{
		memset(ptr->md5,0,16);
	}
	ptr->len = nLen;
	ptr->buf = GetIdleBlock((nLen),M_SPSMS_C);
	if (ptr->buf == NULL)
	{
		PutIdleBlock(&ptr);
		return (-1);
	}
	memcpy(ptr->buf,sBuf,nLen);
	
	count = GetIsmgQCount();

	
	if (count != 0)
	{
		qp = GetIdleBlock(32,M_SPSMS_C);
		if(qp == NULL)
		{
			PutIdleBlock(&ptr->buf);
			PutIdleBlock(&ptr);
			return (-2);
		}

		*(unsigned short *)(qp+0) = ISMGP|0;
		*(unsigned int *)(qp+2) = ptr;
		if (SendToIsmgq(qp) == 1)
		{
			PutIdleBlock(&ptr);
			PutIdleBlock(&qp);
		}
	}
	else
	{
		
		if (SendMsgLink.P_S < (SendMsgLink.LWE_S+ISMGMESWIDOW) && \
			SendMsgLink.P_S >= SendMsgLink.LWE_S)
		{
			sBuf->rMsgHead.nSeqId = htonl(SendMsgLink.P_S);
 			nRet = SendMsg(SpSmc.sock, sBuf, nLen);
			if(nRet == 104)
			{
				SpSmc.state = SPSMC_ISMGNOOK;
				return (nRet);
			}
			else
			{
				if (sBuf->rMsgHead.nCommandId == htonl(CMPP_SUBMIT))
				{
					SendMsgToIsmgWriteLog(sBuf->rMsgBody.rSubmitReq.sSrcTerminalId, \
					sBuf->rMsgBody.rSubmitReq.sDstTerminalId,\
					md5);
				}

				if (GetIsmgTimer(ptr) == -1)
				{
					PutIdleBlock(&ptr->buf);
					PutIdleBlock(&ptr);
				}
				SendMsgLink.LWE_R = SendMsgLink.P_R;
			}
		}
		else
		{
			qp = GetIdleBlock(32,M_SPSMS_C);
			if(qp == NULL)
			{
				PutIdleBlock(&ptr->buf);
				PutIdleBlock(&ptr);
				return (-2);
			}

			*(unsigned short *)(qp+0) = ISMGP|0;
			*(unsigned int *)(qp+2) = ptr;
			if (SendToIsmgq(qp) == 1)
			{
				PutIdleBlock(&ptr);
				PutIdleBlock(&qp);
			}
		}
		SendMsgLink.P_S = (unsigned char)((SendMsgLink.P_S+1)%ISMGMESWIDOW);
	}
	return (0);
}

/**
 *@brief 对接收到的CMPP信息进行解包,得到包头
 *
 * 
 *@param prMsgHead [out] CMPP的包头结构指针
 *@param sBuf [in] 从ISMG接受到的消息体
 *@return
*/
static void CMPP_UnpackMsgHead(TCmppHead *prMsgHead, char *sBuf)
{
	char	*ptr;
	unsigned	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);
}

/**
 *@brief 请求与ISMG连接
 *组CMPP_CONNECT对应的CMPP包,并调用发送接口向ISMG发送消息
 *
 * 
 *@param sSpId [in] 企业代码
 *@param sSpPwd [in] 企业密码
 *@return 发送成功与否
*/
int  CMPP_Connect(char *sSpId, char *sSpPwd)
{
	int nRet = 0;
	TCmppPacket rPacket;
	char *p;
	int nPacketLen = sizeof(TCmppHead) + sizeof(TCmppConnectReq);

	struct tm rTm;

⌨️ 快捷键说明

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