📄 cmpp20.pas
字号:
Reserved: array[0..7] of char; //保留项
end;
//上行包应答包包体定义
//PCMPP_DELIVER_RESP_tag = ^TCMPP_DELIVER_RESP_tag;
TCMPP_DELIVER_RESP = packed record
Msg_Id: Int64; //信息标识
result: byte; //结果
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;
// 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;
////////////////////////////////////////////////////////////////////////////
// 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;
////////////////////////////////////////////////////////////////////////////
//链路检测操作
TCMPP_ACTIVE_TEST = TEmpty;
TCMPP_ACTIVE_TEST_RESP = packed record
Success_Id: byte; //结果
end;
//包体
TCMPP20_BODY = packed record
case integer of
1: (CMPP_CONNECT: TCMPP_CONNECT);
2: (CMPP_CONNECT_RESP: TCMPP_CONNECT_RESP);
3: (CMPP_SUBMIT: TCMPP_SUBMIT);
4: (CMPP_SUBMIT_RESP: TCMPP_SUBMIT_RESP);
5: (CMPP_DELIVER: TCMPP_DELIVER);
6: (CMPP_DELIVER_RESP: TCMPP_DELIVER_RESP);
7: (CMPP_ACTIVE_TEST: TCMPP_ACTIVE_TEST);
8: (CMPP_ACTIVE_TEST_RESP: TCMPP_ACTIVE_TEST_RESP);
end;
//包
TCMPP20_PACKET = packed record
MsgHead: TCMPP_HEAD;
MsgBody: TCMPP20_BODY;
end;
////////////////////////////////////////////////////////////////////////////
// 发送短信队列
tSendQueue = TCMPP_SUBMIT;
// 接收短信队列
tDeliverQueue = packed record
Head: TCMPP_DELIVER_HEAD;
Body: TCMPP_DELIVER
end;
// 接收状态回报队列
tReportQueue = packed record
Head: TCMPP_DELIVER_HEAD;
Body: TCMPP_Report_tag;
end;
{**************************************************************************}
{由于发送时包头和包体需要一块发送,下列为组合成一体的协议结构}
////////////////////////////////////////////////////////////////////////////
// CMPP_CONNECT 组合包 SP to ISMG
tCmpp_Connect_StoI = packed record
Head: TCMPP_HEAD;
Body: TCMPP_CONNECT;
end;
// CMPP_SUBMIT 组合包 SP to ISMG
tCmpp_Submit_StoI = packed record
Head: TCMPP_HEAD;
Body: TCMPP_SUBMIT;
end;
// CMPP_ACTIVE_TEST 组合包 SP to ISMG
tCmpp_ActiveTest_StoI = packed record
Head: TCMPP_HEAD;
Body: TCMPP_ACTIVE_TEST;
end;
// CMPP_DELIVER_RESP 组合包 ISMG to SP
tCmpp_Deliver_Resp_ItoS = packed record
Head: TCMPP_HEAD;
Body: TCMPP_DELIVER_RESP;
end;
// CMPP_ACTIVE_TEST_RESP 组合包 ISMG to SP
tCmpp_ActiveTest_Resp_ItoS = packed record
Head: TCMPP_HEAD;
Body: TCMPP_ACTIVE_TEST_RESP;
end;
// CMPP_CONNECT_RESP 组合包 ISMG to SP
tCmpp_Connect_Resp_ItoS = packed record
Head: TCMPP_HEAD;
Body: TCMPP_CONNECT_RESP;
end;
implementation
function ResultCommandString(var i: LongWord): string;
begin
case i of
$1: result := 'CMPP_CONNECT';
$80000001: result := 'CMPP_CONNECT_RESP';
$2: result := 'CMPP_TERMINATE';
$80000002: result := 'CMPP_TERMINATE_RESP';
$4: result := 'CMPP_SUBMIT';
$80000004: result := 'CMPP_SUBMIT_RESP';
$5: result := 'CMPP_DELIVER';
$80000005: result := 'CMPP_DELIVER_RESP';
$6: result := 'CMPP_QUERY';
$80000006: result := 'CMPP_QUERY_RESP';
$7: result := 'CMPP_CANCEL';
$80000007: result := 'CMPP_CANCEL_RESP';
$8: result := 'CMPP_ACTIVE_TEST';
$80000008: result := 'CMPP_ACTIVE_TEST_RESP';
$9: result := 'CMPP_FWD';
$80000009: result := 'CMPP_FWD_RESP ';
$10: result := 'CMPP_MT_ROUTE';
$80000010: result := 'CMPP_MT_ROUTE_RESP';
$11: result := 'CMPP_MO_ROUTE';
$80000011: result := 'CMPP_MO_ROUTE_RESP';
$12: result := 'CMPP_GET_ROUTE';
$80000012: result := 'CMPP_GET_ROUTE_RESP';
$13: result := 'CMPP_MT_ROUTE_UPDATE';
$80000013: result := 'CMPP_MT_ROUTE_UPDATE_RESP';
$14: result := 'CMPP_MO_ROUTE_UPDATE';
$80000014: result := 'CMPP_MO_ROUTE_UPDATE_RESP';
$15: result := 'CMPP_PUSH_MT_ROUTE_UPDATE';
$80000015: result := 'CMPP_PUSH_MT_ROUTE_UPDATE_RESP';
$16: result := 'CMPP_PUSH_MO_ROUTE_UPDATE';
$80000016: result := 'CMPP_PUSH_MO_ROUTE_UPDATE_RESP';
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -