📄 spsms.c
字号:
#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 + -