📄 msg_center.cpp
字号:
STRUCT_CMPP12_MSG_HEADER cmpp_head;
ZeroMemory(&cmpp_head,sizeof(STRUCT_CMPP12_MSG_HEADER));
memcpy(&cmpp_head,pbuf,sizeof(STRUCT_CMPP12_MSG_HEADER));
//回应Deliver消息,MSGID 为空
char szDeliverRep[256];
ZeroMemory(szDeliverRep,sizeof(szDeliverRep));
STRUCT_CMPP12_DELIVER_REP cmpp_deliver_rep;
cmpp_deliver_rep.sHeader.dwCommand_ID=htonl(CMPP12_DELIVERY_REP);
cmpp_deliver_rep.sHeader.dwSequence_ID=cmpp_head.dwSequence_ID;
cmpp_deliver_rep.sHeader.dwTotal_Length=htonl(21);
cmpp_deliver_rep.Result=0;
memcpy(&cmpp_deliver_rep.Msg_ID,&pbuf[12],8);
memcpy(&szDeliverRep,&cmpp_deliver_rep,21);
//发送回应消息
CmppEntity.SendToTcp(szDeliverRep,21);
//包头信息
UINT SeqNo=ntohl(cmpp_head.dwSequence_ID);
//待发送的缓冲
char szbuf[1024];
ZeroMemory(szbuf,sizeof(szbuf));
//定义CMPP 小包结构体
STRUCT_CMPP12_DELIVERY cmpp_deliver;
ZeroMemory(&cmpp_deliver,sizeof(STRUCT_CMPP12_DELIVERY));//整个结构清零
//调用解析函数将数据包解析为cmpp数据结构
//cmpp为定长数据包
GetCMPP12DataFromBuf(&cmpp_deliver,pbuf,CMPP12_DELIVERY);
//CMPP 数据包的长度
UINT cmppPackLength=0;
int SendStatus=0;//状态报告
//CMPP 包体
//如果为状态报告,则不用解码,发送状态报告到应用系统模块
if(cmpp_deliver.cRegistered_Delivery)
{
//取出状态报告
char szMsgStatus[7];//消息状态
ZeroMemory(szMsgStatus,sizeof(szMsgStatus));
memcpy(szMsgStatus,&cmpp_deliver.Msg_Content[8],7);
SendStatus=atoi(szMsgStatus);
//状态码需要找intech确定
//在这里将状态码转换成平台统一的状态码
DWORD dwStatus=0;
switch(SendStatus)
{
case 0:
dwStatus=E_DELIVED;
break;
case 0x00001001:
dwStatus=E_EXPIRED;
break;
case 0x00001002:
dwStatus=E_DELETED;
break;
case 27:
dwStatus=E_UNDELIV;
break;
case 0x00001004:
dwStatus=E_ACCEPTD;
break;
case 0x00001005:
dwStatus=E_REJECTD;
break;
default:
dwStatus=E_UNKNOWN;
}
//定义UNIDATA大包,并填写大包包头
STRUCT_MSG_REPORT app_report;
ZeroMemory(&app_report,sizeof(STRUCT_MSG_REPORT));
app_report.sMsgReportToApp.sHeader.dwSeqNo=ntohl(cmpp_deliver.sHeader.dwSequence_ID);
app_report.sMsgReportToApp.sHeader.dwCommandId=htonl(TRP_MSG_REPORT);
app_report.sMsgReportToApp.sHeader.dwStatus=htonl(SendStatus);
app_report.sMsgReportToApp.sHeader.dwTotalLen=htonl(strlen(app_report.sMsgID.szMsgID)+35);
app_report.sMsgReportToApp.cChannel_Protocol=TRP_PROTOCOL_CMPP12;
// app_report.sMsgReportToApp.cRequest_Plat;
// app_report.sMsgReportToApp.cService_ChannelID;
// app_report.sMsgReportToApp.cService_Plat;
app_report.sMsgReportToApp.cTNO=1;
// app_report.sMsgReportToApp.dwPlat_MsgID=;
// app_report.sMsgReportToApp.wAppID;
strncpy(app_report.sMsgReportToApp.szService_Number,gStructSmscInfo.szServiceNo,6);
//状态报告使用msg id来对应,submitrep和deliver status的msg id 相同
sprintf(app_report.sMsgID.szMsgID,"%d",cmpp_deliver.n64Msg_ID);
app_report.sMsgID.cMsgID_Length=strlen(app_report.sMsgID.szMsgID);
app_report.sMsgID.cMsgID_Type=3;
//拷贝到缓冲区
memcpy(szbuf,&app_report,sizeof(STRUCT_MSG_REPORT));
PtEntity.SendToTcp(szbuf,ntohl(app_report.sMsgReportToApp.sHeader.dwTotalLen));
}
else //如果不是状态报告
{
cmpp_deliver.cRegistered_Delivery=0;
cmpp_deliver.n64Msg_ID=-1;//-1表示Deliver消息
//如果为下发消息,则处理编码问题,处理编码与长度,内容字段
switch(cmpp_deliver.cMsg_Fmt)
{
//
case 0://文本..
case 15:
{
char msgContent[512];
memcpy(msgContent,cmpp_deliver.Msg_Content,cmpp_deliver.wMsg_Length);
#ifdef HF_CHANNEL
//获得目标手机号码
CString PacketAndDestSimID;
PacketAndDestSimID.Format("HF%s",struct_smpp_deliver.szDest_addr);//添加包头“HF”+目标手机号码
int packetLen=PacketAndDestSimID.GetLength();//获得长度
memcpy(cmpp_deliver.Msg_Content,PacketAndDestSimID,packetLen);//添加包头“HF”+目标手机号码:dest ms isdn
memcpy(&cmpp_deliver.Msg_Content[packetLen],msgContent,cmpp_deliver.wMsg_Length);
cmpp_deliver.wMsg_Length=cmpp_deliver.wMsg_Length+packetLen;
#else
//如果是mo专用通道则添加包头
if(gStructChannelInfo.nSpFlag==1)
{
memcpy(cmpp_deliver.Msg_Content,&gStructChannelInfo.nPacket,2);
memcpy(&cmpp_deliver.Msg_Content[2],msgContent,cmpp_deliver.wMsg_Length);
cmpp_deliver.wMsg_Length=cmpp_deliver.wMsg_Length+2;
}
else
{
char *packet=CheckPacketInBuf(cmpp_deliver.Msg_Content);
if(packet!=NULL)
{
memcpy(cmpp_deliver.Msg_Content,packet,2);
memcpy(&cmpp_deliver.Msg_Content[2],msgContent,cmpp_deliver.wMsg_Length);
cmpp_deliver.wMsg_Length=cmpp_deliver.wMsg_Length+2;
}
}
#endif
}break;
case 0xf5://PDU...
case 246:
case 2:
{
//如果是mo专用通道则添加包头
if(gStructChannelInfo.nSpFlag==1)
{
char msgContent[512];
memcpy(msgContent,cmpp_deliver.Msg_Content,cmpp_deliver.wMsg_Length);
char packet[4];
ZeroMemory(packet,4);
unsigned short nPacket=0;
nPacket=ntohs(gStructChannelInfo.nPacket);
for(int i=0;i<2;i++)
{
char* p=(char*)&nPacket;
packet[i+i+1]=GetHex(p[i]&0x0f);
packet[i+i]=GetHex(p[i]>>4&0x0f);
}
memcpy(cmpp_deliver.Msg_Content,packet,4);
byteToStr(msgContent, (unsigned char)cmpp_deliver.wMsg_Length,&cmpp_deliver.Msg_Content[4]);
cmpp_deliver.wMsg_Length=2*(cmpp_deliver.wMsg_Length)+4;
cmpp_deliver.cMsg_Fmt=2;
}
else
{
byteToStr(cmpp_deliver.Msg_Content, (unsigned char)cmpp_deliver.wMsg_Length,cmpp_deliver.Msg_Content);
cmpp_deliver.wMsg_Length=2*(cmpp_deliver.wMsg_Length);
cmpp_deliver.cMsg_Fmt=2;
}
}break;
case 4://二进制编码,不转换,透传
{
//如果是mo专用通道则添加包头
if(gStructChannelInfo.nSpFlag==1)
{
char msgContent[512];
memcpy(msgContent,cmpp_deliver.Msg_Content,cmpp_deliver.wMsg_Length);
memcpy(cmpp_deliver.Msg_Content,&gStructChannelInfo.nPacket,2);
memcpy(&cmpp_deliver.Msg_Content[2],msgContent,cmpp_deliver.wMsg_Length);
cmpp_deliver.wMsg_Length=cmpp_deliver.wMsg_Length+2;
}
}break;
case 8://UNICODE...
{
//网络字节转换
unsigned short *p = (unsigned short *)cmpp_deliver.Msg_Content;
int Msg_Length=cmpp_deliver.wMsg_Length;
for(int i=0; i < Msg_Length/2; i++,p++)
*p = ntohs(*p);
//UNICODE转换为ANSI
int length = WideCharToMultiByte(CP_ACP, 0, (WCHAR *)cmpp_deliver.Msg_Content, Msg_Length/2, NULL, 0,NULL,NULL);
char szMsgContent[512];
ZeroMemory(szMsgContent,sizeof(szMsgContent));
#ifdef HF_CHANNEL
//获得目标手机号码
CString PacketAndDestSimID;
PacketAndDestSimID.Format("HF%s",cmpp_deliver.szDestinationID);//添加包头“HF”+目标手机号码
int packetLen=PacketAndDestSimID.GetLength();//获得长度
WideCharToMultiByte(CP_ACP, 0, (WCHAR *)cmpp_deliver.Msg_Content, Msg_Length/2, szMsgContent, length,NULL,NULL);
memcpy(cmpp_deliver.Msg_Content,PacketAndDestSimID,packetLen);
memcpy(&cmpp_deliver.Msg_Content[packetLen],szMsgContent,length);
cmpp_deliver.wMsg_Length=length+packetLen;
cmpp_deliver.cMsg_Fmt=15;
#else
if(gStructChannelInfo.nSpFlag==1)
{
WideCharToMultiByte(CP_ACP, 0, (WCHAR *)cmpp_deliver.Msg_Content, Msg_Length/2, szMsgContent, length,NULL,NULL);
memcpy(cmpp_deliver.Msg_Content,&gStructChannelInfo.nPacket,2);
memcpy(&cmpp_deliver.Msg_Content[2],szMsgContent,length);
cmpp_deliver.wMsg_Length=length+2;
cmpp_deliver.cMsg_Fmt=15;
}
else
{
char *packet=CheckPacketInBuf(cmpp_deliver.Msg_Content);
if(packet!=NULL)
{
WideCharToMultiByte(CP_ACP, 0, (WCHAR *)cmpp_deliver.Msg_Content, Msg_Length/2, szMsgContent, length,NULL,NULL);
memcpy(cmpp_deliver.Msg_Content,packet,2);
memcpy(&cmpp_deliver.Msg_Content[2],szMsgContent,length);
cmpp_deliver.wMsg_Length=length+2;
cmpp_deliver.cMsg_Fmt=15;
}
else
{
WideCharToMultiByte(CP_ACP, 0, (WCHAR *)cmpp_deliver.Msg_Content, Msg_Length/2, cmpp_deliver.Msg_Content, length,NULL,NULL);
cmpp_deliver.wMsg_Length=length;
cmpp_deliver.cMsg_Fmt=15;
}
}
#endif
}break;
default:
{
if(gStructChannelInfo.nSpFlag==1)
{
char msgContent[512];
memcpy(msgContent,cmpp_deliver.Msg_Content,cmpp_deliver.wMsg_Length);
memcpy(cmpp_deliver.Msg_Content,&gStructChannelInfo.nPacket,2);
memcpy(&cmpp_deliver.Msg_Content[2],msgContent,cmpp_deliver.wMsg_Length);
cmpp_deliver.wMsg_Length=cmpp_deliver.wMsg_Length+2;
}
}
break;
}
//组建UNIDATA数据包
STRUCT_DELIVERY_HEADER app_ind_head;
ZeroMemory(&app_ind_head,sizeof(STRUCT_DELIVERY_HEADER));//清零
cmpp_deliver.wMsg_Length=htons(cmpp_deliver.wMsg_Length);
cmppPackLength=86+ntohs(cmpp_deliver.wMsg_Length);
//UNIDATA数据包头 长度最后算
app_ind_head.sHeader.dwSeqNo=cmpp_deliver.sHeader.dwSequence_ID;
app_ind_head.sHeader.dwCommandId=htonl(TRP_DELIVERY);
app_ind_head.sHeader.dwStatus=htonl(SendStatus);
app_ind_head.sHeader.dwTotalLen=htonl(sizeof(STRUCT_DELIVERY_HEADER)+cmppPackLength);
app_ind_head.cChannel_Protocol=TRP_PROTOCOL_CMPP12;
// app_ind_head.cOriginate_Plat=;
app_ind_head.cProtocol_Type=TRP_PROTOCOL_CMPP12;
// app_ind_head.cReDelivery_Count=;
// app_ind_head.cService_ChannelID=;
// app_ind_head.cService_Plat=;
app_ind_head.cTNO=1;
strncpy(app_ind_head.szService_Number,gStructSmscInfo.szServiceNo,6);
// app_ind_head.wAppID=;
app_ind_head.wProtocol_Length=htons(cmppPackLength);
//拷贝包头
memcpy(szbuf,&app_ind_head,sizeof(STRUCT_DELIVERY_HEADER));
//拷贝CMPP包体cmpp_deliver
memcpy(&szbuf[sizeof(STRUCT_DELIVERY_HEADER)],&cmpp_deliver,cmppPackLength);
PtEntity.SendToTcp(szbuf,ntohl(app_ind_head.sHeader.dwTotalLen));
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
//函数名称:MakeCMPP12Buf()
//
//创建时间:2001-9-15
//函数功能:把CMPP1.2数据结构转换成为CMPP1.2数据包,
// 数据包长度要在此函数中处理,返回数据包的总长度。
//////////////////////////////////////////////////////////////////////////////
UINT TMSG_CENTER::MakeCMPP12Buf(char* OutBuf,void* InputStruct,UINT nCommandId)
{
StrSplitter strsplitter;
switch(nCommandId)
{
case CMPP12_SUBMIT:
{
STRUCT_CMPP12_SUBMIT *pcmpp_submit=(STRUCT_CMPP12_SUBMIT *)InputStruct;
//
unsigned long totalLen=0;
//CMPP1.2 header
strsplitter.add(totalLen);
strsplitter.add((unsigned long)pcmpp_submit->sHeader.dwCommand_ID);
strsplitter.add((unsigned long)pcmpp_submit->sHeader.dwSequence_ID);
//CMPP1.2 body
strsplitter.add(pcmpp_submit->n64Msg_ID);
strsplitter.add(pcmpp_submit->cPk_total);
strsplitter.add(pcmpp_submit->cPk_number);
strsplitter.add(pcmpp_submit->cRegistered_Delivery);
strsplitter.add(pcmpp_submit->cMsg_Level);
strsplitter.add(pcmpp_submit->szService_ID,10);
strsplitter.add(pcmpp_submit->cFee_UserType);
strsplitter.add(pcmpp_submit->szFee_terminal_ID,21);
strsplitter.add(pcmpp_submit->cTP_pid);
strsplitter.add(pcmpp_submit->cTP_udhi);
strsplitter.add(pcmpp_submit->cMsg_Fmt);
strsplitter.add(pcmpp_submit->szMsg_src,6);
strsplitter.add(pcmpp_submit->szFeeType,2);
strsplitter.add(pcmpp_submit->szFeeCode,6);
strsplitter.add(pcmpp_submit->szValid_Time,17);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -