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

📄 cmpppdu.h

📁 vc开发的一个cmpp(中国移动点对点通讯)通讯程序
💻 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 + -