📄 msg_center.cpp
字号:
#include "stdafx.h"
#include "Msg_Center.h"
#include "shlwapi.h"
#include "StrSplitter.h"
#include "common.h"
#include "ZUDPSocket.h"
#define FUJIAN
int iRecvSock=0;
extern char gszAddPackets[128][32];
extern char gszExchangeFees[128][32];
extern CZUDPSocket* g_pUDPSocket;
extern DWORD g_dwLogin;
DWORD WINAPI PeekMsgThread(LPVOID lpParam)
{
char bMsg[1024];
TMSG_CENTER* pMsgCenter=(TMSG_CENTER*)lpParam;
while(true)
{
memset(bMsg,0x00,1024);
if(pMsgCenter->CmppEntity.MsgQue.pop(bMsg))
pMsgCenter->CmppLink_MsgProc(bMsg);
memset(bMsg,0x00,1024);
if(g_dwLogin == 1)
if(pMsgCenter->PtEntity.MsgQue.pop(bMsg))
pMsgCenter->Pt_MsgProc(bMsg);
Sleep(10);
}
}
void TMSG_CENTER::Pt_MsgProc(char *buf)
{
STRUCT_TRP_MSG_HEADER *TRp_msg_head=(STRUCT_TRP_MSG_HEADER *)buf;
UINT nCommandID=ntohl(TRp_msg_head->dwCommandId);
int nMsgLen=ntohl(TRp_msg_head->dwTotalLen);
LogMsg(buf);//数出输出消息
switch(nCommandID)
{
case TRP_SUBMIT:
MtAdd();
PT_Submit(buf,nMsgLen);
break;
case TRP_QUERY:
PT_Query(buf,nMsgLen);
break;
default:
LogErr("CMPP UNKNOWN_UNIDATA PACKET from PT!\r\n");
break;
}
return;
}
BOOL TMSG_CENTER::PT_Submit(char buf[],UINT nbufLen)
{
//检查数据包是否正确
if(buf==NULL || nbufLen<=0)
return FALSE;
char szUDPTmp[1024];
ZeroMemory(szUDPTmp,sizeof(szUDPTmp));
strcpy(szUDPTmp,gStructSmscInfo.szRemark);
memcpy(&szUDPTmp[60],buf,nbufLen);
g_pUDPSocket->SendTo(szUDPTmp,nbufLen+60,gStructWatchInfo.szIP,gStructWatchInfo.nPort);
ZeroMemory(szUDPTmp,sizeof(szUDPTmp));
memcpy(szUDPTmp,buf,nbufLen);
int nUDPTmp = nbufLen;
//内部传送的大包包头
STRUCT_SUBMIT_HEADER *struct_submit_head=(STRUCT_SUBMIT_HEADER*)buf;
//发送的cmpp结构
STRUCT_CMPP12_SUBMIT struct_cmpp_submit;
ZeroMemory(&struct_cmpp_submit,sizeof(STRUCT_CMPP12_SUBMIT));
memcpy(&struct_cmpp_submit,&buf[sizeof(STRUCT_SUBMIT_HEADER)],ntohs(struct_submit_head->wProtocol_Length));
//CMPP数据包的缓冲区
char szcmppdata[1024];
ZeroMemory(&szcmppdata,sizeof(szcmppdata));
// ZeroMemory(&struct_cmpp_submit.szSrc_terminal_id,21);
// strcpy(struct_cmpp_submit.szSrc_terminal_id,gStructSmscInfo.szServiceNo);
//包长度最后处理...(在别的函数中处理)
//处理消息编码
switch(struct_cmpp_submit.cMsg_Fmt)
{
case 0:
{
}break;
case 2://PDU
case 246:
{
WORD msglen=struct_cmpp_submit.wMsg_Length;
msglen = ntohs(msglen);
char tem;
struct_cmpp_submit.szMsg_Content[msglen]='\0';
//转换为大写
_strupr(struct_cmpp_submit.szMsg_Content);
//检查PDU的编码合法性
int maxlen=strlen(struct_cmpp_submit.szMsg_Content);
for(int i=0;i<maxlen;i++)
{
tem=struct_cmpp_submit.szMsg_Content[i];
if((tem<'0')||((tem>'9')&&(tem<'A'))||(tem>'H'))
{
LogErr("收到的PDU码有误,无法转换");
return FALSE;
}
}
//转换为二进制码
convPDUToBin( struct_cmpp_submit.szMsg_Content, &msglen );
struct_cmpp_submit.cMsg_Fmt = 2;
struct_cmpp_submit.wMsg_Length = htons(msglen);
struct_cmpp_submit.sHeader.dwTotal_Length= 132 + msglen;
}break;
case 4://二进制码,不转,直接传送
{
}
break;
case 8: //汉字UNICODE编码
{
//不转换,直接透传
}break;
case 15://CMPP 的GB汉字
{
struct_cmpp_submit.cMsg_Fmt = 15;
//unsigned char msglen=( unsigned char )ntohs(struct_cmpp_submit.wMsg_Length);
//convCToUnicode(struct_cmpp_submit.szMsg_Content,&msglen);
//struct_cmpp_submit.wMsg_Length=msglen;
}break;
default:
LogErr("<--P 收到的消息编码有误,无法识别");
return FALSE;
}
UINT bufLen = struct_cmpp_submit.sHeader.dwTotal_Length;
struct_cmpp_submit.sHeader.dwTotal_Length = htonl(bufLen);
//是否要状态报告,取大包数据
//struct_cmpp_submit.cRegistered_Delivery=struct_submit_head->cCredibility_Transmit;
if(struct_cmpp_submit.cRegistered_Delivery!=2)
struct_cmpp_submit.cRegistered_Delivery=struct_submit_head->cCredibility_Transmit;
//优先级,取大包的
struct_cmpp_submit.cMsg_Level=struct_submit_head->cPriority_Flag;
//原电话号码
if(strlen(struct_cmpp_submit.szSrc_terminal_id)==0)
strcpy(struct_cmpp_submit.szSrc_terminal_id,gStructSmscInfo.szServiceNo);
//组成CMPP12包
//bufLen=MakeCMPP12Buf(szcmppdata,&struct_cmpp_submit,CMPP12_SUBMIT);
SUBMIT submit;
ZeroMemory(&submit,sizeof submit);
submit.sHeader.Command_ID=htonl(0x3);
//changed by shijijiang
//福建联通协议SGIP1.2,按SGIP协议添加序列号。原节点编号(4字节)+时间(12字节)+序号(4字节)
//第一部分
//原节点编号 3AAAAQQQQQ 3055122003 福建区号0591 特符号 23008
//submit.sHeader.Sequence_ID.srcseq=htonl(0xb4e82629); //原节点编号:3059123008
submit.sHeader.Sequence_ID.srcseq=htonl(3059123008); //原节点编号:3059123008
//第二部分:时间
time_t datetime;
time( &datetime );
char temp[12];
strftime(&temp[0], 12, "%m%d%H%M%S",localtime(&datetime));
unsigned long ldatetime;
ldatetime=atol(temp);
submit.sHeader.Sequence_ID.systime=htonl(ldatetime);
//第三部分:序号
submit.sHeader.Sequence_ID.seq = struct_submit_head->sHeader.dwSeqNo;
memcpy(submit.SPNumber,struct_cmpp_submit.szSrc_terminal_id,21);
if(struct_cmpp_submit.szDest_terminal_ids[0]=='8')
memcpy(submit.ChargeNumber,struct_cmpp_submit.szDest_terminal_ids,15);
else
{
memcpy(submit.ChargeNumber,"86",2);
memcpy(&submit.ChargeNumber[2],struct_cmpp_submit.szDest_terminal_ids,12);
}
submit.UserCount=1;
memcpy(submit.UserNumber,submit.ChargeNumber,15);
memcpy(submit.CorpId,gStructSmscInfo.szCorpID,5);//???
memcpy(submit.ServiceType,struct_cmpp_submit.szService_ID,10);
char szTemp[10];
ZeroMemory(szTemp, sizeof(szTemp));
strncpy(szTemp,struct_cmpp_submit.szFeeType,2);
submit.FeeType = (BYTE)(atoi(szTemp));
memcpy(submit.FeeValel,struct_cmpp_submit.szFeeCode,6);
//???待定
submit.GivenValue;//
submit.AgentFlag;//
submit.Priority;//
//???待定
//腾瑞通协议更改见协议类型转义
submit.MorelatetoMTflag = struct_submit_head->cProtocol_Type >> 4;
memcpy(&submit.ExpireTime[0],struct_cmpp_submit.szValid_Time,16);//
memcpy(&submit.ScheduleTime[0],struct_cmpp_submit.szAt_Time,16);//
submit.ReportFlag=2;
submit.TP_pid = struct_cmpp_submit.cTP_pid;//
submit.TP_udhi = struct_cmpp_submit.cTP_udhi;//
submit.MessageCoding=struct_cmpp_submit.cMsg_Fmt;
submit.MessageType;//
submit.MessageLength=htonl((long)ntohs(struct_cmpp_submit.wMsg_Length));
// submit.MessageLength=(long)cmpp_sub.Msg_Length;
memcpy(submit.MessageContent,struct_cmpp_submit.szMsg_Content,160);
submit.Reserve;//
int y=sizeof(submit)-sizeof(submit.MessageContent)+ntohl(submit.MessageLength);
submit.sHeader.Total_Length=htonl(y);
memset(submit.Reserve, '\0', sizeof(submit.Reserve));
memcpy(submit.Reserve, struct_cmpp_submit.szReserve, sizeof(struct_cmpp_submit.szReserve));
if(struct_cmpp_submit.cRegistered_Delivery == 2)
{
submit.ReportFlag = 3;
}
else if(struct_cmpp_submit.cRegistered_Delivery == 1)
{
submit.ReportFlag = 1;
}
else if(struct_cmpp_submit.cRegistered_Delivery == 0)
{
submit.ReportFlag = 2;
}
{
char s[1000];
sprintf(s, "MOFlag:%d REFlag:%d FeeType:%d FeeValue:%06s", submit.MorelatetoMTflag, submit.ReportFlag, submit.FeeType, submit.FeeValel);
LogErr(s);
}
#ifdef FUJIAN
// if(submit.ServiceType[0] != '-')
// submit.MorelatetoMTflag = 1;
if(stricmp((char*)submit.ServiceType,"-YJ") == 0)
//李健修改 手机信箱6元改5元
//strcpy((char*)submit.FeeValel,"000600");
strcpy((char*)submit.FeeValel,"000500");
#endif
/* for(int i=0;i<127;i++)
{
if(strcmp(gszExchangeFees[i],"END") == 0)
break;
if(strncmp(gszExchangeFees[i],(char*)submit.ServiceType,strlen(gszExchangeFees[i])) == 0)
{
if(struct_cmpp_submit.cRegistered_Delivery == 2)
{
strncpy((char*)submit.FeeValel,&gszAddPackets[i][strlen(gszAddPackets[i])+1],6);
break;
}
}
}*/
TRACE("SEQ:%d\r\n",submit.sHeader.Sequence_ID.seq);
//发送短消息到短信中心
if(CmppEntity.SendToTcp((char*)&submit,ntohl(submit.sHeader.Total_Length)) == FALSE)
{
CmppEntity.MsgQue.push(szUDPTmp,nUDPTmp);
return FALSE;
}
return TRUE;
}
//短消息查询数据包,平台2.1实现,协议版本2.2实现查询操作
BOOL TMSG_CENTER::PT_Query(char buf[],UINT nbufLen)
{
return FALSE;
}
void TMSG_CENTER::SgipServer_MsgProc(char *buf)
{
SGIP_MSGHEAD *sgip_msg_head=(SGIP_MSGHEAD*)buf;
UINT nCommandID=sgip_msg_head->Command_ID;
int nMsgLen=ntohl(sgip_msg_head->Total_Length);
LogMsg(buf);//数出输出消息
switch(ntohl(nCommandID))
{
case SGIP_DELIVERY:
MoAdd();
SGIP_Deliver(buf,nMsgLen);
break;
case SGIP_REPORT:
SGIP_Report(buf,nMsgLen);
break;
default:
TRACE("ERROR COMMAND");
break;
}
return ;
}
void TMSG_CENTER::CmppLink_MsgProc(char *buf)
{
//因为网关的ZSOCKET是网络字节,所以要转换成主机字节
STRUCT_CMPP12_MSG_HEADER *cmpp_msg_head=(STRUCT_CMPP12_MSG_HEADER*)buf;
UINT nCommandID=cmpp_msg_head->dwCommand_ID;
int nMsgLen=ntohl(cmpp_msg_head->dwTotal_Length);
LogMsg(buf);//数出输出消息
switch(ntohl(nCommandID))
{
case CMPP12_DELIVERY:
MoAdd();
CMPP12_Deliver(buf,nMsgLen);
break;
case CMPP12_SUBMIT_REP:
CMPP12_SubmitRep(buf,nMsgLen);
break;
case CMPP12_QUERY_REP:
CMPP12_QueryRep(buf,nMsgLen);
break;
default:
TRACE("ERROR COMMAND");
break;
}
return ;
}
//#define HF_CHANNEL
//短信下发消息
BOOL TMSG_CENTER::CMPP12_Deliver(void* buf,UINT nBufLen)
{
//检查数据包是否正确
if(buf==NULL || nBufLen<=0)
return FALSE;
char* pbuf=(char*)buf;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -