📄 cmpp.h
字号:
// CMPP_DELIVER消息定义(ISMG——>SP)
struct _CMPP_DELIVER
{
//信息标识,生成算法如下:采用64位(8字节)的整数:
//(1) 时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,
//其中bit64~bit61:月份的二进制表示;
//bit60~bit56:日的二进制表示;
//bit55~bit51:小时的二进制表示;
//bit50~bit45:分的二进制表示;
//bit44~bit39:秒的二进制表示;
//(2) 短信网关代码:bit38~bit17,
//把短信网关的代码转换为整数填写到该字段中。
//(3) 序列号:bit16~bit1,顺序增加,步长为1,循环使用。
//各部分如不能填满,左补零,右对齐。
//(SP根据请求和应答消息的Sequence_Id一致性就可得到CMPP_Submit消息的Msg_Id)
_CMPP_ID Msg_id;
//目的号码
//SP的服务代码,一般4--6位,或者是前缀为服务代码的长号码;
//该号码是手机用户短消息的被叫号码。
char Dest_terminal_id[MAX_LEN_MOBILE_ID + 1];
//业务类型,是数字、字母和符号的组合。
char Service_id[10];
//GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
BYTE TP_pid;
//GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
BYTE TP_udhi;
//信息格式
//0:ASCII串
//3:短信写卡操作
//4:二进制信息
//8:UCS2编码
//15:含GB汉字
BYTE Msg_Fmt;
//源终端MSISDN号码(状态报告时填为CMPP_SUBMIT消息的目的终端号码)
char Src_terminal_id[MAX_LEN_MOBILE_ID + 1];
//是否为状态报告0:非状态报告1:状态报告
BYTE Reg_Delivery;
//消息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节)
BYTE Msg_Length;
//消息内容
char Msg_Content[MAX_LEN_CONTENT];
//保留
BYTE Reserve[8];
};
//当ISMG向SP送交状态报告时,信息内容字段(Msg_Content)格式定义如下
struct _CMPP_DELIVER_MSGCONTENT_REPROT
{
//信息标识SP提交短信(CMPP_SUBMIT)操作时,
//与SP相连的ISMG产生的Msg_Id。
BYTE btMsg_Id[8];
//发送短信的应答结果,含义与SMPP协议要求中stat字段定义相同,
//SP根据该字段确定CMPP_SUBMIT消息的处理状态。
char szStat[7];
//YYMMDDHHMM
//(YY为年的后两位00-99,MM:01-12,DD:01-31,HH:00-23,MM:00-59)
char szSubmit_time[10];
//YYMMDDHHMM
char szDone_time[10];
//目的终端MSISDN号码(SP发送CMPP_SUBMIT消息的目标终端)
char szDest_terminal_Id[21];
//取自SMSC发送状态报告的消息体中的消息标识。
DWORD dwSMSC_sequence;
};
//表示MO的状态报告,信息内容字段(Msg_Content)格式定义如下
struct _CMPP_DELIVER_CONTENT
{
//信息标识,生成算法如下:采用64位(8字节)的整数:
//(1) 时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,
//其中bit64~bit61:月份的二进制表示;
//bit60~bit56:日的二进制表示;
//bit55~bit51:小时的二进制表示;
//bit50~bit45:分的二进制表示;
//bit44~bit39:秒的二进制表示;
//(2) 短信网关代码:bit38~bit17,
//把短信网关的代码转换为整数填写到该字段中。
//(3) 序列号:bit16~bit1,顺序增加,步长为1,循环使用。
//各部分如不能填满,左补零,右对齐。
//(SP根据请求和应答消息的Sequence_Id一致性就可得到CMPP_Submit消息的Msg_Id)
_CMPP_ID Msg_id;
//SP的应答结果,CMPP_DELIVER_RESP中Result值的字符表示,左对齐。
//Result为0时,填字符DELIVRD,其余值填REJECTD
char szStat[7];
//YYMMDDHHMM
//(YY为年的后两位00-99,MM:01-12,DD:01-31,HH:00-23,MM:00-59)
//注:短信网关发出CMPP_DELIVER的时间。
char szSubmitTime[10];
//YYMMDDHHMM
//注:短信网关收到CMPP_DELIVER_RESP的时间
char szDoneTime[10];
//目的SP的服务代码,左对齐
char Dest_terminal_id[MAX_LEN_MOBILE_ID + 1];
//保留
long lSMSCSequence;
};
//CMPP_DELIVER_RESP消息定义(SP——>ISMG)
struct _CMPP_DELIVER_REP
{
//信息标识,生成算法如下:采用64位(8字节)的整数:
//(1) 时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,
//其中bit64~bit61:月份的二进制表示;
//bit60~bit56:日的二进制表示;
//bit55~bit51:小时的二进制表示;
//bit50~bit45:分的二进制表示;
//bit44~bit39:秒的二进制表示;
//(2) 短信网关代码:bit38~bit17,
//把短信网关的代码转换为整数填写到该字段中。
//(3) 序列号:bit16~bit1,顺序增加,步长为1,循环使用。
//各部分如不能填满,左补零,右对齐。
//(SP根据请求和应答消息的Sequence_Id一致性就可得到CMPP_Submit消息的Msg_Id)
_CMPP_ID Msg_id;
//结果0:正确,1:消息结构错 ,2:命令字错 ,3:消息序号重复,4:消息长度错
//5:资费代码错,6:超过最大信息长,7:业务代码错,8: 流量控制错,9~ :其他错误
BYTE Result;
};
//CMPP_ACTIVE_TEST定义(SP——>ISMG或ISMG——>SP)
struct _CMPP_ACTIVE
{
//Null
};
//CMPP_ACTIVE_TEST_RESP定义(SP ——>ISMG或ISMG——>SP)
struct _CMPP_ACTIVE_REP
{
//成功标识(0:成功;其它:不成功)
BYTE Success_Id;
};
union _CMPP_BODY
{
struct _CMPP_CONNECT sMsgConnect;
struct _CMPP_CONNECT_REP sMsgConnectRep;
struct _CMPP_TERMINATE sMsgStop;
struct _CMPP_TERMINATE_REP sMsgStopRep;
struct _CMPP_SUBMIT sMsgSubmit;
struct _CMPP_SUBMIT_REP sMsgSubmitRep;
struct _CMPP_QUERY sMsgQuery;
struct _CMPP_QUERY_REP sMsgQueryRep;
struct _CMPP_DELIVER sMsgDeliver;
struct _CMPP_DELIVER_REP sMsgDeliverRep;
struct _CMPP_ACTIVE sMsgActive;
struct _CMPP_ACTIVE_REP sMsgActiveRep;
};
struct _CMPP
{
_CMPP_HEAD sMsgHead;
_CMPP_BODY uMsgBody;
};
typedef enum ParaType
{
SendMaxNumPerPk,//每包发送最大限制
Timeout4Connect,//连接超时
Timeout4Recv,//接收超时
PauseTime4Recv,//接收停留时间
PauseTime4Stop,//终止停留时间
SendIntervalTime,//发送间隔时间
Timeout4Resp,//响应超时
ExpireTime,//发送终止时间
FeeMobileID,//被计费用户的号码
FeeType,//计费类型
FeeUserType,//计费用户类型
FeeValue,//计费值
MsgCoding,//信息格式
MobileIDFix,//手机号码前缀
Priority,//信息级别
RegDeliveryFlag,//是否为状态报告
Reserve,//保留
ScheduleTime,//定时发送时间
SeviceType,//业务代码
SMCID,//信息标识,采用64位(8字节)的整数:
SPID,//信息内容来源
SPNum,//源号码
TPpid,//GSM协议类型
TPudhi,//GSM协议类型
Version//版本号
}eParaType;
class CCMPP
{
public:
CCMPP();
virtual ~CCMPP();
//消息头。
private:
long GetHostIP(char * pszIP);
bool CheckTime(char * pszTime);
void SetReturnValue(VARIANT *pPara, long lPara);
// long SetMsgCoding(BYTE newVal);
long SetMobileID(BSTR newVal);
long SetMsgContent(VARIANT newVal);
public:
//启动SOCKET
long Init(void);
//建立连接
long Bind(BSTR bStrIP, short iPort, BSTR bStrSPID, BSTR bStrSharedSecret,BYTE bVersion);
long GetWaitSendCount();
void AddPreFix(const char* pszMobileCode, const char* pszPreFix, char *pszResult);
BOOL IsMobileIDWithPreFix(const char* pszMobileID, const char* pszPreFix);
bool AddMobileID(BSTR bStrMobileID);
//发送内容
long Submit(BSTR bStrMobileID, VARIANT *pMsgContent);
//设置响应的参数值
void SetPara(eParaType eInParaType, void * newVal);
//SP向ISMG查询某时间的业务统计情况
long Query(long lDateTime, BSTR bStrServiceCode);
//链路检测
long Active();
//请求拆除到目的ISMG的连接
long Unbind();
//终止SOCKET连接
long Stop();
public:
//以下TRUE表示成功
bool m_bIsInit;//初始化了吗?
bool m_bIsBinded;//绑定(连接)了吗?
bool m_bIsBinding;//正在绑定(连接)吗?
bool m_bIsEnableRun;//能在SOCKET上收发数据吗?
bool m_bIsSendRun;//能发送吗?
bool m_bIsRecvRun;//能接收吗?
bool m_bIsUnbind;//终止连接了吗?
long m_lTimeout4Connect;
long m_lTimeout4Resp;
long m_lSendIntervalTime;
long m_lPauseTime4Stop;
long m_lTimeout4Recv;
long m_lPauseTime4Recv;
long m_lSendMaxNumPerPk;
long m_lBufIdx4MulSM;
long m_lMsgContentLen;
//短信的BUFFER
struct _SM_BUF
{
BYTE bFlag;//当前BUFFER的状态
DWORD dwTickCount;
_CMPP sCmppMsg;
}m_sSMBuf[MAX_BUF_SIZE];
timeval m_sTimeval4Timeout;
DWORD m_dwSequenceNO;
DWORD m_dwLastTime4TCPErr;
DWORD m_dwSubmitNum;
DWORD m_dwSendTime;
DWORD m_dwRespTime;
DWORD m_dwLastErr4TCP;
DWORD m_dwSubmitRespFailNum;
DWORD m_dwSubmitRespOKNum;
DWORD m_dwCurErr4TCP;
DWORD m_dwLastErr4Sys;
DWORD m_dwSMCID;
BYTE m_bRegDeliveryFlag;
BYTE m_bPriority;
BYTE m_bFeeUserType;
BYTE m_bTPpid;
BYTE m_bTPudhi;
BYTE m_bMsgCoding;
BYTE m_bVersion;
BYTE m_BMsgContent[MAX_BUF_LEN_CONTENT + 1];
char m_szSPID[7];
char m_szReserve[9];
char m_szServiceType[11];
char m_szFeeType[3];
char m_szFeeValue[7];
char m_szExpireTime[17];
char m_szScheduleTime[17];
char m_szSPNum[MAX_LEN_MOBILE_ID + 1];
char m_szFeeMobileID[MAX_LEN_MOBILE_ID + 1];
char m_szMobileIDFix[MAX_LEN_MOBILE_ID + 1];
char m_szMobileID[MAX_BUF_LEN_MOBILE_ID + 1];
SOCKET m_sSocket4MT;
WSAEVENT m_hEvent4Socket;
WSAEVENT m_hEvent4SaveBuf;
_CMPP m_sCmppMsg;
};
#endif // !defined(AFX_CMPP_H__747FA963_9BE1_11D8_A9E5_0050BA40A374__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -