📄 ~smgp_message.~h
字号:
/**
* smgp_message.h
*
* Short Message Abstractive Library.(SMAL)
*
* Copyright 2003-2006 北京风起水流软件工作室
*
* http://www.zealware.com
*
* princetoad@gmail.com
*
* $ Revision Date Author
* $ V1.1 2007/07/23 16:22 范圣刚
* 1.为字符型字段增加一个字节长度,方便二次开发使用.
*
*/
#ifndef _SMGP_MESSAGE_H
#define _SMGP_MESSAGE_H
#include <common/const.h>
#pragma pack(1)
/**@name SMGP协议消息结构定义 */
//@{
/** 消息头定义
字段 长度(字节) 数据类型 说明 参考
PacketLength 4 Integer 数据包长度 6.4.1.1
RequestID 4 Integer 请求标识 6.4.1.2
SequenceID 4 Integer 消息流水号 6.4.1.3
*/
typedef struct smgp_head {
/**
SMGP数据包长度,指包头和包体的长度之和。单位是“字节”。
*/
unsigned long nPacketLength;
/**
请求标识表示SMGP数据包的类型,请求包的请求标识和应答包的请求标识一一对应。
*/
unsigned long nRequestID;
/**
SMGP消息流水号,用来匹配请求数据包和应答数据包。
应答数据包的流水号字段必须与请求包的流水号字段一致。
流水号字段由请求包发起方分配,取值范围为0x00000000-0xFFFFFFFF,顺序累加,步长为1,循环使用。
*/
unsigned long nSequenceID;
} SMGP_HEAD, SMGP_TERMINATE, SMGP_TERMINATE_RESP, SMGP_ACTIVETEST, SMGP_ACTIVETEST_RESP;
/** 登录消息包体定义
字段 长度
(字节) 数据类型 说明 参考
必选参数 ClientID 8 Octet String 客户端用来登录服务器端的用户账号。 6.4.2.1
AuthenticatorClient 16 Octet String 客户端认证码,用来鉴别客户端的合法性。 6.4.2.2
LoginMode 1 Integer 客户端用来登录服务器端的登录类型。 6.4.2.3
TimeStamp 4 Integer 时间戳 6.4.2.4
ClientVersion 1 Integer 客户端支持的协议版本号 6.4.2.5
length = 30
*/
typedef struct smgp_connect {
/**
客户端用来登录服务器端的用户账号,此处为SP服务代码。SP服务代码由中国电信分配。
*/
char sSourceAddr[8+1];
/**
客户端认证码,用来鉴别SP的合法性。
其值通过单向MD5 hash计算得出,表示如下:
AuthenticatorClient =MD5(ClientID+7 字节的二进制0(0x00) +shared secret+timestamp)
ClientID 为SP服务代码,不足8位时不补0。
Shared secret 由服务器端与客户端事先商定,最长15字节,不足15位时不补0。
此处Timestamp格式为:MMDDHHMMSS,即月日时分秒,10位,右对齐。
例如3月1日0时0分0秒,即为0301000000。
*/
char sAuthSource[16+1];
/**
Login客户端用来登录服务器端的登录类型。
0=发送短消息(send mode);
1=接收短消息(receive mode);
2=收发短消息(transmit mode);
其它保留。
建议SP发送短消息时采用发送短消息模式(LoginMode=0),接收短消息时采用接收短消息模式(LoginMode=1)。
*/
unsigned char cLoginMode;
/**
Login客户端用于MD5计算AuthenticatorClient,参见6.4.2.2。
Timestamp格式为整型。
例如3月1日0时0分0秒,用于MD5计算时为0301000000,此处转换为整型数即为11F0E540。
*/
unsigned long nTimeStamp;
/**
Login客户端支持的协议版本号。
高4bit表示主版本号,低4bit表示次版本号。
例如0x30,表示协议版本号为3.0。
*/
unsigned char cVersion;
} SMGP_CONNECT;
/**
登录回复包体定义
字段 长度
(字节) 数据类型 说明 参考
必选参数 Status 4 Integer 请求返回结果 6.4.2.6
AuthenticatorServer 16 Octet String 服务器端返回给客户端的认证码 6.4.2.7
ServerVersion 1 Integer 服务器端支持的最高版本号 6.4.2.8
SMGP协议的结果码定义如下:
代码 含义
0 成功
1 系统忙
2 超过最大连接数
3 系统超时
4 发送失败
5-9 保留
10 消息结构错
11 命令字错
12 序列号错
13-19 保留
20 IP地址错
21 认证错
22 版本号不匹配
23-29 保留
30 非法消息类型(MsgType)
31 非法优先级(Priority)
32 非法资费类型(FeeType)
33 非法资费代码(FeeCode)
34 非法短消息编码格式(MsgFormat)
35 非法时间格式
36 非法短消息长度(MsgLength)
37 有效期已过
38 非法查询类别(QueryType)
39 路由错误
40 非法包月费/封顶费(FixedFee)
43 非法业务代码(ServiceID)
44 非法短消息有效时间(ValidTime)
45 非法定时发送时间(AtTime)
46 非法发送用户号码(SrcTermID)
47 非法接收用户号码(DestTermID)
48 非法计费用户号码(ChargeTermID)
49 非法SP代码
50 非预付费用户
51 余额不足
52 非注册用户:属于预付费用户,但该号码还未被注册
53 非注册SP
54 帐号不可用:属于预付费用户,但该帐号处于不可用状态,如已冻结等
55 扣费失败
56-111 保留
112 终端存储部件不存在
113 终端存储部件满
114 终端不支持的加密模式
115 非法交互信息类型(IIType)
116 非法交互码(ICode)
117-127 保留
128-255 厂家自定义
12×××× ISMAP协议转换后的错误代码(其中××××为ISMAP协议中的错误码)
13×××× 短消息过滤系统错误代码(其中××××为短消息过滤系统返回的错误代码)
*/
typedef struct smgp_connect_resp {
/**
请求返回结果。响应包用来向请求包返回成功信息或者失败原因。
*/
unsigned long nStatus;
/**
Login服务器端返回给客户端的认证码,当客户端认证出错时,此项为空。
其值通过单向MD5 hash计算得出,表示如下:
AuthenticatorServer =MD5(Status+AuthenticatorClient +shared secret)
Shared secret 由服务器端与客户端事先商定,最长15字节AuthenticatorClient为客户端发送给服务器端的上一条消息Login中的值。参见6.4.2.2。
*/
char sAuthISMG[16+1];
/**
Login服务器端支持的最高版本号。
高4bit表示主版本号,低4bit表示次版本号。
例如0x30,表示协议版本号3.0。
*/
unsigned char cVersion;
} SMGP_CONNECT_RESP;
struct smgp_tlv_221 {
unsigned short tag;
unsigned short length;
unsigned char value;
};
typedef struct smgp_tlv_221 SMGP_TLV_TP_pid;
typedef struct smgp_tlv_221 SMGP_TLV_TP_udhi;
typedef struct smgp_tlv_221 SMGP_TLV_ChargeUserType;
typedef struct smgp_tlv_221 SMGP_TLV_ChargeTermType;
typedef struct smgp_tlv_221 SMGP_TLV_DestTermType;
typedef struct smgp_tlv_221 SMGP_TLV_PkTotal;
typedef struct smgp_tlv_221 SMGP_TLV_PkNumber;
typedef struct smgp_tlv_221 SMGP_TLV_SubmitMsgType;
typedef struct smgp_tlv_221 SMGP_TLV_SPDealResult;
typedef struct smgp_tlv_221 SMGP_TLV_SrcTermType;
typedef struct smgp_tlv_linkid {
unsigned short tag;
unsigned short length;
unsigned char value[20+1];
} SMGP_TLV_LINKID ;
struct smgp_tlv_22Pseudo {
unsigned short tag;
unsigned short length;
unsigned char value[32+1];
};
typedef struct smgp_tlv_22Pseudo SMGP_TLV_ChargeTermPseudo;
typedef struct smgp_tlv_22Pseudo SMGP_TLV_DestTermPseudo;
typedef struct smgp_tlv_22Pseudo SMGP_TLV_SrcTermPseudo;
typedef struct smgp_tlv_228{
unsigned short tag;
unsigned short length;
unsigned char value[8+1];
} SMGP_TLV_MsgSrc;
typedef struct smgp_tlv_2221{
unsigned short tag;
unsigned short length;
unsigned char value[21+1];
} SMGP_TLV_MServiceID;
/**
SUBMITResponse和DELIVERResponse消息包体定义
字段 长度
(字节) 数据类型 说明 参考
必选参数 MsgID 10 Octet String 短消息流水号 6.4.2.25
Status 4 Integer 请求返回结果 6.4.2.6
*/
typedef struct smgp_submit_deliver_resp {
/**
短消息流水号,用来唯一标识一条短消息,用于SMGP_Submit_Resp、SMGP_Deliver、SMGP_Deliver_Resp消息。
SMGP_Submit_Resp和SMGP_Deliver消息中的MsgID由SP接入点产生,包含以下三部分内容:
SP接入点代码:3字节(BCD码)
时间:4字节(BCD码),格式为MMDDHHMM(月日时分)
序列号:3字节(BCD码),取值范围为0x000000~0x999999,从0开始,顺序累加,步长为1,循环使用。
SMGP_Deliver_Resp消息中的MsgID同相应的SMGP_Deliver消息中的MsgID。
例如某SP接入点的代码为010061,在2003年1月16日下午5时0分收到一条短消息,这条短消息的MsgID为:0x01006101161700012345,其中010061表示SP接入点代码,01161700表示接收时间,012345表示消息序列号。
*/
char sMsgid[10+1];
/**Submit请求返回结果(参见错误代码表)
*/
unsigned long nResult;
/**
非标准字段,用来存储Response的流水号
(就是消息头里面的流水号)
*/
unsigned long nSeqId;
} SMGP_SUBMIT_RESP, SMGP_DELIVER_RESP;
/**状态报告消息体定义 */
/**
id(14,+3)
id:IIIIIIIIII空格
69 64 3a 85 10 61 06 18 19 01 06 05 08 20
Sub(8,+4)
Sub:001空格
73 75 62 3a 30 30 31 20
dlvrd(10,+6)
dlvrd:001空格
64 6c 76 72 64 3a 30 30 31 20
submitdate(23,+12)
submit date:06181932空格
73 75 62 6d 69 74 20 64 61 74 65 3a 30 36 30 36 31 38 31 39 30 32 20
donedate(21,+10)
done date:0606181902空格
64 6f 6e 65 20 64 61 74 65 3a 30 36 30 36 31 38 31 39 30 32 20
state(13,+5)
stat:DELIVRD空格
73 74 61 74 3a 44 45 4c 49 56 52 44 20
err(8,+4)
err:000空格
65 72 72 3a 30 30 30 20
text(25,+5)
text:114消息内容(无空格)
74 65 78 74 3a 31 31 34 c4 fa d6 a7 b3 d6 b5 c4 b2 ce c8 fc d1 a1 ca d6 b8
*/
typedef struct smgp_status_report {
/**状态报告对应原始消息的MsgID
id(14,+3)
id:IIIIIIIIII空格
69 64 3a 85 10 61 06 18 19 01 06 05 08 20
*/
char SR_id[14+1];
/**取缺省值001
Sub(8,+4)
Sub:001空格
73 75 62 3a 30 30 31 20
*/
char SR_sub[8+1];
/**取缺省值001
dlvrd(10,+6)
dlvrd:001空格
64 6c 76 72 64 3a 30 30 31 20
*/
char SR_dlvrd[10+1];
/**短消息提交格式(格式:yymmddhhmm,例如010331200000)
submitdate(23,+12)
submit date:06181932空格
73 75 62 6d 69 74 20 64 61 74 65 3a 30 36 30 36 31 38 31 39 30 32 20
*/
char SR_submitdate[23+1];
/**短消息下发时间(格式:yymmddhhmm,例如010331200000)
donedate(21,+10)
done date:0606181902空格
64 6f 6e 65 20 64 61 74 65 3a 30 36 30 36 31 38 31 39 30 32 20
*/
char SR_donedate[21+1];
/**短消息状态(参见6.3节短消息状态表)
stat(13,+5)
stat:DELIVRD空格
73 74 61 74 3a 44 45 4c 49 56 52 44 20
*/
char SR_state[13+1];
/**参见第6.4节错误代码表
err(8,+4)
err:000空格
65 72 72 3a 30 30 30 20
*/
char SR_err[8+1];
/**前三个字节,表示短消息长度(用ASCII码表示),
后17个字节表示短消息的内容(保证内容不出现乱码)
text(25,+5)
text:114消息内容(无空格)
74 65 78 74 3a 31 31 34 c4 fa d6 a7 b3 d6 b5 c4 b2 ce c8 fc d1 a1 ca d6 b8
*/
char SR_text[25+1];
} SMGP_STATUS_REPORT;
/**
DELIVER消息包体定义
字段 长度
(字节) 数据类型 说明 参考
必
选
参
数
MsgID 10 Octet String 短消息流水号 6.4.2.25
IsReport 1 Integer 是否为状态报告 6.4.2.26
MsgFormat 1 Integer 短消息格式 6.4.2.16
RecvTime 14 Octet String 短消息接收时间 6.4.2.27
SrcTermID 21 Octet String 短消息发送号码 6.4.2.19
DestTermID 21 Octet String 短消息接收号码 6.4.2.22
MsgLength 1 Integer 短消息长度 6.4.2.23
MsgContent MsgLength Octet String 短消息内容 6.4.2.24
Reserve 8 Octet String 保留 6.4.2.28
可选参数 字段 数据类型 说明 参考
TP_pid TLV GSM协议类型 6.4.3.2
TP_udhi TLV GSM协议类型 6.4.3.3
LinkID TLV 交易标识 6.4.3.4
SrcTermType TLV 短消息发送方的号码类型 6.4.3.14
SrcTermPseudo TLV 短消息发送方的伪码 6.4.3.15
SubmitMsgType TLV SP发送的消息类型 6.4.3.12
SPDealResult TLV SP对消息的处理结果 6.4.3.13
*/
typedef struct smgp_deliver {
char sMsgid[10+1];
unsigned char uchRegisteredDelivery;
/**
对于文字短消息,要求为15。对于回执消息,要求为0。
*/
unsigned char uchMsgfmt;
/**
SP接入点接收到短消息的时间。格式为YYYYMMDDHHMMSS(年年年年月月日日时时分分秒秒)。
*/
char sRecvTime[14+1];
char sSrcterminalid[21+1];
char sDestid[21+1];
unsigned char uchMsglength;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -