?? cmpp_protocol.pas
字號:
//文件名稱:YiDong_Cmpp.pas
//文件標(biāo)識:tYD_Cmpp類
//當(dāng)前版本: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協(xié)議中沒有此信息,為了區(qū)分CMPP_DELIVER包
MSG_LENGTH = 140; //短信內(nèi)容長度
//Queue_Max_Length = 1000; //隊列的最大長度
const
//Connect 返回值
ERR_CONNECT_SUCCESS = $00; //連接正確
ERR_CONNECT_BODY = $01; //結(jié)構(gòu)體錯誤
ERR_CONNECT_INVALID_SP_ID = $02; //非法SP ID
ERR_CONNECT_SP_AUTHENTICATION = $03; //SP認(rèn)證錯
ERR_CONNECT_VERSION = $04; //版本太高
//Submit 返回值
ERR_SUBMIT_SUCCESS = $00; //成功
ERR_SUBMIT_BODY = $01; //結(jié)構(gòu)體錯
ERR_SUBMIT_COMMAND = $02; //命令錯
ERR_SUBMIT_MSG_ID = $03; //流水號重復(fù)
ERR_SUBMIT_MSG_LENGTH = $04; //消息長度錯
ERR_SUBMIT_FEE_CODE = $05; //資費代碼錯
ERR_SUBMIT_TO_LONG = $06; //信息太長
ERR_SUBMIT_SERVICE_ID = $07; //業(yè)務(wù)代碼錯
ERR_SUBMIT_FLOW_CONTROL = $08; //流量控制錯
//Deliver 返回值
ERR_DELIVER_SUCCESS = $00; //成功
ERR_DELIVER_BODY = $01; //結(jié)構(gòu)體錯
ERR_DELIVER_COMMAND = $02; //命令錯
ERR_DELIVER_MSG_ID = $03; //流水號重復(fù)
ERR_DELIVER_MSG_LENGTH = $04; //消息長度錯
ERR_DELIVER_FEE_CODE = $05; //資費代碼錯
ERR_DELIVER_TO_LONG = $06; //信息太長
ERR_DELIVER_SERVICE_ID = $07; //業(yè)務(wù)代碼錯
ERR_DELIVER_FLOW_CONTROL = $08; //流量控制錯
//Cancel 返回值
ERR_CANCEL_SUCCESS = $00; //成功
ERR_CANCEL_FAULT = $01; //失敗
//Active 返回值
ERR_ACTIVE_SUCCESS = $00; //成功
type
TEmpty = record //空紀(jì)錄
end;
//消息頭
PCMPP_HEAD_tag = ^TCMPP_HEAD_tag;
TCMPP_HEAD_tag = packed record
Total_Length: LongWord; //消息總長度(含消息頭及消息體)
Command_ID: LongWord; //命令或響應(yīng)類型
Sequence_ID: LongWord; //消息流水號,順序累加,步長為1,循環(huán)使用(一對請求和應(yīng)答消息的流水號必須相同)
end;
////////////////////////////////////////////////////////////////////////////
// SP 請求連接到 ISMG
PCMPP_CONNECT_tag = ^TCMPP_CONNECT_tag;
TCMPP_CONNECT_tag = packed record
Source_Addr: array[0..5] of Char; //源地址,此處為SP_Id,即SP的企業(yè)代碼。
AuthenticatorSource: array[0..15] of Char; //用于鑒別源地址。其值通過單向MD5 hash計算得出,表示如下:AuthenticatorSource =MD5(Source_Addr+9 字節(jié)的0 +shared secret+timestamp)Shared secret 由中國移動與源地址實體事先商定,timestamp格式為:MMDDHHMMSS,即月日時分秒,10位。
Version: Byte; //雙方協(xié)商的版本號(高位4bit表示主版本號,低位4bit表示次版本號)
Timestamp: LongWord; //時間戳的明文,由客戶端產(chǎn)生,格式為MMDDHHMMSS,即月日時分秒,10位數(shù)字的整型,右對齊 。
end;
PCMPP_CONNECT_RESP_tag = ^TCMPP_CONNECT_RESP_tag;
TCMPP_CONNECT_RESP_tag = packed record
Status: Byte; //狀態(tài)0:正確1:消息結(jié)構(gòu)錯 2:非法源地址 3:認(rèn)證錯 4:版本太高 5~ :其他錯誤
AuthenticatorISMG: array[0..15] of Char; //ISMG認(rèn)證碼,用于鑒別ISMG。其值通過單向MD5 hash計算得出,表示如下:AuthenticatorISMG =MD5(Status+AuthenticatorSource+shared secret),Shared secret 由中國移動與源地址實體事先商定,AuthenticatorSource為源地址實體發(fā)送給ISMG的對應(yīng)消息CMPP_Connect中的值。 認(rèn)證出錯時,此項為空
Version: Byte; //服務(wù)器支持的最高版本號
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; //信息標(biāo)識,由SP側(cè)短信網(wǎng)關(guān)本身產(chǎn)生,本處填空。
Pk_total: Byte; //相同Msg_Id的信息總條數(shù),從1開始
Pk_number: Byte; //相同Msg_Id的信息序號,從1開始
Registered_Delivery: Byte; //是否要求返回狀態(tài)確認(rèn)報告:0:不需要1:需要2:產(chǎn)生SMC話單 (該類型短信僅供網(wǎng)關(guān)計費使用,不發(fā)送給目的終端)
Msg_level: Byte; //信息級別
Service_Id: array[0..9] of Char; //業(yè)務(wù)類型,是數(shù)字、字母和符號的組合。
Fee_UserType: Byte; //計費用戶類型字段0:對目的終端MSISDN計費;1:對源終端MSISDN計費;2:對SP計費;3:表示本字段無效,對誰計費參見Fee_terminal_Id字段。
Fee_terminal_Id: array[0..20] of Char; //被計費用戶的號碼(如本字節(jié)填空,則表示本字段無效,對誰計費參見Fee_Userstruct字段,本字段與Fee_Userstruct字段互斥)
TP_pId: Byte; //GSM協(xié)議類型。詳細(xì)是解釋請參考GSM03.40中的9.2.3.9
TP_udhi: Byte; //GSM協(xié)議類型。詳細(xì)是解釋請參考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; //信息內(nèi)容來源(SP_Id)
FeeType: array[0..1] of Char; //資費類別01:對"計費用戶號碼"免費
FeeCode: array[0..5] of Char; //資費代碼(以分為單位)
ValId_Time: array[0..16] of Char; //存活有效期,格式遵循SMPP3.3協(xié)議
At_Time: array[0..16] of Char; //定時發(fā)送時間,格式遵循SMPP3.3協(xié)議
Src_Id: array[0..20] of Char; //源號碼SP的服務(wù)代碼或前綴為服務(wù)代碼的長號碼, 網(wǎng)關(guān)將該號碼完整的填到SMPP協(xié)議Submit_SM消息相應(yīng)的source_addr字段,該號碼最終在用戶手機上顯示為短消息的主叫號碼
DestUsr_tl: Byte; //接收信息的用戶數(shù)量(小于100個用戶)
Dest_terminal_Id: array[0..20] of Char; //接收短信的MSISDN號碼
Msg_Length: Byte; //信息長度(Msg_Fmt值為0時:<160個字節(jié);其它<=140個字節(jié))
Msg_Content: array[0..MSG_LENGTH - 1] of Char; //信息內(nèi)容
Reserve: array[0..7] of Char; //保留
end;
//短信群發(fā) 注:在群發(fā)中,由于 手機號是可變長的,所以在程序中定義,長度為21*手機個數(shù)
PCMPP_SUBMIT_QF_tag1 = ^TCMPP_SUBMIT_QF_tag1;
TCMPP_SUBMIT_QF_tag1 = packed record
Msg_Id: Int64; //信息標(biāo)識,由SP側(cè)短信網(wǎng)關(guān)本身產(chǎn)生,本處填空。
Pk_total: Byte; //相同Msg_Id的信息總條數(shù),從1開始
Pk_number: Byte; //相同Msg_Id的信息序號,從1開始
Registered_Delivery: Byte; //是否要求返回狀態(tài)確認(rèn)報告:0:不需要1:需要2:產(chǎn)生SMC話單 (該類型短信僅供網(wǎng)關(guān)計費使用,不發(fā)送給目的終端)
Msg_level: Byte; //信息級別
Service_Id: array[0..9] of Char; //業(yè)務(wù)類型,是數(shù)字、字母和符號的組合。
Fee_UserType: Byte; //計費用戶類型字段0:對目的終端MSISDN計費;1:對源終端MSISDN計費;2:對SP計費;3:表示本字段無效,對誰計費參見Fee_terminal_Id字段。
Fee_terminal_Id: array[0..20] of Char; //被計費用戶的號碼(如本字節(jié)填空,則表示本字段無效,對誰計費參見Fee_Userstruct字段,本字段與Fee_Userstruct字段互斥)
TP_pId: Byte; //GSM協(xié)議類型。詳細(xì)是解釋請參考GSM03.40中的9.2.3.9
TP_udhi: Byte; //GSM協(xié)議類型。詳細(xì)是解釋請參考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; //信息內(nèi)容來源(SP_Id)
FeeType: array[0..1] of Char; //資費類別01:對"計費用戶號碼"免費
FeeCode: array[0..5] of Char; //資費代碼(以分為單位)
ValId_Time: array[0..16] of Char; //存活有效期,格式遵循SMPP3.3協(xié)議
At_Time: array[0..16] of Char; //定時發(fā)送時間,格式遵循SMPP3.3協(xié)議
Src_Id: array[0..20] of Char; //源號碼SP的服務(wù)代碼或前綴為服務(wù)代碼的長號碼, 網(wǎng)關(guān)將該號碼完整的填到SMPP協(xié)議Submit_SM消息相應(yīng)的source_addr字段,該號碼最終在用戶手機上顯示為短消息的主叫號碼
DestUsr_tl: Byte; //接收信息的用戶數(shù)量(小于100個用戶)
end;
PCMPP_SUBMIT_QF_tag2 = ^TCMPP_SUBMIT_QF_tag2;
TCMPP_SUBMIT_QF_tag2 = packed record
Msg_Length: Byte; //信息長度(Msg_Fmt值為0時:<160個字節(jié);其它<=140個字節(jié))
Msg_Content: array[0..MSG_LENGTH - 1] of Char; //信息內(nèi)容
Reserve: array[0..7] of Char; //保留
end;
pCMPP_SUBMIT_RESP_tag = ^tCMPP_SUBMIT_RESP_tag;
tCMPP_SUBMIT_RESP_tag = packed record
Msg_Id: Int64; //信息標(biāo)識
Result: Byte; //結(jié)果
end;
////////////////////////////////////////////////////////////////////////////
// SP 向 ISMG 查詢發(fā)送短信狀態(tài)
PCMPP_QUERY_tag = ^TCMPP_QUERY_tag;
TCMPP_QUERY_tag = packed record
Time: array[0..7] of Char; //時間YYYYMMDD(精確至日)
Query_Type: Byte; //查詢類別0:總數(shù)查詢1:按業(yè)務(wù)類型查詢
Query_Code: array[0..9] of Char; //查詢碼當(dāng)Query_struct為0時,此項無效;當(dāng)Query_struct為1時,此項填寫業(yè)務(wù)類型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:總數(shù)查詢1:按業(yè)務(wù)類型查詢
Query_Code: array[0..9] of Char; //查詢碼
MT_TLMsg: LongWord; //從SP接收信息總數(shù)
MT_Tlusr: LongWord; //從SP接收用戶總數(shù)
MT_Scs: LongWord; //成功轉(zhuǎn)發(fā)數(shù)量
MT_WT: LongWord; //待轉(zhuǎn)發(fā)數(shù)量
MT_FL: LongWord; //轉(zhuǎn)發(fā)失敗數(shù)量
MO_Scs: LongWord; //向SP成功送達數(shù)量
MO_WT: LongWord; //向SP待送達數(shù)量
MO_FL: LongWord; //向SP送達失敗數(shù)量
end;
////////////////////////////////////////////////////////////////////////////
// ISMG 向 SP 送交短信
// 由于在CMPP中,DELIVER和REPORT同一個命令號,所以讀包體中也分兩步,即先讀前
// 部份,再從Msg_Length和Registered_Delivery中判斷剩余長度和內(nèi)容
PCMPP_DELIVER_HEAD_tag = ^TCMPP_DELIVER_HEAD_tag;
TCMPP_DELIVER_HEAD_tag = packed record
Msg_Id: Int64; //信息標(biāo)識
Dest_Id: array[0..20] of Char; //目的號碼
Service_Id: array[0..9] of Char; //業(yè)務(wù)類型,是數(shù)字、字母和符號的組合。
TP_pid: Byte; //GSM協(xié)議類型。詳細(xì)解釋請參考GSM03.40中的9.2.3.9
TP_udhi: Byte; //GSM協(xié)議類型。詳細(xì)解釋請參考GSM03.40中的9.2.3.23,僅使用1位,右對齊
Msg_Fmt: Byte; //信息格式
Src_terminal_Id: array[0..20] of Char; //源終端MSISDN號碼
Registered_Delivery: Byte; //是否為狀態(tài)報告0:非狀態(tài)報告1:狀態(tài)報告
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; //消息內(nèi)容
Reserved: array[0..7] of Char; //保留項
end;
// ISMG 向 SP 送交狀態(tài)報告
PCMPP_Report_tag = ^TCMPP_Report_tag;
TCMPP_Report_tag = packed record
// ISMG 向 SP 送交狀態(tài)報告時,信息內(nèi)容字段(Msg_Content)格式定義
Msg_ID: Int64; //信息標(biāo)識
Stat: array[0..6] of Char; //短信應(yīng)答結(jié)果,詳見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; //信息標(biāo)識
Result: Byte; //結(jié)果
end;
////////////////////////////////////////////////////////////////////////////
// SP 向 ISMG 發(fā)起刪除短信操作
PCMPP_CANCEL_tag = ^TCMPP_CANCEL_tag;
TCMPP_CANCEL_tag = packed record
Msg_Id: Int64; //信息標(biāo)識
end;
PCMPP_CANCEL_RESP_tag = ^TCMPP_CANCEL_RESP_tag;
TCMPP_CANCEL_RESP_tag = packed record
Success_Id: Byte; //結(jié)果
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; //結(jié)果
end;
implementation
end.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -