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

📄 cmpp_message.h

📁 SMAL是short message abstract library的缩写,是由风起水流软件工作室(www.zealware.com)开发的一个支持短信网关系统开发的C++底层抽象接口库
💻 H
字号:
/**
 *	cmpp_message.h
 *	
 *	Short Message Abstractive Library.(SMAL)
 *
 *	Copyright 2003-2006	北京风起水流软件工作室
 *	
 *	http://www.zealware.com
 *	
 *	princetoad@gmail.com
 *
 */

#ifndef _CMPP_MESSAGE_H
#define _CMPP_MESSAGE_H

#include <common/const.h>

#pragma pack(1)

///** Submit消息中由接口库自定义的非标准消息
//*/
//struct NonStandardInfo {
//	/**记录ID,唯一标识一条submit消息
//		例如:一条MT消息的数据库记录ID
//	*/
//	unsigned	recid;				
//
//	/**CMPP_HEAD中的消息流水号
//	*/
//	unsigned long seqid;	
//
//	/**该消息被发送的时间
//	*/
//	unsigned	sendtime;
//
//	/**该消息被回复的时间
//	*/
//	unsigned	resptime;
//
//	/**该消息被发送的次数
//	*/
//	int				submittimes;
//
//	/**短消息发送的结果
//		如果成功收到SubmitResponse,此处为SubmitResponse的status字段值,
//		如果没有发送到网关,此处为系统定义的错误
//	*/
//	int				IIResult;			
//};


/**@name CMPP2.0协议消息结构定义 */
//@{

/**消息头定义
	同时定义了Terminate, TerminateResponse, ActiveTest消息
*/
//##ModelId=46B5D43E032F
typedef struct cmpp_head {
	/**消息总长度(含消息头及消息体)
	*/
	unsigned long nTotalLength;

	/**命令或响应类型
	*/
	unsigned long nCommandId;

	/**消息流水号,顺序累加,步长为1,循环使用(一对请求和应答消息的流水号必须相同)
	*/
	unsigned long nSeqId;
} CMPP_HEAD, CMPP_TERMINATE, CMPP_TERMINATE_RESP, CMPP_ACTIVETEST;

/**登录消息包体定义 
*/
//##ModelId=46B5D43E0357
typedef struct cmpp_connect {
	/**源地址,此处为SP_Id,即SP的企业代码。
	*/
	char					sSourceAddr[6+1];

	/**用于鉴别源地址。其值通过单向MD5 hash计算得出,表示如下:
		AuthenticatorSource =
		MD5(Source_Addr+9 字节的0 +shared secret+timestamp)
		Shared secret 由中国移动与源地址实体事先商定,timestamp格式为:MMDDHHMMSS,即月日时分秒,10位。
	*/
	char					sAuthSource[16+1];

	/**双方协商的版本号(高位4bit表示主版本号,低位4bit表示次版本号),对于3.0的版本,高4bit为3,低4位为0。
	*/
	unsigned char	cVersion;

	/**时间戳的明文,由客户端产生,格式为MMDDHHMMSS,即月日时分秒,10位数字的整型,右对齐 。
	*/
	unsigned long	nTimeStamp;

} CMPP_CONNECT;

/**登录回复包体定义 
*/
//##ModelId=46B5D43E0361
typedef struct cmpp_connect_resp {
	/**状态
	0:正确
	1:消息结构错
	2:非法源地址
	3:认证错
	4:版本太高
	5~ :其他错误
	*/
	//unsigned char		nStatus;
	unsigned long nStatus; // 兼容CMPP2,3

	/**ISMG认证码,用于鉴别ISMG。
	其值通过单向MD5 hash计算得出,表示如下:
	AuthenticatorISMG =MD5(Status+AuthenticatorSource+shared secret),Shared secret 由中国移动与源地址实体事先	商定,AuthenticatorSource为源地址实体发送给ISMG的对应消息CMPP_Connect中的值。
	认证出错时,此项为空。
	*/
	char					sAuthISMG[16+1];

	/**服务器支持的最高版本号,对于3.0的版本,高4bit为3,低4位为0
	*/
	unsigned char	cVersion;

} CMPP_CONNECT_RESP;

/**SUBMITResponse和DELIVERResponse消息包体定义
*/
//##ModelId=46B5D43E036C
typedef struct cmpp_submit_deliver_resp {
	/**信息标识,生成算法如下:
	采用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)
	*/
	unsigned _int64	nMsgid;

	/**结果:
	0:正确;
	1:消息结构错;
	2:命令字错;
	3:消息序号重复;
	4:消息长度错;
	5:资费代码错;
	6:超过最大信息长;
	7:业务代码错;
	8:流量控制错;
	9:本网关不负责服务此计费号码;
	10:Src_Id错误;
	11:Msg_src错误;
	12:Fee_terminal_Id错误;
	13:Dest_terminal_Id错误;
	……
	*/
	unsigned 		long		nResult; // 兼容CMPP2,3

	/**接口库自定义的字段,消息流水号
		(和CMPP_HEAD里面的流水号相同,这里重复赋值是为了不必返回整个CMPP_HEAD)
	*/
	unsigned 			long nSeqId;
} CMPP_SUBMIT_RESP, CMPP_DELIVER_RESP;

/**状态报告消息体定义 
*/
//##ModelId=46B5D43E0380
typedef struct cmpp_status_report {
	/**信息标识。
	SP提交短信(CMPP_SUBMIT)操作时,与SP相连的ISMG产生的Msg_Id。
	*/
	unsigned _int64	nMsgid;

	/**发送短信的应答结果。SP根据该字段确定CMPP_SUBMIT消息的处理状态。

	Message State		Final Message States		Description
	DELIVERED				DELIVRD									Message is delivered to destination
	EXPIRED					EXPIRED									Message validity period has expired
	DELETED					DELETED									Message has been deleted.
	UNDELIVERABLE		UNDELIV									Message is undeliverable
	ACCEPTED				ACCEPTD									Message is in accepted state(i.e. has been manually read on behalf of the subscriber by customer service)
	UNKNOWN					UNKNOWN									Message is in invalid state
	REJECTED				REJECTD									Message is in a rejected state
	MA:xxxx					MA:xxxx									SMSC不返回响应消息时的状态报告
	MB:xxxx					MB:xxxx									SMSC返回错误响应消息时的状态报告
	MC:xxxx					MC:xxxx									没有从SMSC处接收到状态报告时的状态报告
	CA:xxxx					CA:xxxx									SCP不返回响应消息时的状态报告
	CB:xxxx					CB:xxxx									SCP返回错误响应消息时的状态报告
	DA:xxxx					DA:xxxx									DSMP不返回响应消息时的状态报告
	DB:xxxx					DB:xxxx									DSMP返回错误响应消息时的状态报告
	SA:xxxx					SA:xxxx									SP不返回响应消息时的状态报告
	SB:xxxx					SB:xxxx									SP返回错误响应消息时的状态报告
	IA:xxxx					IA:xxxx									下一级ISMG不返回响应消息时的状态报告
	IB:xxxx					IB:xxxx									下一级ISMG返回错误响应消息时的状态报告
	IC:xxxx					IC:xxxx									没有从下一级ISMG处接收到状态报告时的状态报告
	*/
	char						sStat[7+1];

	/**YYMMDDHHMM(YY为年的后两位00-99,MM:01-12,DD:01-31,HH:00-23,MM:00-59)。
	*/
	char						sSubmitTime[10+1];

	/**YYMMDDHHMM。
	*/
	char						sDoneTime[10+1];

	/**目的终端MSISDN号码(SP发送CMPP_SUBMIT消息的目标终端)。
		兼容CMPP2,3
	*/
	//char						sDestTerminalId[21+1];
	char						sDestTerminalId[32+1];

	/**取自SMSC发送状态报告的消息体中的消息标识。
	*/
	unsigned			long nSmscSeq;
} CMPP_STATUS_REPORT;

/**DELIVER消息包体定义 
*/
//##ModelId=46B5D43E038A
typedef 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,循环使用。
	各部分如不能填满,左补零,右对齐。
	*/
	unsigned _int64	nMsgid;

	/**目的号码。
	SP的服务代码,一般4--6位,或者是前缀为服务代码的长号码;该号码是手机用户短消息的被叫号码。
	*/
	char						sDestid[21+1];

	/**业务标识,是数字、字母和符号的组合。
	*/
	char						sServiceid[10+1];

	/**GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9。
	*/
	unsigned char		uchTppid;

	/**GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐。
	*/
	unsigned char		uchTpudhi;

	/**信息格式:
	0:ASCII串;
	3:短信写卡操作;
	4:二进制信息;
	8:UCS2编码;
	15:含GB汉字。
	*/
	unsigned char		uchMsgfmt;

	/**源终端MSISDN号码(状态报告时填为CMPP_SUBMIT消息的目的终端号码)。
	*/
	//char						sSrcterminalid[21];
	char						sSrcterminalid[32+1];

	///**源终端号码类型,0:真实号码;1:伪码。
	/// 只有CMPP3支持
	//*/
	unsigned char		uchSrcterminaltype;

	/**是否为状态报告:
	0:非状态报告;
	1:状态报告。
	*/
	unsigned char		uchRegisteredDelivery;

	/**消息长度,取值大于或等于0。
	*/
	unsigned /*char*/long		uchMsglength;

	/**消息内容。
	*/
	union {
		char								sMsgcontent[/*256*/MAX_MSGCONTENT_LEN+1];
		CMPP_STATUS_REPORT	csr;
	} MO_Msg_Content;

	/**点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。
	cmpp2中为保留字段(8字节)
	兼容CMPP2,3
	*/
	//char						sLinkId[8];
	char						sLinkId[20+1];

  /** 接收时间
  */
  unsigned long recvtime;
} CMPP_DELIVER;

/**SUBMIT消息包体定义 
*/
//##ModelId=46B5D43E0394
typedef struct cmpp_submit {
	/**信息标识。
	*/
	unsigned _int64	nMsgid;

	/**相同Msg_Id的信息总条数,从1开始。
	*/
	unsigned char		uchPkTotal;

	/**相同Msg_Id的信息序号,从1开始。
	*/
	unsigned char		uchPkNumber;

	/**是否要求返回状态确认报告:
	0:不需要;
	1:需要。
	*/
	unsigned char		uchRegisteredDelivery;

	/**信息级别。
	*/
	unsigned char		uchMsgLevel;

	/**业务标识,是数字、字母和符号的组合。
	*/
	char						sServiceId[10+1];

	/**计费用户类型字段:
	0:对目的终端MSISDN计费;
	1:对源终端MSISDN计费;
	2:对SP计费;
	3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
	*/
	unsigned char		uchFeeUserType;

	/**被计费用户的号码,当Fee_UserType为3时该值有效,当Fee_UserType为0、1、2时该值无意义。
	*/
	//char						sFeeTerminalId[21];
	char						sFeeTerminalId[32+1];

	///**被计费用户的号码类型,0:真实号码;1:伪码。
	//*/
	unsigned char		uchFeeTerminalType;

	/**GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9。
	*/
	unsigned char		uchTpPid;

	/**GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐。
	*/
	unsigned char		uchTpUdhi;

	/**信息格式:
	0:ASCII串;
	3:短信写卡操作;
	4:二进制信息;
	8:UCS2编码;
	15:含GB汉字。。。。。。
	*/
	unsigned char		uchMsgFmt;

	/**信息内容来源(SP_Id)。
	*/
	char						sMsgSrc[6+1];

	/**资费类别:
	01:对“计费用户号码”免费;
	02:对“计费用户号码”按条计信息费;
	03:对“计费用户号码”按包月收取信息费。
	*/
	char						sFeeType[2+1];

	/**资费代码(以分为单位)。
	*/
	char						sFeeCode[6+1];

	/**存活有效期,格式遵循SMPP3.3协议。
	*/
	char						sValidTime[17+1];

	/**定时发送时间,格式遵循SMPP3.3协议。
	*/
	char						sAtTime[17+1];

	/**源号码。SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码。
	*/
	char						sSrcId[21+1];					///< SPID,接入号

	/**接收信息的用户数量(小于100个用户)。
	*/
	unsigned char		uchDstUsrTl;

	/**接收短信的MSISDN号码。
	*/
	//char						sDstTerminalId[21*100];
	char						sDstTerminalId[32*100+1];

	///**接收短信的用户的号码类型,0:真实号码;1:伪码。
	//*/
	unsigned char		uchDestTerminalType;

	/**信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节),取值大于或等于0。
	*/
	unsigned /*char*/long		uchMsgLength;

	/**信息内容。
	*/
	char						sMsgContent[MAX_MSGCONTENT_LEN+1];

	/**点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。
	cmpp2中为保留字段(8字节)
	*/
	//char						sLinkId[8];
	char						sLinkId[20+1];

	/**接口库自定义的非标准消息
	*/
	NonStandardInfo	nonStdMessage;
} CMPP_SUBMIT;

/**活动测试回复消息包体定义 
*/
//##ModelId=46B5D43E03A7
typedef struct cmpp_activetest_resp {
	unsigned char	uchReserved;
} CMPP_ACTIVETEST_RESP;

/**SP端收到的消息结构定义 
*/
//##ModelId=46B5D43E03B1
typedef struct cmpp_smgtosp {
	CMPP_HEAD	pk_head;

	union {
		CMPP_CONNECT_RESP			pk_connectresp;
		CMPP_SUBMIT_RESP			pk_submitresp;
		CMPP_DELIVER					pk_deliver;
		CMPP_ACTIVETEST_RESP	pk_activetestresp;
	} pk_body;
} CMPP_SMGTOSP;

#endif

⌨️ 快捷键说明

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