📄 cmpp_protocol.pas
字号:
//文件名称:YiDong_Cmpp.pas
//文件标识:tYD_Cmpp类
//当前版本:1.0
//作 者:邵青山,李朔刚
//mail: sqs@minefont.com lshuogang@sohu.com
//完成日期:2003年5月27日
unit CMPP_Protocol;
interface
const
CMPP_CONNECT: LongWord = $00000001;
CMPP_CONNECT_RESP: LongWord = $80000001;
CMPP_TERMINATE: LongWord = $00000002;
CMPP_TERMINATE_RESP: LongWord = $80000002;
CMPP_SUBMIT: LongWord = $00000004;
CMPP_SUBMIT_RESP: LongWord = $80000004;
CMPP_DELIVER: LongWord = $00000005;
CMPP_DELIVER_RESP: LongWord = $80000005;
CMPP_QUERY: LongWord = $00000006;
CMPP_QUERY_RESP: LongWord = $80000006;
CMPP_CANCEL: LongWord = $00000007;
CMPP_CANCEL_RESP: LongWord = $80000007;
CMPP_ACTIVE_TEST: LongWord = $00000008;
CMPP_ACTIVE_TEST_RESP: LongWord = $80000008;
CMPP_FWD: LongWord = $00000009;
CMPP_FWD_RESP: LongWord = $80000009;
CMPP_MT_ROUTE: LongWord = $00000010;
CMPP_MT_ROUTE_RESP: LongWord = $80000010;
CMPP_MO_ROUTE: LongWord = $00000011;
CMPP_MO_ROUTE_RESP: LongWord = $80000011;
CMPP_GET_ROUTE: LongWord = $00000012;
CMPP_GET_ROUTE_RESP: LongWord = $80000012;
CMPP_MT_ROUTE_UPDATE: LongWord = $00000013;
CMPP_MT_ROUTE_UPDATE_RESP: LongWord = $80000013;
CMPP_MO_ROUTE_UPDATE: LongWord = $00000014;
CMPP_MO_ROUTE_UPDATE_RESP: LongWord = $80000014;
CMPP_PUSH_MT_ROUTE_UPDATE: LongWord = $00000015;
CMPP_PUSH_MT_ROUTE_UPDATE_RESP: LongWord = $80000015;
CMPP_PUSH_MO_ROUTE_UPDATE: LongWord = $00000016;
CMPP_PUSH_MO_ROUTE_UPDATE_RESP: LongWord = $80000016;
CMPP_REPORT: LongWord = $00000050; //CMPP协议中没有此信息,为了区分CMPP_DELIVER包
MSG_LENGTH = 140; //短信内容长度
//Queue_Max_Length = 1000; //队列的最大长度
const
//Connect 返回值
ERR_CONNECT_SUCCESS = $00; //连接正确
ERR_CONNECT_BODY = $01; //结构体错误
ERR_CONNECT_INVALID_SP_ID = $02; //非法SP ID
ERR_CONNECT_SP_AUTHENTICATION = $03; //SP认证错
ERR_CONNECT_VERSION = $04; //版本太高
//Submit 返回值
ERR_SUBMIT_SUCCESS = $00; //成功
ERR_SUBMIT_BODY = $01; //结构体错
ERR_SUBMIT_COMMAND = $02; //命令错
ERR_SUBMIT_MSG_ID = $03; //流水号重复
ERR_SUBMIT_MSG_LENGTH = $04; //消息长度错
ERR_SUBMIT_FEE_CODE = $05; //资费代码错
ERR_SUBMIT_TO_LONG = $06; //信息太长
ERR_SUBMIT_SERVICE_ID = $07; //业务代码错
ERR_SUBMIT_FLOW_CONTROL = $08; //流量控制错
//Deliver 返回值
ERR_DELIVER_SUCCESS = $00; //成功
ERR_DELIVER_BODY = $01; //结构体错
ERR_DELIVER_COMMAND = $02; //命令错
ERR_DELIVER_MSG_ID = $03; //流水号重复
ERR_DELIVER_MSG_LENGTH = $04; //消息长度错
ERR_DELIVER_FEE_CODE = $05; //资费代码错
ERR_DELIVER_TO_LONG = $06; //信息太长
ERR_DELIVER_SERVICE_ID = $07; //业务代码错
ERR_DELIVER_FLOW_CONTROL = $08; //流量控制错
//Cancel 返回值
ERR_CANCEL_SUCCESS = $00; //成功
ERR_CANCEL_FAULT = $01; //失败
//Active 返回值
ERR_ACTIVE_SUCCESS = $00; //成功
type
TEmpty = record //空纪录
end;
//消息头
PCMPP_HEAD_tag = ^TCMPP_HEAD_tag;
TCMPP_HEAD_tag = packed record
Total_Length: LongWord; //消息总长度(含消息头及消息体)
Command_ID: LongWord; //命令或响应类型
Sequence_ID: LongWord; //消息流水号,顺序累加,步长为1,循环使用(一对请求和应答消息的流水号必须相同)
end;
////////////////////////////////////////////////////////////////////////////
// SP 请求连接到 ISMG
PCMPP_CONNECT_tag = ^TCMPP_CONNECT_tag;
TCMPP_CONNECT_tag = packed record
Source_Addr: array[0..5] of Char; //源地址,此处为SP_Id,即SP的企业代码。
AuthenticatorSource: array[0..15] of Char; //用于鉴别源地址。其值通过单向MD5 hash计算得出,表示如下:AuthenticatorSource =MD5(Source_Addr+9 字节的0 +shared secret+timestamp)Shared secret 由中国移动与源地址实体事先商定,timestamp格式为:MMDDHHMMSS,即月日时分秒,10位。
Version: Byte; //双方协商的版本号(高位4bit表示主版本号,低位4bit表示次版本号)
Timestamp: LongWord; //时间戳的明文,由客户端产生,格式为MMDDHHMMSS,即月日时分秒,10位数字的整型,右对齐 。
end;
PCMPP_CONNECT_RESP_tag = ^TCMPP_CONNECT_RESP_tag;
TCMPP_CONNECT_RESP_tag = packed record
Status: Byte; //状态0:正确1:消息结构错 2:非法源地址 3:认证错 4:版本太高 5~ :其他错误
AuthenticatorISMG: array[0..15] of Char; //ISMG认证码,用于鉴别ISMG。其值通过单向MD5 hash计算得出,表示如下:AuthenticatorISMG =MD5(Status+AuthenticatorSource+shared secret),Shared secret 由中国移动与源地址实体事先商定,AuthenticatorSource为源地址实体发送给ISMG的对应消息CMPP_Connect中的值。 认证出错时,此项为空
Version: Byte; //服务器支持的最高版本号
end;
////////////////////////////////////////////////////////////////////////////
// SP 或 ISMG 请求拆除连接
TCMPP_TERMINATE_tag = TEmpty;
TCMPP_TERMINATE_RESP_tag = TEmpty;
////////////////////////////////////////////////////////////////////////////
// SP 向 ISMG 提交短信
PCMPP_SUBMIT_tag = ^TCMPP_SUBMIT_tag;
TCMPP_SUBMIT_tag = packed record
Msg_Id: Int64; //信息标识,由SP侧短信网关本身产生,本处填空。
Pk_total: Byte; //相同Msg_Id的信息总条数,从1开始
Pk_number: Byte; //相同Msg_Id的信息序号,从1开始
Registered_Delivery: Byte; //是否要求返回状态确认报告:0:不需要1:需要2:产生SMC话单 (该类型短信仅供网关计费使用,不发送给目的终端)
Msg_level: Byte; //信息级别
Service_Id: array[0..9] of Char; //业务类型,是数字、字母和符号的组合。
Fee_UserType: Byte; //计费用户类型字段0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
Fee_terminal_Id: array[0..20] of Char; //被计费用户的号码(如本字节填空,则表示本字段无效,对谁计费参见Fee_Userstruct字段,本字段与Fee_Userstruct字段互斥)
TP_pId: Byte; //GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
TP_udhi: Byte; //GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
Msg_Fmt: Byte; //信息格式 0:ASCII串 3:短信写卡操作 4:二进制信息 8:UCS2编码15:含GB汉字
Msg_src: array[0..5] of Char; //信息内容来源(SP_Id)
FeeType: array[0..1] of Char; //资费类别01:对"计费用户号码"免费
FeeCode: array[0..5] of Char; //资费代码(以分为单位)
ValId_Time: array[0..16] of Char; //存活有效期,格式遵循SMPP3.3协议
At_Time: array[0..16] of Char; //定时发送时间,格式遵循SMPP3.3协议
Src_Id: array[0..20] of Char; //源号码SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码
DestUsr_tl: Byte; //接收信息的用户数量(小于100个用户)
Dest_terminal_Id: array[0..20] of Char; //接收短信的MSISDN号码
Msg_Length: Byte; //信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节)
Msg_Content: array[0..MSG_LENGTH - 1] of Char; //信息内容
Reserve: array[0..7] of Char; //保留
end;
//短信群发 注:在群发中,由于 手机号是可变长的,所以在程序中定义,长度为21*手机个数
PCMPP_SUBMIT_QF_tag1 = ^TCMPP_SUBMIT_QF_tag1;
TCMPP_SUBMIT_QF_tag1 = packed record
Msg_Id: Int64; //信息标识,由SP侧短信网关本身产生,本处填空。
Pk_total: Byte; //相同Msg_Id的信息总条数,从1开始
Pk_number: Byte; //相同Msg_Id的信息序号,从1开始
Registered_Delivery: Byte; //是否要求返回状态确认报告:0:不需要1:需要2:产生SMC话单 (该类型短信仅供网关计费使用,不发送给目的终端)
Msg_level: Byte; //信息级别
Service_Id: array[0..9] of Char; //业务类型,是数字、字母和符号的组合。
Fee_UserType: Byte; //计费用户类型字段0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
Fee_terminal_Id: array[0..20] of Char; //被计费用户的号码(如本字节填空,则表示本字段无效,对谁计费参见Fee_Userstruct字段,本字段与Fee_Userstruct字段互斥)
TP_pId: Byte; //GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
TP_udhi: Byte; //GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
Msg_Fmt: Byte; //信息格式 0:ASCII串 3:短信写卡操作 4:二进制信息 8:UCS2编码15:含GB汉字
Msg_src: array[0..5] of Char; //信息内容来源(SP_Id)
FeeType: array[0..1] of Char; //资费类别01:对"计费用户号码"免费
FeeCode: array[0..5] of Char; //资费代码(以分为单位)
ValId_Time: array[0..16] of Char; //存活有效期,格式遵循SMPP3.3协议
At_Time: array[0..16] of Char; //定时发送时间,格式遵循SMPP3.3协议
Src_Id: array[0..20] of Char; //源号码SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码
DestUsr_tl: Byte; //接收信息的用户数量(小于100个用户)
end;
PCMPP_SUBMIT_QF_tag2 = ^TCMPP_SUBMIT_QF_tag2;
TCMPP_SUBMIT_QF_tag2 = packed record
Msg_Length: Byte; //信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节)
Msg_Content: array[0..MSG_LENGTH - 1] of Char; //信息内容
Reserve: array[0..7] of Char; //保留
end;
pCMPP_SUBMIT_RESP_tag = ^tCMPP_SUBMIT_RESP_tag;
tCMPP_SUBMIT_RESP_tag = packed record
Msg_Id: Int64; //信息标识
Result: Byte; //结果
end;
////////////////////////////////////////////////////////////////////////////
// SP 向 ISMG 查询发送短信状态
PCMPP_QUERY_tag = ^TCMPP_QUERY_tag;
TCMPP_QUERY_tag = packed record
Time: array[0..7] of Char; //时间YYYYMMDD(精确至日)
Query_Type: Byte; //查询类别0:总数查询1:按业务类型查询
Query_Code: array[0..9] of Char; //查询码当Query_struct为0时,此项无效;当Query_struct为1时,此项填写业务类型Service_Id.
Reserve: array[0..7] of Char; //保留
end;
PCMPP_QUERY_RESP_tag = ^TCMPP_QUERY_RESP_tag;
TCMPP_QUERY_RESP_tag = packed record
Time: array[0..7] of Char; //时间(精确至日)
Query_Type: Byte; //查询类别0:总数查询1:按业务类型查询
Query_Code: array[0..9] of Char; //查询码
MT_TLMsg: LongWord; //从SP接收信息总数
MT_Tlusr: LongWord; //从SP接收用户总数
MT_Scs: LongWord; //成功转发数量
MT_WT: LongWord; //待转发数量
MT_FL: LongWord; //转发失败数量
MO_Scs: LongWord; //向SP成功送达数量
MO_WT: LongWord; //向SP待送达数量
MO_FL: LongWord; //向SP送达失败数量
end;
////////////////////////////////////////////////////////////////////////////
// ISMG 向 SP 送交短信
// 由于在CMPP中,DELIVER和REPORT同一个命令号,所以读包体中也分两步,即先读前
// 部份,再从Msg_Length和Registered_Delivery中判断剩余长度和内容
PCMPP_DELIVER_HEAD_tag = ^TCMPP_DELIVER_HEAD_tag;
TCMPP_DELIVER_HEAD_tag = packed record
Msg_Id: Int64; //信息标识
Dest_Id: array[0..20] of Char; //目的号码
Service_Id: array[0..9] of Char; //业务类型,是数字、字母和符号的组合。
TP_pid: Byte; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
TP_udhi: Byte; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
Msg_Fmt: Byte; //信息格式
Src_terminal_Id: array[0..20] of Char; //源终端MSISDN号码
Registered_Delivery: Byte; //是否为状态报告0:非状态报告1:状态报告
Msg_Length: Byte; //消息长度
end;
// Deliver后半部分
PCMPP_DELIVER_tag = ^TCMPP_DELIVER_tag;
TCMPP_DELIVER_tag = packed record
Msg_Content: array[0..MSG_LENGTH - 1] of Char; //消息内容
Reserved: array[0..7] of Char; //保留项
end;
// ISMG 向 SP 送交状态报告
PCMPP_Report_tag = ^TCMPP_Report_tag;
TCMPP_Report_tag = packed record
// ISMG 向 SP 送交状态报告时,信息内容字段(Msg_Content)格式定义
Msg_ID: Int64; //信息标识
Stat: array[0..6] of Char; //短信应答结果,详见CMPP
Submit_time: array[0..9] of Char; //提交时间
Done_time: array[0..9] of Char; //完成时间
Dest_Terminal_Id: array[0..20] of Char; //目的终端号码
SMSC_sequence: LongWord;
//////////////////////////////
Reserved: array[0..7] of Char; //保留项
end;
PCMPP_DELIVER_RESP_tag = ^TCMPP_DELIVER_RESP_tag;
TCMPP_DELIVER_RESP_tag = packed record
Msg_Id: Int64; //信息标识
Result: Byte; //结果
end;
////////////////////////////////////////////////////////////////////////////
// SP 向 ISMG 发起删除短信操作
PCMPP_CANCEL_tag = ^TCMPP_CANCEL_tag;
TCMPP_CANCEL_tag = packed record
Msg_Id: Int64; //信息标识
end;
PCMPP_CANCEL_RESP_tag = ^TCMPP_CANCEL_RESP_tag;
TCMPP_CANCEL_RESP_tag = packed record
Success_Id: Byte; //结果
end;
////////////////////////////////////////////////////////////////////////////
//链路检测操作
PCMPP_ACTIVE_TEST_tag = ^TCMPP_ACTIVE_TEST_tag;
TCMPP_ACTIVE_TEST_tag = TEmpty;
PCMPP_ACTIVE_TEST_RESP_tag = ^TCMPP_ACTIVE_TEST_RESP_tag;
TCMPP_ACTIVE_TEST_RESP_tag = packed record
Success_Id: Byte; //结果
end;
implementation
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -