📄 sendmessage.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 + -