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

📄 sendmessage.cpp

📁 短信网管的原代码。用于与sp通信
💻 CPP
字号:
// SendMessage.cpp : implementation file
//

#include "stdafx.h"
#include "PTChannel.h"
#include "SendMessage.h"

#include "StrSplitter.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CPTChannelApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CSendMessage dialog


CSendMessage::CSendMessage(CWnd* pParent /*=NULL*/)
	: CDialog(CSendMessage::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSendMessage)
	m_intAppID = 0;
	m_strFeeCode = _T("10");
	m_strFeeType = _T("01");
	m_intMsgLevel = 0;
	m_strMsgSrc = _T("601");//信息内容来源设置为0
	m_intPlatID = 0;
	m_intPriority = 0;
	m_strServiceID = _T("2000");
	m_strSim = _T("13143340377");
	m_strSrcTerminal = _T("8029");
	m_strMessage = _T("8029 test");
	m_strMsgFmt = _T("0");
	m_strChannelID = _T("");
	m_strTelNo = _T("2");
	m_intReturnStatus = 0;
	//}}AFX_DATA_INIT
}


void CSendMessage::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSendMessage)
	DDX_Text(pDX, IDC_SEND_APPID, m_intAppID);
	DDX_Text(pDX, IDC_SEND_FEECODE, m_strFeeCode);
	DDV_MaxChars(pDX, m_strFeeCode, 6);
	DDX_Text(pDX, IDC_SEND_FEETYPE, m_strFeeType);
	DDV_MaxChars(pDX, m_strFeeType, 2);
	DDX_Text(pDX, IDC_SEND_MSGLEVEL, m_intMsgLevel);
	DDX_Text(pDX, IDC_SEND_MSGSRC, m_strMsgSrc);
	DDV_MaxChars(pDX, m_strMsgSrc, 6);
	DDX_Text(pDX, IDC_SEND_PLATID, m_intPlatID);
	DDX_CBIndex(pDX, IDC_SEND_PRIORITY, m_intPriority);
	DDX_Text(pDX, IDC_SEND_SERVICEID, m_strServiceID);
	DDV_MaxChars(pDX, m_strServiceID, 10);
	DDX_Text(pDX, IDC_SEND_SIM, m_strSim);
	DDV_MaxChars(pDX, m_strSim, 21);
	DDX_Text(pDX, IDC_SEND_SRCTERMINAL, m_strSrcTerminal);
	DDV_MaxChars(pDX, m_strSrcTerminal, 21);
	DDX_Text(pDX, IDC_SEND_MESSAGE, m_strMessage);
	DDV_MaxChars(pDX, m_strMessage, 160);
	DDX_CBString(pDX, IDC_SEND_MSGFMT, m_strMsgFmt);
	DDV_MaxChars(pDX, m_strMsgFmt, 2);
	DDX_CBString(pDX, IDC_SEND_CHANNELID, m_strChannelID);
	DDX_CBString(pDX, IDC_SEND_TELNO, m_strTelNo);
	DDX_Radio(pDX, IDC_RADIO1, m_intReturnStatus);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSendMessage, CDialog)
	//{{AFX_MSG_MAP(CSendMessage)
	ON_BN_CLICKED(IDC_SEND, OnSend)
	ON_BN_CLICKED(IDC_CLEAR, OnClear)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSendMessage message handlers

void CSendMessage::PostNcDestroy() 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CDialog::PostNcDestroy();
}

void CSendMessage::OnCancel() 
{
	ShowWindow(FALSE);

}

void CSendMessage::OnSend() 
{
	//发送短消息函数

	//从对话框中获得输入的短消息相关数据
	//检查输入数据的正确性

	BOOL bOK=UpdateData();

	if(!bOK) 
		return;

	//sim_id
	CString SimID=m_strSim;
	if(SimID.IsEmpty())//如果sim卡号为空
	{
		AfxMessageBox("SIM卡号码为空,请输入SIM卡号");
		return;
	}

	//message format
	if(m_strMsgFmt.IsEmpty())
	{
		AfxMessageBox("信息格式为空,请选择信息格式");
		return;
	}
	int msgFmt=atoi(m_strMsgFmt);//信息格式

	//source terminal id
	CString SrcTerminal=m_strSrcTerminal;
	if(SrcTerminal.IsEmpty())
	{
		AfxMessageBox("源SIM卡号为空,请输入源SIM卡号");
		return;
	}

	//service id
	CString Service_ID=m_strServiceID;
	if(Service_ID.IsEmpty())
	{
		AfxMessageBox("业务类型为空,请输入业务类型");
		return;
	}

	//fee type
	CString FeeType=m_strFeeType;
	if(FeeType.IsEmpty())
	{
		AfxMessageBox("资费类型为空,请输入资费类型");
		return;
	}

	//fee code
	CString FeeCode=m_strFeeCode;
	if(FeeCode.IsEmpty())
	{
		AfxMessageBox("资费代码为空,请输入资费代码");
		return;
	}

	//message level
	if(m_intMsgLevel<0)
	{
		AfxMessageBox("信息级别为空,请输入信息级别");
		return;
	}
	//message source(icp_id)
	CString Msg_Src=m_strMsgSrc;

	//channel type
	short ChannelID=atoi(m_strChannelID);
	if(ChannelID<0)
	{
		AfxMessageBox("通道类型为空,请选择通道类型");
		return;
	}

	if(m_intPlatID<0)
	{
		AfxMessageBox("平台ID为空,请输入平台ID");
		return;
	}

	if(m_intAppID<0)
	{
		AfxMessageBox("应用ID为空,请输入应用ID");
		return;
	}

	if(m_intPriority<0)
	{
		AfxMessageBox("优先级为空,请选择优先级");
		return;
	}

	CString TelNo=m_strTelNo;
	if(TelNo.IsEmpty())
	{
		AfxMessageBox("电信运营商为空,请选择电信运营商");
		return;
	}

	if(m_intReturnStatus<0)
	{
		AfxMessageBox("是否需要状态报告为空,请选择是否需要状态报告");
		return;
	}

	//状态转换
	if(m_intReturnStatus==0)
		m_intReturnStatus=1;
	else
		m_intReturnStatus=0;

	CString Reserve="00000000";//保留字段

	//message body
	CString Message=m_strMessage;
	if(Message.IsEmpty())
	{
		AfxMessageBox("消息体为空,请输入要发送的消息");
		return;
	}

	int MessageLength=Message.GetLength();

	switch(msgFmt)
	{
	case 0 : //不含中文时消息体可为160字节长
		{
			if(MessageLength>160)
			{
				CString messageTemp=Message;
				Message=messageTemp.Left(160);//取前160字节
			}
		}
		break;

	case 8  ://如果含有中文时
	case 15 :
		{
			if(MessageLength>140)//如果短消息体长度大于140字节,则取前140字节字符
			{
				CString messageTemp=Message;
				Message=messageTemp.Left(140);//取前140字节
			}
		}

		break;
	}

	char AtTime[17];

	for(int i=0;i<=17;i++)
	{
		AtTime[i]='\0';
	}

	//处理cmpp协议,对短消息打cmpp包

	STRUCT_CMPP12_SUBMIT cmpp_submit;//定义结构对象

	ZeroMemory(&cmpp_submit,sizeof(STRUCT_CMPP12_SUBMIT));

	cmpp_submit.n64Msg_ID=TRP_TESTMSG_SEQID;//msg id
	cmpp_submit.cPk_total=1;
	cmpp_submit.cPk_number=1;
	cmpp_submit.cRegistered_Delivery=m_intReturnStatus;//是否状态报告
	cmpp_submit.cMsg_Level=m_intMsgLevel;
	strncpy(cmpp_submit.szService_ID,Service_ID,Service_ID.GetLength());
	cmpp_submit.cFee_UserType=0;
//	cmpp_submit.szFee_terminal_ID;
	cmpp_submit.cTP_pid=0;
	cmpp_submit.cTP_udhi=0;
	cmpp_submit.cMsg_Fmt=msgFmt;
	strncpy(cmpp_submit.szMsg_src,Msg_Src,Msg_Src.GetLength());
	strncpy(cmpp_submit.szFeeType,FeeType,FeeType.GetLength());
	strncpy(cmpp_submit.szFeeCode,FeeCode,FeeCode.GetLength());
	memcpy(cmpp_submit.szValid_Time,AtTime,17);
	memcpy(cmpp_submit.szAt_Time,AtTime,17);
	strncpy(cmpp_submit.szSrc_terminal_id,SrcTerminal,SrcTerminal.GetLength());
	cmpp_submit.cDestUsr_tl=1;
	strncpy(cmpp_submit.szDest_terminal_ids,SimID,SimID.GetLength());
	cmpp_submit.wMsg_Length=htons(Message.GetLength());
	strncpy(cmpp_submit.szMsg_Content,Message,Message.GetLength());

	char CmppSubmit[512];//定义CMPP包的缓冲区

	//调用打CMPP包的函数,打CMPP包
	Make_CMPP_Submit(CmppSubmit,&cmpp_submit);

	//处理腾瑞通平台内部协议,打大包

	char TRUnidataReq[512];//定义大包的缓冲区
	unsigned long  TRUnidataReqLen;//定义大包的长度

	STRUCT_SUBMIT_HEADER unidataReqHead;//定义大包的消息头结构
	ZeroMemory(&unidataReqHead,sizeof(STRUCT_SUBMIT_HEADER));

	CString serviceNumber=gStructSmscInfo.szServiceNo;

	unidataReqHead.cChannel_Protocol=CMPP12_PROTOCOL_TYPE;//通道协议
	unidataReqHead.cCredibility_Transmit=m_intReturnStatus;//是否返回状态报告
	unidataReqHead.cPriority_Flag=m_intPriority;//priority
	unidataReqHead.cProtocol_Type=CMPP12_PROTOCOL_TYPE;//
	unidataReqHead.cRequest_Plat=m_intPlatID;//request plat
	unidataReqHead.cReSubmit_Count=0;//重发次数
	unidataReqHead.cSaveForTramSmit=0;//存储转发标志
	unidataReqHead.cService_ChannelID=unsigned char(ChannelID);
	unidataReqHead.cService_Plat=m_intPlatID;//service plat
	unidataReqHead.cTimeOut=0;//超时时间间隔
	unidataReqHead.cTNO=atoi(TelNo);//电信运营商
	strncpy(unidataReqHead.szService_Number,serviceNumber,serviceNumber.GetLength());//
	unidataReqHead.wAppID=htons(m_intAppID);
//	unidataReqHead.wProtocol_Length=;

	unidataReqHead.sHeader.dwCommandId=htonl(TRP_SUBMIT);
	unidataReqHead.sHeader.dwSeqNo=htonl(TRP_TESTMSG_SEQID);
	unidataReqHead.sHeader.dwStatus=0;
//	unidataReqHead.sHeader.dwTotalLen=;

	//调用打大包的处理函数,打大包
	Make_TRP_UNIDATA_REQ(&TRUnidataReqLen,TRUnidataReq,&unidataReqHead,CmppSubmit);

	//调用发送函数发送短消息到短信网关

	SendMsg2SMC(TRUnidataReqLen,TRUnidataReq);

    ShowWindow(FALSE);
}

void CSendMessage::OnClear() 
{
	// TODO: Add your control notification handler code here

	//清空所有数据
	m_strSim.Empty();
	m_strMessage.Empty();
	m_strMsgSrc.Empty();
	m_strFeeCode.Empty();
	m_strFeeType.Empty();
	m_strServiceID.Empty();
	m_strSrcTerminal.Empty();
	m_strChannelID.Empty();
	m_strTelNo.Empty();
	m_strMsgFmt.Empty();

	UpdateData(false);//刷新对话框
}

///////////////////////////////////////////////////////////////////
// 函数名称:Make_CMPP_Submit()
// 
// 创建时间:2001-8-6
// 功能:    将数据按顺序组成cmpp包
// 修改人:  杨祖明
// 修改时间:2001-9-13
// 修改原因:改版CMPP1.2
///////////////////////////////////////////////////////////////////
void CSendMessage::Make_CMPP_Submit(char *Buf, STRUCT_CMPP12_SUBMIT* content)
{
	//打CMPP包
	StrSplitter	tem;
	STRUCT_CMPP12_MSG_HEADER MsgHead;

	int total=CMPP_MSG_HEAD_LENGTH;
	STRUCT_CMPP12_SUBMIT* structSend=(STRUCT_CMPP12_SUBMIT*)content;
	total=structSend->cDestUsr_tl*21+117+8;//117为消息体到号码的长度,8是reserve
	total=total+2;//消息长度位2
	total=ntohs(structSend->wMsg_Length)+total;
	MsgHead.dwTotal_Length=htonl(total+CMPP_MSG_HEAD_LENGTH);
	MsgHead.dwCommand_ID=htonl(TRP_SUBMIT);//命令字
	MsgHead.dwSequence_ID=htonl(TRP_TESTMSG_SEQID);//消息流水号
	tem.add(MsgHead.dwTotal_Length);
	tem.add(MsgHead.dwCommand_ID);
	tem.add(MsgHead.dwSequence_ID);
	tem.add(structSend->n64Msg_ID);
	tem.add(structSend->cPk_total);
	tem.add(structSend->cPk_number);
	tem.add(structSend->cRegistered_Delivery);
	tem.add(structSend->cMsg_Level);
	tem.add(structSend->szService_ID,10);
	tem.add(structSend->cFee_UserType);
	tem.add(structSend->szFee_terminal_ID,21);
	tem.add(structSend->cTP_pid);
	tem.add(structSend->cTP_udhi);
	tem.add(structSend->cMsg_Fmt);
	tem.add(structSend->szMsg_src,6);
	tem.add(structSend->szFeeType,2);
	tem.add(structSend->szFeeCode,6);
	tem.add(structSend->szValid_Time,17);
	tem.add(structSend->szAt_Time,17);
	tem.add(structSend->szSrc_terminal_id,21);
	tem.add(structSend->cDestUsr_tl);
	tem.add(structSend->szDest_terminal_ids,21);
	tem.add(structSend->wMsg_Length);
	tem.add(structSend->szMsg_Content,ntohs(structSend->wMsg_Length));
	tem.add(structSend->szReserve,8);
	
	memcpy(Buf,(char*)tem.m_str,ntohl(MsgHead.dwTotal_Length));
//	gSequence_ID++;
}

///////////////////////////////////////////////////////////////////
// 函数名称:Make_TRP_UNIDATA_REQ()
// 
// 创建时间:2001-8-6
// 功能:    将数据按顺序组成Unidata包
// 修改人:  杨祖明
// 修改时间:2001-9-13
// 修改原因:改版CMPP1.2
///////////////////////////////////////////////////////////////////
void CSendMessage::Make_TRP_UNIDATA_REQ(unsigned long *BufLen, char *Buf, STRUCT_SUBMIT_HEADER *content, char *CMPP_Packet)
{
	//打大包
	StrSplitter tem;
	STRUCT_TRP_MSG_HEADER TRMsgHead;
	long CmppLen,CmppLocation;
	memcpy((void*)&CmppLen,CMPP_Packet,4);
	CmppLen=ntohl(CmppLen);

	TRMsgHead.dwCommandId=TRP_SUBMIT;
	TRMsgHead.dwSeqNo=TRP_TESTMSG_SEQID;
	TRMsgHead.dwTotalLen=16+21+CmppLen;
	CmppLocation=16+21;
	TRMsgHead.dwStatus=0;
	WORD CMPPLEN=WORD(CmppLen);
	CMPPLEN=htons(CMPPLEN);
	memcpy((void*)&content->wProtocol_Length,&CMPPLEN,2);
	memcpy((void*)BufLen,&(TRMsgHead.dwTotalLen),4);
	tem.add(htonl(TRMsgHead.dwTotalLen));
	tem.add(htonl(TRMsgHead.dwCommandId));
	tem.add(htonl(TRMsgHead.dwSeqNo));
	tem.add(htonl(TRMsgHead.dwStatus));
	tem.add(content->wAppID);
	tem.add(content->cReSubmit_Count);
	tem.add(content->cTNO);
	tem.add(content->cChannel_Protocol);
	tem.add(content->cService_ChannelID);
	tem.add(content->szService_Number,6);
	tem.add(content->cService_Plat);
	tem.add(content->cRequest_Plat);
	tem.add(content->cPriority_Flag);
	tem.add(content->cTimeOut);
	tem.add(content->cCredibility_Transmit);
	tem.add(content->cSaveForTramSmit);
	tem.add(content->cProtocol_Type);
	tem.add(content->wProtocol_Length);
	tem.add(CMPP_Packet,CmppLen);
	
	//gSequence_ID++;
	memcpy(Buf,(char*)tem.m_str,TRMsgHead.dwTotalLen);
}

void CSendMessage::SendMsg2SMC(unsigned long TRUnidataReqLen, char *TRUnidataReq)
{
	char sendbuf[1024];//定义发送缓冲区
	ZeroMemory(sendbuf,1024);//发送缓冲区清零

	UINT CommandID=htonl(TRP_SUBMIT);//命令字
	UINT SequenceID=htonl(TRP_TESTMSG_SEQID);//消息流水号

	memcpy(&sendbuf,TRUnidataReq,TRUnidataReqLen);

	//调用CUnidataProtocolManager类的输入处理函数处理消息数据及向网关发送短消息
	theApp.center->Pt_MsgProc(sendbuf);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -