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

📄 cmpp.h

📁 中国移动通信CMPP2.0短消息网关开发接口库
💻 H
📖 第 1 页 / 共 2 页
字号:
		
		CMPP_QUERY				pk_query;
		CMPP_QUERY_RESP			pk_queryresp;
		
		CMPP_DELIVER			pk_deliver;
		CMPP_DELIVER_RESP		pk_deliverresp;
		
		CMPP_CANCEL				pk_cancel;
		CMPP_CANCEL_RESP		pk_cancelresp;
		
		CMPP_ACTIVETEST_RESP	pk_activetestresp;
	} pk_body;
} CMPP_PKG;

//**********************************************************************
//**处理CMPP2.0基本命令的类**
//**********************************************************************
class CMPP_API CCmpp  
{
public:
	CCmpp();
	virtual ~CCmpp();

protected:
	int			m_nSocketTimeout;
	void (*m_LogWrite)(LPCTSTR pchFmt, ...);
	unsigned int m_nSeq;
	char		m_sIsmgId[7];		// 6位的Ismg_Id.
	char		m_sMiscId[5];		// 4位的Miscid.
	unsigned short m_ushMsgidSeq;	// Msgid中用到的流水号.
	unsigned int m_nSmscSeqId;		// smsc的序列号.
	
protected:
	//接收SMG方面的所有消息
	int RecvSmgMsg(TCPSocket* tsClient, cmpp_smgtosp* css);

	//通过MD5算法构造登录请求包.
	void m_SetConnPkg(CMPP_CONNECT *cl, const char *pchSrcAddr, \
		const char *pchPwd, unsigned char uchVersion);

	//建立连接操作(Connect)
	int SendConnect(TCPSocket* tsClient, unsigned int nSeqId, char* pchSrcAddr, char* pchPwd, unsigned char uchVersion);

	//拆除连接操作Terminate)
	int SendTerminate(TCPSocket* tsClient, unsigned int nSeqId);

	//提交短信操作(Submit)
	int SendSubmit(TCPSocket* tsClient, unsigned int nSeqId, \
		_int64 nMsgId, unsigned char uchPKtotal, unsigned char uchPKnumber, \
		unsigned char uchNeedreport, unsigned char uchMsglevel, char *pchServiceid, \
		unsigned char uchFeeusertype, char *pchFeeterminalid,/* unsigned char uchFeeterminaltype,*/ \
		unsigned char uchTppid, unsigned char uchTpudhi, unsigned char uchMsgfmt, \
		char *pchMsgsrc, char *pchFeetype, char *pchFeecode, char *pchValidtime, char *pchAttime, \
		char *pchSrcid, unsigned char uchDestusrtl, char *pchDestterminalid, /*unsigned char uchDestterminaltype,*/ \
		unsigned char uchMsglen, char *pchMsgcontent/*, char *pchLinkid*/);

	//查询发送短信状态(Query)
	int SendQuery(TCPSocket* tsClient, unsigned int nSeqId, char* pchTime, \
		unsigned char uchQueryType, char* pchQueryCode);

	//送交短信应答(Deliver_Resp)
	int SendDeliverResp(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId, /*unsigned int nResult*/unsigned char uchResult);

	//删除短信操作
	int SendCancel(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId);

	//连接活动测试
	int SendActiveTest(TCPSocket* tsClient, unsigned int nSeqId);

	//接收cmppclient(sp)方面的消息
	int RecvSpMsg(TCPSocket* tsClient, cmpp_sptosmg* css, unsigned char &uchResult);

	//发送请求连接应答(Connect_Response)包
	int SendConnectResp(TCPSocket* tsClient, unsigned int nSeqId,/* unsigned int nStatus*/unsigned char uchStatus, \
		char *pchAuthSMG, unsigned char uchVersion);

	//发送拆除连接应答(Terminate_Response)包
	int SendTerminateResp(TCPSocket* tsClient, unsigned int nSeqId);

	//发送提交短信应答(Submit_Response)包
	int SendSubmitResp(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId, \
		/*unsigned int nResult*/unsigned char uchResult);

	//发送查询发送短信状态应答(Query_Response)包
	int SendQueryResp(TCPSocket* tsClient, unsigned int nSeqId, char* pchTime, \
		unsigned char uchQueryType, char* pchQueryCode, \
		unsigned int nMTTLMsg, unsigned int nMTTLUsr, \
		unsigned int nMTScs, unsigned int nMTWT, \
		unsigned int nMTFL, unsigned int nMOScs, \
		unsigned int nMOWT, unsigned int nMOFL);

	//发送送交消息(Deliver)包
	int SendDeliver(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId, char *pchDestId, char *pchServiceId, \
		unsigned char uchPid, unsigned char uchUdhi, unsigned char uchMsgFmt, \
		char *pchSrcTerminalId, /*unsigned char uchSrcTerminalType,*/ unsigned char uchRegisteredDelivery, \
		unsigned char uchMsgLen, char *pchMsgContent/*, char *pchLinkId*/);
	
	//发送删除短信应答(Cancel_Response)包
	int SendCancelResp(TCPSocket* tsClient, unsigned int nSeqId, /*unsigned int nSuccessId*/unsigned char uchSuccessId);

	//发送活动连接测试应答(Active_Test_Response)包
	int SendActiveTestResp(TCPSocket* tsClient, unsigned int nSeqId);

	unsigned int IncreaseSeqId();
	
	void	LogHex(CString szpre, char *msgContent, int nSize);
	
	int		ComposeCmppPkg(cmpp_pkg* cp, char* pchBuf, int nSize);
	
	int		TracePkg(cmpp_pkg* cp);

public:	
	// 一些功能函数.
	
	// 得到当前的日期时间(MMDDhhmmss)
	CString GetDoneTime();
	
	unsigned _int64	GetMsgid();
	
	unsigned int IncreaseSmscSeqId();
	
	CString ConvertToHex(CString szpre, char *msgContent, int nSize);
	
public:
	unsigned short IncreaseMsgIdSeq();
	
	unsigned int GetSeqId();	
};


//**********************************************************************
//	STRUCTURE OF LOGIN_PARAM.
//**********************************************************************
typedef struct login_param {
	char	sSmgIp[16];				//短信网关的IP地址.
	unsigned short ushPort;			//短信网关的端口号.
	char	sLoginName[7];			//登录用户名
	char	sLoginPwd[MAX_PATH];	//SP的登录口令,最长20位.
//	char	sIcpId[7];				//SP_ID,sp的企业代码.
	unsigned char	uchVersion;
} LOGIN_PARAM;

//**********************************************************************
//	STRUCTURE OF CLIENT_CONN.
//**********************************************************************
struct client_conn {
	SOCKET	hClient;
	CString sIcpid;
	CString sSpid;
	int		nVersion;	
};

//**********************************************************************
//	STRUCTURE OF SRVTHREAD_PARAM.
//**********************************************************************
struct srvthread_param {
	CCmppServer* csServer;
	TCPSocket*	tsClient;
};

//
//用于处理消息和事件的线程池
//
class CJobCmpp2:public IJobDesc {
public:
	CJobCmpp2(CMPP_SMGTOSP css, CCmppClient* cmppclient);
	CJobCmpp2(CMPP_SPTOSMG css, CCmppServer* cmppserv);
	~CJobCmpp2();

	void	OnSmgMsg();
	void	OnSpMsg();
	int		nType;		//0:message(smgmsg) 1:message(spmsg)
private:
	CCmppClient*	m_cmppclient;
	CCmppServer*	m_cmppserv;
	CMPP_SMGTOSP	m_smgmsg;
	CMPP_SPTOSMG	m_spmsg;
};

class CWorkerCmpp2:public IWorker {
	virtual void ProcessJob( IJobDesc* pJobDesc );
};

//******************************************************************************************************
//**CMPP2.0 CLIENT(SP模块)实现.
//******************************************************************************************************
class CMPP_API CCmppClient:public CCmpp  
{
	friend class CJob;
//private:
public:
	TCPSocket	m_socket;			//单连接时用.
	TCPSocket	m_MoConn;			//双连接或双端口时的MO连接.
	TCPSocket	m_MtConn;			//双连接或双端口时的MT连接.

	int			m_nSocketTimeout;
//	int			m_nSeq;
	bool		m_fStop;			//停止标志.
	bool		m_fLogined;
	
	bool		m_fMTLogined;
	bool		m_fMOLogined;

	LOGIN_PARAM	lp;
	int			m_RetryInterval;
	bool		m_fAutoResp;
	HANDLE		m_hRecvThread;		//接收线程句柄.
	HANDLE		m_hRecvMoThread;	//接收MO消息线程的句柄.
	bool		m_fStarted;

	CThreadPool	m_pool;				//执行各种消息处理函数的线程池.
	CWorkerCmpp2 m_worker;
	CJobCmpp2	*m_pJob;

	CCriticalSection m_socketCS;

	int			m_nSmgType;			//网关类型,如适用于单连接(0),双连接(1)或双端口(1).
	unsigned short m_ushMoport;		//双端口时的MO Port.
	unsigned short m_ushMtport;		//双端口时的MT Port.
public:
	void (*m_pSmgMsg)(CMPP_SMGTOSP  css);
	
	int Connect_Single();			//单连接的登录过程
	int Connect_MT();
	int Connect_MO();
	int Connect_Double();			//双连接或双端口的登录过程

	int Connect();
	
	int Terminate();

	//用于接收MO消息.
	static DWORD WINAPI RecvMoFunc(LPVOID pParam);
	
	virtual DWORD RecvMoProc();

	//用于接收MT的回复消息.(双连接的时候)
	static DWORD WINAPI RecvMtFunc(LPVOID pParam);
	
	virtual DWORD RecvMtProc();
	
	int ActiveTestMO();

	int ActiveTestMT();
public:
	CCmppClient();
	~CCmppClient();

	int	Start(char *pchSmgIp, int nSmgPort, char *pchUserName, \
		char *pchUserPwd, unsigned char uchVersion, \
		void (*OnSmgMsg)(CMPP_SMGTOSP  css), int nConnType = 0/*默认单连接*/, void (*OnLogFile)(LPCTSTR pchFmt, ...) = NULL);

	int Release();

	int Submit(_int64 nMsgId, unsigned char uchPKtotal, unsigned char uchPKnumber, \
		unsigned char uchNeedreport, unsigned char uchMsglevel, char *pchServiceid, \
		unsigned char uchFeeusertype, char *pchFeeterminalid, unsigned char uchTppid, \
		unsigned char uchTpudhi, unsigned char uchMsgfmt, char *pchMsgsrc, \
		char *pchFeetype, char *pchFeecode, char *pchValidtime, \
		char *pchAttime, char *pchSrcid, unsigned char uchDestusrtl, \
		char *pchDestterminalid, unsigned char uchMsglen, char *pchMsgcontent);

	int Query(char* pchTime, unsigned char uchQueryType, char* pchQueryCode = NULL);

	int Cancel(_int64 nMsgId);

//	int DeliverResp(unsigned int nSeqId, _int64 nMsgId, /*unsigned int nResult*/unsigned char uchResult);

	int ActiveTest();

	unsigned int GetSeqId();
	
	//用于设置双端口连接时的端口号.
	void SetDoublePort(unsigned short ushMoport, unsigned short ushMtport);
};

//******************************************************************************************************
//**CMPP2.0 SERVER(模拟网关部分)的实现.
//******************************************************************************************************
class CMPP_API CCmppServer:public CCmpp {
	friend class CJobCmpp2;
	//member varibals
private:
	TCPSocket	m_TsServer;
	int			m_nLocalPort;
	char		m_sLocalAddr[16];
	bool		m_fStop;
	int			m_nSocketTimeout;
	client_conn	conn_list[255];
	int			m_nConnectTotal;
	HANDLE		m_hThread;			//本地监听线程的句柄
	BOOL		m_fStarted;

	void (*m_pSpMsg)(CMPP_SPTOSMG  css);
	// v2.21对客户端鉴权的函数
	bool (*m_AuthClient)(char *pchIcpid, char *pchAuth, unsigned int nTimestamp, \
		char *pchClientAddr, char *pchAuthSmg, char *pchSpId);
	
	CThreadPool	m_pool;				//执行各种消息处理函数的线程池.
	CWorkerCmpp2		m_worker;
	CJobCmpp2		*m_pJob;
	//member functions
protected:
	int LocalListen();

	static DWORD WINAPI CmppServFunc(LPVOID pParam);
	virtual DWORD CmppServProc();

	static DWORD WINAPI CmppClientFunc(LPVOID pParam);
	virtual DWORD CmppClientProc(TCPSocket* tsClient);

	SOCKET GetFromList(CString sIcpid);
	void RemoveFromList(SOCKET hClient);
	void AddToList(SOCKET hClient, CString sIcpid, CString sSpid, int nVersion);
	// V2.21判断该SPID是否已经登录
	bool IsLogined(CString sSpId, SOCKET &hSock);
	
public:
	CCmppServer();
	~CCmppServer();

//	int Start(void (*OnSpMsg)(CMPP_SPTOSMG  css));
	int Start(char *pchServip, int nServport, void (*OnSpMsg)(CMPP_SPTOSMG  css), \
		void (*OnLogFile)(LPCTSTR pchFmt, ...), bool (*OnAuthClient)(char *pchIcpid, char *pchAuth, unsigned int nTimestamp, char *pchClientAddr, char *pchAuthSmg, char *pchSpId), \
		char *pchIsmgId, char *pchMiscid, int nSocketTimeout);

	void Release();
	
	int Deliver(unsigned _int64 nMsgId, char *pchDestId, char *pchServiceId, \
		unsigned char uchTppid, unsigned char uchTpudhi, unsigned char uchMsgFmt, \
		char *pchSrcTerminalId, unsigned char uchRegisteredDelivery, unsigned char uchMsgLen,\
		char *pchMsgContent);
};

// 一些功能函数.

// 分解Msgid.
CMPP_API void ParseMsgid(unsigned _int64 nMsgId, CString& szDateTime, CString& szIsmgId, int& nMsgidSeq);
// 取子字符串.
CMPP_API CString GetSubStr(void* pchBuf, int nLen);
// 64位整数转换高低顺序.
CMPP_API unsigned _int64 hton64(unsigned _int64 ui64Src);
// 获取当前时间(YYMMDDhhmmss)
CMPP_API CString GetDateTime();

/************************************************************************/
/* 短连接方式的只发cmpp2.0 Client                                       */
/************************************************************************/
class CMPP_API CShortCmppClient:public CCmppClient
{
public:
	CShortCmppClient();
	~CShortCmppClient();

	int CShortCmppClient::ShortSubmit(char *pchSmgIp, int nSmgPort, char *pchUserName, \
		char *pchUserPwd, unsigned char uchVersion, int nConnType, \
		CString szMsgSrc, CString szSrcId, \
		CString szDstTerminalId, CString szMsgContent);
};

#endif // !defined(AFX_CMPP_H__A4DFA71A_1AAF_4DE6_A299_3A154220E698__INCLUDED_)

⌨️ 快捷键说明

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