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