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