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

📄 cmpp.h

📁 手机开发环境BREW实例
💻 H
📖 第 1 页 / 共 2 页
字号:

// 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 + -