📄 cmpppdu.h
字号:
// CmppPdu.h: interface for the CCmppPdu class.
//
//////////////////////////////////////////////////////////////////////
#include "TcpSocket.h"
#if !defined(AFX_CMPPPDU_H__B434CDFD_29F5_43B4_9380_3A033EBC8B1A__INCLUDED_)
#define AFX_CMPPPDU_H__B434CDFD_29F5_43B4_9380_3A033EBC8B1A__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//最大包长度
#define MAX_PACKET_SIZE 4096
//最大短信息长度
#define MAX_MESSAGE_LENGTH 1024
#define S_IDLE 0
#define S_WAITANS 1
enum{
CMPP_CONNECT =0x00000001,
CMPP_CONNECT_RESP =0x80000001,
CMPP_TERMINATE =0x00000002,
CMPP_TERMINATE_RESP =0x80000002,
CMPP_SUBMIT =0x00000004,
CMPP_SUBMIT_RESP =0x80000004,
CMPP_DELIVER =0x00000005,
CMPP_DELIVER_RESP =0x80000005,
CMPP_ACTIVE_TEST =0x00000008,
CMPP_ACTIVE_TEST_RESP=0x80000008,
};
enum{
CMPP_DC_ASCII = 0,
CMPP_DC_STK = 3,
CMPP_DC_BIN = 4,
CMPP_DC_UCS2 = 8,
CMPP_DC_GB2312 = 15,
};
typedef struct tagCmppPduHeader
{
unsigned int iTotal_Length; //消息总长度(字节)
unsigned int iCommand_Id; //命令ID
unsigned int iSequence_Id; //序列号
} SCmppPduHeader;
typedef struct tagCmppConnect
{
char sSource_Addr[6]; //源地址,此处为SP_Id,即SP的企业代码。
unsigned char sAuthenticatorSource[16]; //用于鉴别源地址。其值通过单向MD5 hash计算得出
char chVersion; //双方协商的版本号(高位4bit表示主版本号,低位4bit表示次版本号),对于3.0的版本,高4bit为3,低4位为0;对于特殊的双连接网关,mt:0,mo:1
unsigned int iTimestamp; //时间戳的明文,由客户端产生,格式为MMDDHHMMSS,即月日时分秒,10位数字的整型,右对齐
} SCmppConnect;
typedef struct tagCmppConnectResp
{
// unsigned int iStatus; //状态0:正确1:消息结构错 2:非法源地址 3:认证错 4:版本太高 5~ :其他错误
unsigned char iStatus; //状态0:正确1:消息结构错 2:非法源地址 3:认证错 4:版本太高 5~ :其他错误
char sAuthenticatorISMG[16]; //ISMG认证码
char chVersion; //服务器支持的最高版本号
} SCmppConnectResp;
typedef struct tagCmppSubmit{
unsigned char sInMsgId[8]; /* 消息标识 */
unsigned char ucPkTotal; /* 信息总条数 */
unsigned char ucPkNumber; /* 消息序号 */
unsigned char ucRegistered_Delivery; /* 是否要求返回状态确认报告:0:不需要;1:需要。 */
unsigned char ucMsg_level; /* 信息级别 */
char sServiceId[10]; /* 业务类型 */
char cFee_UserType; //计费用户类型字段:0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
char szFee_terminal_Id[21]; //被计费用户的号码,当Fee_UserType为3时该值有效,当Fee_UserType为0、1、2时该值无意义。
// char cFee_terminal_type; //被计费用户的号码类型,0:真实号码;1:伪码。
char cTP_pid; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
char cTP_udhi; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
char cMsg_Fmt; /* 短消息的编码格式。
0:纯ASCII字符串
3:写卡操作
4:二进制编码
8:UCS2编码
15: GBK编码
其它参见GSM3.38第4节:SMS Data Coding Scheme
*/
char szMsg_src[6]; //信息内容来源(SP_Id)
char cFeeType[2]; //计费类型
char szFeeCode[6]; //该条短消息的收费值,单位为分,由SP定义,对于包月制收费的用户,该值为月租费的值(范围0-99999)
char szExpireTime[17]; //短消息寿命的终止时间,如果为空,表示使用短消息中心的缺省值。
//时间内容为16个字符,格式为"yymmddhhmmsstnnp" ,其中"tnnp"取固定值"032+",即默认系统为北京时间
char szScheduleTime[17]; //短消息定时发送的时间,如果为空,表示立刻发送该短消息。时间内容为16个字符,格式为"yymmddhhmmsstnnp" ,其中"tnnp"取固定值"032+",即默认系统为北京时间
char szSrc_Id[21]; //源号码。SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码。
char cDestUsr_tl; //接收信息的用户数量(小于100个用户)
char szDest_terminal_Id[21]; //接收短信的MSISDN号码
// char cDest_terminal_type; //收短信的用户的号码类型,0:真实号码;1:伪码。
char nMessageLength; //短消息的长度
char szMessageContent[MAX_MESSAGE_LENGTH]; //短消息的内容
char szLinkID[8]; //点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。
}SCmppSubmit;
typedef struct tagCmppSubmitResp
{
// small slMsgID[8];
unsigned char szMsg_Id[8]; //信息标识
unsigned char iResult; //保留,扩展用
} SCmppSubmitResp;
typedef struct tagCmppDeliver
{
unsigned char szMsg_Id[8]; //信息标识
char szDest_Id[21]; //目的号码。
char szService_Id[10]; //业务标识
char cTP_pid; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
char cTP_udhi; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
char cMessageCoding; /* 短消息的编码格式。
0:纯ASCII字符串
3:写卡操作
4:二进制编码
8:UCS2编码
15: GBK编码
其它参见GSM3.38第4节:SMS Data Coding Scheme
*/
char szSrc_terminal_Id[21]; //源终端MSISDN号码(状态报告时填为CMPP_SUBMIT消息的目的终端号码)。
// char cSrc_terminal_type; //源终端号码类型,0:真实号码;1:伪码。
char cRegistered_Delivery; //是否为状态报告:0:非状态报告;1:状态报告。
char nMessageLength; //短消息的长度
char szMessageContent[MAX_MESSAGE_LENGTH]; //短消息的内容
char szLinkID[8]; //点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。
} SCmppDeliver;
#define PDU_HEADER_SIZE sizeof(SCmppPduHeader)
typedef struct tagCmppDeliverResp
{
unsigned char szMsg_Id[8]; //信息标识
unsigned int iResult; //保留,扩展用
} SCmppDeliverResp;
typedef struct tagCmppReport
{
char szMsg_Id[8]; //信息标识
char szStat[7]; //发送短信的应答结果,含义详见表一。SP根据该字段确定CMPP_SUBMIT消息的处理状态。
char szSubmit_time[10]; //
char szDone_time[10]; //
char szDest_terminal_Id[21]; //目的终端MSISDN号码
int iSMSC_sequence; //
} SCmppReport;
BOOL IsDigital(char cSrc);
int UnicodeToAnsi(char *szSourceCode, int nSourceLen, char *szDestCode);
CString TrimStr(CString strSrc);
int ReceivePdu(CTcpAsyncSocket* pstSocket,char *szRecvBuf,int nMaxLen);
void GetStatusMessage(int commandid,unsigned long status,char * szMessage);
BOOL IncludeChinese(CString strMsg);
void LogFile(const char* szMsg);
extern char WEIMA[100];
//extern char WEIMANEW[100];
class CCmppPdu
{
public:
int m_nTotalLen;
int m_nSequenceNumber;
char m_szBuffer[MAX_PACKET_SIZE];
CString m_strSPNumber;
CString m_strCorpId;
public:
int GetSubmitRespResult(const char *szBuf,CString &strMsgID);
void ActiveTest();
void Terminate();
void InitData(const char* szSPNumber,const char* szCorpId);
void PacketRespHeader(const char* szBuf,int nCommandId,int nTotalLen);
void DeliverResp(const char* szBuf,const char *szMsgID,int result);
char GetConnectResult(const char *szBuf);
void GetHeaderInfo(const char *szBuf,int &nCommandID,int &nSequence);
int GetLen();
unsigned char * GetBuffer();
void PacketHeader(int nCommandId,int nTotalLen);
void ConnectSvr(const char* szLoginName,const char* szLoginPassword);
CCmppPdu();
void SubmitSingle(const char* szUserNumber,const char* szMessageContent,const char* szChargeNumber,
const char* szSender,const char* szServiceType,const char* szLinkID,char cFeeType,const char *szFeeValue,const char* szGivenValue,
const char* szScheduleTime,char cMessageCoding,char cMOrelatetoMTFlag,int iReportFlag=0,int iPriority=0,int iTP_pid=0,int iTP_udhi=0,int iExpireTimeSpan=0,int mobiletype=0,int feenumtype=0);
virtual ~CCmppPdu();
};
#endif // !defined(AFX_CMPPPDU_H__B434CDFD_29F5_43B4_9380_3A033EBC8B1A__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -