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

📄 cmpp_message.h

📁 CMPP 客户端接口API 符合中国移动CMPP3.0 2.0 适用于SP端客户端的开发
💻 H
字号:
/**
 *	cmpp_message.h
 *	
 *	Short Message Abstractive Library.(SMAL)
 *
 *	Copyright 2003-2006	北京风起水流软件工作室
 *	
 *	http://www.zealware.com
 *	
 *	princetoad@gmail.com
 *
 */

#ifndef _CMPP3_MESSAGE_H
#define _CMPP3_MESSAGE_H

#include <common/const.h>

#pragma pack(1)


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

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

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

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

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

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

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

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

/**登录回复包体定义 
*/
typedef struct cmpp_connect_resp {
	/**状态
	0:正确
	1:消息结构错
	2:非法源地址
	3:认证错
	4:版本太高
	5~ :其他错误
	*/
	PINTResult nStatus;

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

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

/**SUBMITResponse和DELIVERResponse消息包体定义
*/
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错误;
	……
	*/
	PINTResult nResult;
	//unsigned long nResult;

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

/**状态报告消息体定义 
*/
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];

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

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

	/**目的终端MSISDN号码(SP发送CMPP_SUBMIT消息的目标终端)。
	*/
	char						sDestTerminalId[LENGTH_OF_MSISDN_IN_MOMT];
	//char						sDestTerminalId[32];

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

/**DELIVER消息包体定义 
*/
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];

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

	/**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[32];
	char						sSrcterminalid[LENGTH_OF_MSISDN_IN_MOMT];

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

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

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

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

	/**点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。
	*/
	char						sLinkId[21];
} CMPP_DELIVER;

/**SUBMIT消息包体定义 
*/
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];

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

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

	/**被计费用户的号码类型,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];

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

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

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

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

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

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

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

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

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

	/**信息内容。
	*/
	char						sMsgContent[160];

	/**点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。
	*/
	char						sLinkId[21];

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

/**QUERY消息包体定义 
*/
typedef struct cmpp_query {
	/**时间YYYYMMDD(精确至日)。
	*/
	char					sTime[8];

	/**查询类别:
	0:总数查询;
	1:按业务类型查询。
	*/
	unsigned char	uchQueryType;

	/**查询码。
	当Query_Type为0时,此项无效;当Query_Type为1时,此项填写业务类型Service_Id.。
	*/
	char					sQueryCode[10];

	/**保留。
	*/
	char					sReserved[8];
} CMPP_QUERY;

/**QUERYResponse消息包体定义 
*/
typedef struct cmpp_query_resp {
	/**时间(精确至日)。
	*/
	char					sTime[8];

	/**查询类别:
	0:总数查询;
	1:按业务类型查询。
	*/
	unsigned char	uchQueryType;

	/**查询码。
	*/
	char					sQueryCode[10];

	/**从SP接收信息总数。
	*/
	unsigned long	nMTTLMsg;

	/**从SP接收用户总数。
	*/
	unsigned long	nMTTLUsr;

	/**成功转发数量。
	*/
	unsigned long	nMTScs;

	/**待转发数量。
	*/
	unsigned long	nMTWT;

	/**转发失败数量。
	*/
	unsigned long	nMTFL;

	/**向SP成功送达数量。
	*/
	unsigned long	nMOScs;

	/**向SP待送达数量。
	*/
	unsigned long	nMOWT;

	/**向SP送达失败数量。
	*/
	unsigned long	nMOFL;
} CMPP_QUERY_RESP;

/**CANCEL消息包体定义 
*/
typedef struct cmpp_cancel {
	/**信息标识(SP想要删除的信息标识)。
	*/
	unsigned _int64		nMsgid;
} CMPP_CANCEL;

/**CANCELResponse消息包体定义 
*/
typedef struct cmpp_cancel_resp {
	/**成功标识。
	0:成功;
	1:失败。
	*/
//#ifdef CMPP3_MSISDN24_RESULT1
//	unsigned	char nSuccessId;
//#else
//	unsigned	long nSuccessId;
//#endif
	PINTResult nSuccessId;
	//unsigned	long nSuccessId;
} CMPP_CANCEL_RESP;

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

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

	union {
		CMPP_CONNECT_RESP			pk_connectresp;
		CMPP_SUBMIT_RESP			pk_submitresp;
		CMPP_QUERY_RESP				pk_queryresp;
		CMPP_DELIVER					pk_deliver;
		CMPP_CANCEL_RESP			pk_cancelresp;
		CMPP_ACTIVETEST_RESP	pk_activetestresp;
	} pk_body;
} CMPP_SMGTOSP;

#endif

⌨️ 快捷键说明

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