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

📄 smppsock.h

📁 移动
💻 H
字号:

#if !defined(AFX_NOKIASOCK_H__7BAC9F1D_C0FE_406B_90F9_C32214152011__INCLUDED_)
#define AFX_NOKIASOCK_H__7BAC9F1D_C0FE_406B_90F9_C32214152011__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "afxsock.h"
//#include "logfile.h"
//extern CLogFile g_log;
#define MAX_ERRTEXT         600
#define MAX_SMPP_COM_BUF	1000
#pragma pack(1)

/////////////////////////////////////////////////////////////////////////////
//状态定义Command_status	错误代码	描述
#define E_SUCCESS	0X00000000	//成功
#define E_OTHERERR                  0X00000001              //	其他错误
//0X00000002 - 0X0000000F	保留给SMSC厂商定义错误
#define E_MSGLENERR                  0X00000010              //	消息长度错误
#define E_CMDLENERR                  0X00000011              //	命令长度错误
#define E_INVLDCMDID                  0X00000012              //	消息ID无效
#define E_NORIGHT                  0X00000013              //	没有执行此命令的权限
//0X00000014 - 0X0000001F	保留
#define E_INVLDSYSTEMID                  0X00000020              //	无效的SYSTEMID
#define E_INVLDPASSWORD                  0X00000021              //	无效的密码
#define E_INVLDSYSTEMTYPE                  0X00000022              //	无效的SYSTEMTYPE
//0X00000023 - 0X0000003F	保留
#define E_ADDRERR                  0X00000040              //	地址错误
#define E_MOEXCEED                  0X00000041              //	超过最大提交数
#define E_MTEXCEED                  0X00000042              //	超过最大下发数
#define E_INVLDUSER                  0X00000043              //	无效的用户
#define E_INVLDDATAFMT                  0X00000044              //	无效的数据格式
#define E_CREATEMSGFAILURE                  0X00000045              //	创建消息失败
#define E_INVLDMSGID                  0X00000046              //	无效的短消息ID
#define E_DATABASEFAILURE                  0X00000047              //	数据库失败
#define E_CANCELMSGFAILURE                  0X00000048              //	取消消息失败
#define E_MSGSTATEERR                  0X00000049              //	短消息状态错误
#define E_REPLACEMSGFAILURE                  0X0000004A              //	替换消息失败
#define E_INVLDRPLADDR                  0X0000004B              //	替换消息源地址错误
//0X0000004C - 0X0000005F	保留
#define E_INVLDORGTON                  0X00000060              //	无效的源地址TON
#define E_INVLDORGNPI                  0X00000061              //	无效的源地址NPI
#define E_ORGADDRERR                  0X00000062              //	源地址错误
#define E_INVLDDESTTON                  0X00000063              //	无效的目的地址TON
#define E_INVLDDESTNPI                  0X00000064              //	无效的目的地址NPI
#define E_DESTADDRERR                  0X00000065              //	目的地址错误
#define E_INVLDSCHEDULE                  0X00000066              //	无效的定时时间
#define E_INVLDEXPIRE                  0X00000067              //	无效的超时时间
#define E_INVLDESM                  0X00000068              //	无效的ESM_CALSS
#define E_INVLDUDLEN                  0X00000069              //	无效的UDLEN
#define E_INVLDPRI                  0X0000006A              //	无效的PRI
#define E_INVLDRDF                  0X0000006B              //	无效的Registered_delivery_flag
#define E_INVLDRPF                  0X0000006C              //	无效的Replac#define E_if_present_flag
//0X0000006D - 0X0000007F	保留
//用户管理部分                  可选              //	
#define E_USERALREADYEXIST                  0X00000080              //	指定用户已经存在
#define E_CREATEUSERERR                  0X00000081              //	创建用户失败
#define E_USERIDERR                  0X00000082              //	用户ID错误
#define E_USERNOTEXIST                  0X00000083              //	指定用户不存在
//0X00000084 - 0X0000008F	保留
//0X00000090 - 0X00000FFF	保留给SMSC厂商定义错误
//其他	保留


//命令码宏定义	数值	描述
#define ESME_BNDRCV	0X00000001			//ESME要求连接到SMSC
#define ESME_BNDRCV_RESP	0X80000001			//连接SMSC的响应
#define ESME_BNDTRN	0X00000002	//ESME要求连接到SMSC
#define ESME_BNDTRN_RESP	0X80000002	//连接SMSC的响应
#define ESME_UBD	0X00000006	//ESME要求断开连接到SMSC
#define ESME_UBD_RESP	0X80000006	//断开连接的响应
#define ESME_SUB_SM		0X00000004	//ESME提交短消息到SMSC,以便SMSC下发此短消息到特定的用户。
#define ESME_SUB_SM_RESP	0X80000004	//提交短消息的响应
#define ESME_DELIVER_SM	0X00000005	//SMSC下发短消息到特定的ESME
#define ESME_DELIVER_SM_RESP	0X80000005	//下发短消息的响应
#define ESME_QUERY_SM	0X00000003	//ESME查询以前所提交的短消息的状态
#define ESME_QUERY_SM_RESP	0X80000003	//查询短消息的响应
#define ESME_CANCEL_SM	0X00000008	//ESME要求取消以前所提交的某条短消息
#define ESME_CANCEL_SM_RESP	0X80000008	//ESME要求取消以前所提交的某条短消息的响应
#define ESME_REPLACE_SM	0X00000007	//ESME要求替换以前所提交的某条短消息
#define ESME_REPLACE_SM_RESP	0X80000007	//ESME要求替换以前所提交的某条短消息的响应
#define ESME_QRYLINK	0X00000015	//询问扩展短消息实体与短消息中心的连接情况
#define ESME_QRYLINK_RESP	0X80000015	//询问扩展短消息实体与短消息中心的连接情况的响应
#define ESME_NACK	0X80000000	//接收消息头错误的响应
#define ESME_REPLACE_SM_EX	0X00000090	//ESME要求替换以前所提交的某条短消息的扩展命令,它增加了数据编码格式字段
#define ESME_REPLACE_SM_EX_RESP	0X80000090	//扩展替换短消息的的响应
#define ESME_ADD_SUB	0X000000A0	//增加用户
#define ESME_ADD_SUB_RESP	0X800000A0	//增加用户的响应
#define ESME_DEL_SUB	0X000000A1	//删除用户
#define ESME_DEL_SUB_RESP	0X800000A1	//删除用户的响应
#define ESME_MOD_SUB	0X000000A2	//修改用户
#define ESME_MOD_SUB_RESP	0X800000A2	//修改用户的响应
#define ESME_QRY_SUB	0X000000A3	//查询用户的信息
#define ESME_QRY_SUB_RESP	0X800000A3	//查询用户的信息的响应
//扩展的命令标志数值定义//以下为本协议在SMPP上扩充的命令,它包括以下内容
#define ESME_REPLACE_SM_EX	0X00000090
#define ESME_REPLACE_SM_EX_RESP	0X80000090
#define ESME_ADD_SUB	0X000000A0
#define ESME_ADD_SUB_RESP	0X800000A0
#define ESME_DEL_SUB	0X000000A1
#define ESME_DEL_SUB_RESP	0X800000A1
#define ESME_MOD_SUB	0X000000A2
#define ESME_MOD_SUB_RESP	0X800000A2
#define ESME_QRY_SUB	0X000000A3
#define ESME_QRY_SUB_RESP	0X800000A3


struct Smpp_MESSAGE_HEAD 
{
	DWORD	command_length	;	//消息包的长度,包括此字段
	DWORD	command_id		;	//表明此条短消息的类型
	DWORD	command_status	;	//表示一个命令的成功与失败,如失败,指示引起失败的错误类型等信息,它在请求中必须设为0。
	DWORD	sequence_no		;	//此字段表示消息的序列号,它由ESME产生,它是消息和它的应答之间的对应标志,它的数值在0到0XFFFFFFFF间必须保证严格单调的递增,当达到0XFFFFFFFF时,从0开始下一循环。
};

#define MAX_HOSTNAME    16                 //平台主机名最大长度
#define MAX_USER        32                 //用户名最大长度
#define MAX_PASSWD      32                 //登录密码最大长度
#define MAX_ADD         20                 //源发地址/目标地址最大长度
#define MAX_MSGLEN      160                //所发短信最大长度,如为中文,应为160/4=40
#define MAX_LOGINTIME   5                 //登录最大超时时间()
#define MAX_LOGOUTTIME  5                 //退出最大超时时间
#define MAX_SUBTIME     10                //发送短信最大超时时间
#define MAX_ALIVETESTTIME 2
//#define PRINTOUT	//printf

#define Smpp_PRINTOUT TRACE
#define MAX_SMS_MSG_LEN	134

class CSmppSock : public CSmsSock
{
public:
	BOOL bFlash;
	int  m_msg_len;
	BYTE reference_seq;
private:
	int nReceiveError;
	BYTE m_sequence;	//消息序列号
	//int m_defaultPeroid;	//缺省的超时值
	struct tagSMSCInfo
	{
		char SMSCIP[16];
		UINT uPort;
		char usrName[MAX_USER];
		char passWd[MAX_PASSWD];
	}m_smscInfo;
	struct life{
		int bUsed;
		int hours;
		int minutes;
	}m_life;
	bool m_bFlashMsg;
public:
//	HANDLE m_hEventMainOver;
public:
	CSmppSock();
	virtual ~CSmppSock();
public:
	void Check();
	int fReadAndAtuoAnswer();
	int fill_wap_message(BYTE* pbody,const char* msg,const char* http);
	int fSendWapSM(const char* destaddr,const char* srcaddr,const char* sendmsg,const char* http,bool bResp);
	int Send(unsigned char *pBuffer,int cLength);
	int Receive(unsigned char *lpBuf, int nBufLen);
	void ReadAllMsg();
	int FillTimeStrToStr(char *ostr);
	void SetFlashState(int state);
	void SetLife(int check,int hours,int minutes);
	static int GetRespState(int state,char *pcresp);
	void ClearBuffer();
	void SetUser(char *puser,char *pwd);
	void SetPort(int port);
	void SetHostName(char *phost);
	int  fDisconnect();
	int  fConnect(char* host,unsigned int port);
	int  fAliveTst();
	int  fLogout(bool bResp=FALSE);
	int  fLogin(char* usrname,char* passwd);
	int  fSendSM2(const char* destadd,const char* srcadd,const char* sendmsg,bool bResp=FALSE);
	int  fSendSM(const char* destadd,const char* srcadd,const char* sendmsg,bool bResp=FALSE);
	int  fSendSM1(const char* destadd,const char* srcadd,const char* sendmsg,bool bResp=FALSE);
	int  fReceive(BYTE* lpBuf, int nBufLen);
	//void fShowErr(int nErrcode);
	//{{AFX_VIRTUAL(CSmppSock)
	//}}AFX_VIRTUAL
	//{{AFX_MSG(CSmppSock)
	//}}AFX_MSG
private:
	void network_head(struct Smpp_MESSAGE_HEAD* phead);
	int  fill_message(BYTE* pbody,const char* msg);
	inline DWORD network_dword(DWORD v)	 //转换网络字节序
	{
		return ((v)<<24) | (((v)&0xff00)<<8) | (((v)>>8)&0xff00) | ((v)>>24);
	}

	//BOOL fWaitforSend(int nType);
	//int   fCodeMsg(BYTE* msg,int& nmsgLen);
	//void  fShowSmeErr(BYTE * lpBuf);
	//int   fWaitForSingleObject(HANDLE hHandle);
	//void  fPacknum(void* pBuf);
	int CreateSocket();
};


/*struct BODY_BIND_TRANSMITTER
{
	char	system_id[16]	;	//最大 16	C_String	接口ID
	char	password[9]	;		//最大 9	C_String	密码
	char	system_type[13]		;	//最大 13	C_String	接口类型
	BYTE	interface_version;	//1	integer	接口版本号
	BYTE	addr_ton;			//1	integer	保留,应设置为0
	BYTE	addr_npi;			//1	integer	保留,应设置为0
	char	address_range[41]	;	//最大 41	C_DecString	保留,应设置为NULL
};
struct BODY_BIND_TRANSMITTER_RESP
{
	char	system_id[16];	//最大16	C_String	接口ID
};
struct BODY_SUBMIT_SM	//此命令用于ESME提交短消息到SMSC,以便SMSC把此短消息发给特定的移动台。
{
	BYTE	service_type[6];		//最大6	C_OctetString	保留,必须设为0
	BYTE	source_address_ton;		//1	integer	源地址编码类型
	BYTE	source_address_npi	;	//1	integer	源地址编码方案
	char	source_address[21]	;	//最大21	C_DecString	源地址
	BYTE	dest_address_ton;		//1	integer	目的地址编码类型
	BYTE	dest_address_npi;		//1	integer	目的地址编码方案
	char	destination_address[21]	;	//最大21	C_DecString	目的地址
	BYTE	esm_class	;		//1	integer	短消息类型
	BYTE	protocol_ID	;		//1	integer	GSM协议类型
	BYTE	priority_flag;		//1	integer	优先级
	char	schedule_delivery_time[17];	//最大17	C_StringTime	计划下发短消息的时间
	char	validity_peroid[17];		//最大17	C_StringTime	短消息的最后有效期限
	BYTE	registered_delivery_flag;	//1	integer	注册短消息标志
	BYTE	replace_if_present_flag;	//1	integer	替换短消息标志。
	BYTE	data_coding			;		//1	integer	数据编码方案
	BYTE	sm_default_msg_id	;		//1	integer	预定义短消息ID
	BYTE	sm_length			;		//1	integer	短消息的长度
	//char	short_message_text[161];	//最大161	可变	短消息数据内容
};
struct BODY_SUBMIT_SM_RESP
{
	char	message_id[9];		//最大9	C_HexString	短消息ID
};
struct BODY_QUERY_SM	//此命令用于ESME向SMSC查询以前所提交的短消息的状态。
{	
	char	message_id[9];	//最大9	c_hexstring	短消息id
	BYTE	ton	;			//1	integer	地址编码类型
	BYTE	npi	;			//1	integer	地址编码方案
	char	address	[21];	//最大21	c_decstring	地址
};
struct BODY_QUERY_SM_RESP
{
	char	message_id[9];	//最大9	c_hexstring	短消息id
	char	final_date[17];	//最大17	c_stringtime	短消息生命周期终止时间
	BYTE	message_status;	//1	integer	短消息当前的状态
	BYTE	gsm_code;		//1	integer	gsm错误码
};

struct BODY_CANCEL_SM	//此命令用于取消ESME以前所提交的短消息。此命令能取消指定短消息ID的短消息,也可取消等待下发的由CANCEL_SM所确定的源地址和目的址的所有短消息(此时,message_id为NULL)。
{
	BYTE	service_type[6];	//最大6	C_OctetString 	保留,必须设为NULL
	char	message_id[9];		//最大9	C_HexString	短消息ID,设置为NULL时表示取消所有源编码地址和目标编码地址与下述地址相同的短消息
	BYTE	source_address_ton;	//1	Integer	源地址编码类型
	BYTE	source_address_npi;	//1	Integer	源地址编码方案
	char	source_address[21];	//最大21	C_DecString	源地址
	BYTE	dest_address_ton;	//1	Integer	目的地址编码类型
	BYTE	dest_address_npi;	//1	Integer	目的地址编码方案
	char	destination_address[21];	//最大21	C_DecString	目的地址
};*/
//struct BODY_CANCEL_SM_RESP	为空,只有消息头,无消息体

//struct BODY_UNBIND			为空,只有消息头,无消息体
//struct BODY_UNBIND_RESP		为空,只有消息头,无消息体

//struct BODY_ENQUIRE_LINK此命令用于ESME确认和SMSC之间的连接。
//ESME发送一条ENQUIRE_LINK命令,SMSC响应一条ENQUIRE_LINK_ACK命令,表示ESME和SMSC之间的连接存在。
//此命令只有消息头,没有消息体,
//ENQUIRE_LINK_RESP语法   此命令只有消息头,没有消息体,消息头中的Command_ID是"enquire_link_resp"。

//{{AFX_INSERT_LOCATION}}
#endif // !defined(AFX_NOKIASOCK_H__7BAC9F1D_C0FE_406B_90F9_C32214152010__INCLUDED_)

⌨️ 快捷键说明

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