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