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

📄 smpprotocol.h

📁 模拟手机源程序,做短信系统(源码)
💻 H
字号:
//SMPProtocol.h

#include "SMPPMacroDef.h"
//#include "SMSCSocket.h"
class CSMSCSocket;
#include <afxtempl.h>
class CSMPPAgentDlg;

#define MAX_MSGBODY_LEN	300				//消息体的最大长度;

//============================================================
//Modify by LiuTianJun at 2001-12-21
#define LOG_TIMEOUT_SEC	6				//注册超时秒数;
#define TESTLINK_TIMEOUT_SEC	6		//检测连接状态超时秒数;
//#define LOG_TIMEOUT_SEC	4			//注册超时秒数;
//#define TESTLINK_TIMEOUT_SEC	6		//检测连接状态超时秒数;
//============================================================

#define NO_LOGIN		-1				//没有注册;
#define HAVE_LOGIN		0				//已经注册;
#define LOGIN_BREAKED	1				//链路被中断;

#define COMMAND_STATUS_INIT	 -1

#define STAT_MO_COUNT		1
#define STAT_MT_COUNT		2
#define STAT_REPORT_COUNT	3

#define STAT_SMSC_LINK		10

/////////////////////////////////////////////////////////////////////////////
// Class CSMPProtocol head file;

class CSMPProtocol
{

//成员变量--公有
public:

	struct struSMPPLOGIN{				//SMPP注册消息体结构;
		char szSystemID[16];				//接口ID;
		char szPassword[9];					//密码;
		char szSystemType[13];				//接口类型;
		BYTE nInterfaceVersion;				//接口版本号;
		BYTE nTON;							//保留;
		BYTE nPI;							//保留;
		char szAddressRange[41];			//保留;
	};

	struct struSMPPSUBMIT{				//提交短信消息体结构;
		char szServiceType[6];				//保留;
		BYTE nSourceAddressTon;				//源地址编码类型;
		BYTE nSourceAddressNpi;				//源地址编码方案;
		char szSourceAddress[21];			//源地址;
		BYTE nDestAddressTon;				//目的地址编码类型;
		BYTE nDestAddressNpi;				//目的地址编码方案;
		char szDestAddress[21];				//目的地址;
		BYTE nEsmClass;						//短消息类型;
		BYTE nProtocolID;					//GSM协议类型;
		BYTE nPriorityFlag;					//优先级;
		char szScheduleDeliveryTime[17];	//计划下发短消息的时间;
		char szValidityPeriod[17];			//短消息的最后有效期限;
		BYTE nRegisteredDeliveryflag;		//注册短消息标志;
		BYTE nReplaceIfPresentFlag;			//替换短消息标志;
		BYTE nDataCoding;					//数据编码方案;
		BYTE nSmDefaultMsgID;				//预定义短消息ID;
		BYTE nSmLength;						//短消息的长度;
		char szShortMessageText[161];		//短消息数据内容;
	};

//成员函数--公有
public:
	CSMPProtocol(int nDestSMSC,char* szServiceNum,int nHaveRcvLink,int nHaveTrnLink);
	virtual ~CSMPProtocol();

	int SMPPLogIn(char* szDestIP,int nDestPort,struSMPPLOGIN struSmppLogIn);	//注册SMSC;
	int SMPPLogOut();															//注销SMSC
	DWORD SMPPSubmit(struSMPPSUBMIT struSmppSubmit);							//向SMSC提交短信;
	int SMPPGetDeliver(struSMPPSUBMIT* struSmppSubmit);							//从SMSC获取短信;
	int SMPPGetSubmitRep(DWORD* dwSubmitID,DWORD* dwMessageID,DWORD* dwStatus);	//从SMSC获取提交短信应答包;
	int SMPPGetStatReport(DWORD* dwSubmitID,DWORD* dwStatus);					//从SMSC获取状态报告包;
	int SMPPTestLink();															//检测链路是否正常;

	int	SplitRecvMsg(char* szRecvMsg,int nMsgLen,CSMSCSocket* pSocket);								//拆分接收到的数据;

	int StrToUnicode(char *buf, int *sm_length);								//把ANSI字符转换为UNICODE字符;

	int Print(char* szDisplayMsg);							//显示数据;
//成员变量--私有
private:
	CSMPPAgentDlg*	m_pcDlg;

	struct struSMPPHEAD{				//SMPP消息头结构
		DWORD dwCommandLength;				//消息包的长度;
		DWORD dwCommandID;					//短消息的类型;
		DWORD dwCommandStatus;				//命令执行的状态;
		DWORD dwSequenceNO;					//短消息的序列号;
	};

	struct struSMPPACKAGE{				//SMPP消息报文结构;
		struSMPPHEAD	struHead;			//消息头;
		char			szBody[300];		//消息体;
	};


	DWORD		m_dwCommandStatus;		//命令状态;
	DWORD		m_dwSequenceNO;			//序列号;
	CSMSCSocket* m_cSMSCSocketRCV;		//接收链路SOCKET;
	CSMSCSocket* m_cSMSCSocketTRN;		//下发链路SOCKET;

	DWORD		m_dwStatusRCV;			//下发链路状态;
	DWORD		m_dwStatusTRN;			//接收链路状态;
	char		m_szSMPPIP[20];			//SMSC的IP
	int			m_nSMPPort;				//SMSC的PORT;
	struSMPPLOGIN m_struSMPPLogIn;		//注册SMSC的消息体结构;

	CList<struSMPPACKAGE,struSMPPACKAGE&> m_listSubmitBuff;	//MT发送失败缓存列表;

	CList<struSMPPACKAGE,struSMPPACKAGE&> m_listSubmitRep;	//MT应答包缓存列表;
	CList<struSMPPSUBMIT,struSMPPSUBMIT&> m_listStatReport;	//状态报告缓存列表;
	CList<struSMPPSUBMIT,struSMPPSUBMIT&> m_listDeliver;	//MO缓存列表;

	unsigned int	m_nMTCount;								//MT总数目;
	unsigned int	m_nMOCount;								//MO总数目;
	unsigned int 	m_nSubmitRespCount;						//MT应答总数目;
	unsigned int	m_nStatReportCount;						//状态报告总数目;

	HANDLE			m_hEventDeliver;						//MO缓存列表同步对象;
	HANDLE			m_hEventSubmitRep;						//MT应答缓存列表同步对象;
	HANDLE			m_hEventStatReport;						//状态报告列表同步对象;
//	HANDLE			m_hEventShowStat;

	int		m_nDestSMSC;									//标识目的SMSC:1为移动,2为联通;
	char	m_szServiceNum[10];								//特服号;
	int		m_nHaveRcvLink;									//是否有接收链路标识;
	int		m_nHaveTrnLink;									//是否有下发链路标识;

	int		m_nCurrLink;						//指明最后收到的数据包是从哪个链接发来的;1代表接收链路,2代表发送链路
	long	m_nTimeLink_RCV;					//接收链路最后收到包的时间;
	long	m_nTimeLink_TRN;					//发送链路最后收到包的时间;

	int		m_nSendLinkCount;
	int		m_nRecvLinkCount;
		


//成员函数--私有
private:
	void OnReceive(int nErrorCode);	

	int SMPPLogInRCV(char* szDestIP,int nDestPort,struSMPPLOGIN struSmppLogIn);		//注册接收链路;
	int SMPPLogInTRN(char* szDestIP,int nDestPort,struSMPPLOGIN struSmppLogIn);		//注册下发链路;

	int SMPPLogOutRCV();									//注销接收链路;
	int SMPPLogOutTRN();									//注销下发链路;

	int SMPPTestLinkRCV();									//检测接收链路;
	int SMPPTestLinkTRN();									//检测下发链路;

	int	CompresStruct(struSMPPLOGIN struSmppLogIn,char* szDestBuff);				//压缩SUBMIT结构体;
	int CompresStruct(struSMPPSUBMIT struSmppSubmit,char* szDestBuff);				//压缩LOGIN结构体;
	int FillStruct(char* szSourBuff,int nMsgLen,struSMPPSUBMIT* struSmppSubmit);	//填充SUBMIT结构体;

	int MakePackage(DWORD nCommandID,DWORD nSequenceNO,char* szBodyBuff,int nBodyLen,struSMPPACKAGE* struSMPPackage);
																					//组成SMPP报文;
	int	ProcRecvPackage(struSMPPACKAGE struSMPPackage);		//处理接收到的SMPP报文;

	int	ProcSubmitSMRep(struSMPPACKAGE struSMPPackage);		//处理接收到的SUBMIT应答报文;
	int	ProcDeliverSM(struSMPPACKAGE struSMPPackage);		//处理接收到的DELIVER报文;

	int SendSubmitBuff();									//发送MT失败列表中的内容;

	void UnicodeToStr(char *buf, int *sm_length);			//把UNICODE编码转换成ANSI编码;

//	int Print(char* szDisplayMsg);							//显示数据;
	int ShowStatus(int nType,int nValue,char* szMsg);		//显示状态;

	int DealStatReport(struSMPPSUBMIT struSmppSubmit,DWORD* pdwMessageID,DWORD* pdwStatus);
															//处理状态报告;

	int HexToDec(char* szHexNum);							//把十六进制转换成十进制;
};

⌨️ 快捷键说明

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