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