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

📄 msg_center.cpp

📁 短信网管的原代码。用于与sp通信
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -