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