📄 cmppsocket.pas
字号:
unit CMPPSocket;
interface
uses
Windows, Messages, SysUtils, Classes, WSocket,SMSPUBLIC,SGIPTYPE,
idHash,IdHashMessageDigest,WsocketS;
type
TArrayMsg=Array[0..255] of Char;
TCMPPMsgHeader=record
Total_Length:LongWord;
Command_ID:LongWord;
Sequence_ID:LongWord;
end;
PCMPPMsgHeader=^TCMPPMsgHeader;
TCMPP_Connect=record
Source_Addr:String[6];
AuthenticatorSP:T4x4LongWordRecord;
Version:Byte;
TimeStamp:longWord;
end;
PCMPP_Connect=^TCMPP_Connect;
TCMPP_Connect_REP=record
Status:Byte;
AuthenticatorISMG:T4x4LongWordRecord;
Version:Byte;
end;
PCMPP_Connect_REP=^TCMPP_Connect_REP;
TCMPP_Submit=record
Msg_id:int64;
Pk_total:Byte;
Pk_number:Byte;
Registered_Deliver:Byte;
Msg_level:Byte;
Service_id:String[10];
Fee_UserType:Byte;
Fee_terminal_id:String[21];
TP_pid:Byte;
TP_udhi:Byte;
Msg_src:String[6];
FeeType:String[2];
FeeCode:String[6];
Valid_Time:String[17];
At_Time:String[17];
Src_terminal_id:String[21];
DestUsr_tl:Byte;
Dest_terminal_id:String;
Msg_Length:Byte;
case Msg_Fmt:Byte of
0,15:(Msg_Content_Str:String[170]);
3,4,8:(Msg_Content_array:TArrayMsg);
end;
PCMPP_Submit=^TCMPP_Submit;
TCMPP_Submit_Rep=Record
Msg_Id:int64;
Result:Byte;
end;
PCMPP_Submit_Rep=^TCMPP_Submit_Rep;
TCMPP_Query=Record
Time:String[8];
Query_Type:Byte;
Query_Code:String[10];
end;
PCMPP_Query=^TCMPP_Query;
TCMPP_Query_Rep=record
Time:String[8];
Query_Type:Byte;
Query_Code:String[10];
MT_TLMsg:LongWord;
MT_Tlusr:LongWord;
MT_Scs:LongWord;
MT_WT:LongWord;
MT_FL:LongWord;
MO_Scs:LongWord;
MO_WT:LongWord;
MO_FL:LongWord;
end;
PCMPP_Query_Rep=^TCMPP_Query_Rep;
TCMPP_Report=record
Msg_id:int64;
Stat:String[7];
Submit_Time:String[10];
Done_Time:String[10];
Dest_terminal_id:String[21];
SMSC_Sequence:LongWord;
end;
PCMPP_Report=^TCMPP_Report;
TCMPP_Deliver=record
Msg_Id:LongWord;
Destnation_id:String[21];
Service_id:String[10];
TP_pid:Byte;
TP_udhi:Byte;
Msg_Fmt:Byte;
Src_terminal_id:String[21];
Msg_Length:Byte;
Case Registered_Deliver:Byte of
0:(Msg_Content:TChararray);
1:(Msg_Report:TCMPP_Report);
end;
PCMPP_Deliver=^TCMPP_Deliver;
TCMPP_Deliver_Rep=record
Msg_id:Int64;
Result:Byte;
end;
PCMPP_Deliver_Rep=^TCMPP_Deliver_Rep;
TOnCMPP_Connect=procedure(Sender:Tobject;Msg:TCMPP_Connect) of object;
TOnCMPP_Connect_Rep=procedure(Sender:Tobject;Msg:TCMPP_Connect_REP) of object;
TOnCMPP_Deliver=procedure(Sender:Tobject;Msg:TCMPP_Deliver) of object;
TOnCMPP_Deliver_REP=procedure(Sender:Tobject;Msg:TCMPP_Deliver_Rep) of object;
TOnCMPP_Query=procedure(Sender:Tobject;Msg:TCMPP_Query) of object;
TOnCMPP_Query_Rep=procedure(Sender:Tobject;Msg:TCMPP_QUERY_REP) of object;
TOnCMPP_Submit=procedure(Sender:Tobject;Msg:TCMPP_submit) of object;
TOnCMPP_Submit_Rep=procedure(Sender:Tobject;Msg:TCMPP_sUBMIT_REP) of object;
TOnCMPP_Terminate=procedure(Sender:Tobject) of object;
TOnCMPP_Terminate_REP =procedure(Sender:Tobject) of object;
TCMPPSocket = class(TWSocket)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
FSMCID:String;
procedure CMPP_Connect(SPID:String;Passwd:String;Version:Byte);
procedure CMPP_Connect_Rep(Status:Byte;AuthenticatorSP:T4x4LongWordRecord;
Passwd:String;Version:Byte);
procedure CMPP_Deliver(Destnation_id:String;Service_id:String;Msg_Fmt:Byte;
Src_terminal_id:String;isRD:Byte;Msg_Length:Byte;
Msg_Content:TCharArray;var RMsg_id:int64;var Stat:String;
var Submit_Time,Done_Time:String;
var Dest_Terminal_id:String;var SMSC_sequence:longword);
procedure CMPP_Deliver_REP(Msg_id:int64;Error:Byte);
procedure CMPP_Query(aTime:String;Query_Type:Byte;var Query_Code:String);
procedure CMPP_Query_Rep(aTime:String;Query_Type:Byte;Query_Code:String;
MT_TLMsg,MT_Tlusr,MT_Scs,MT_WT,MT_FL,MO_Scs,MO_WT,
MO_FL:Longword);
procedure CMPP_Submit(RD:Byte;Msg_Level:Byte;Service_id:String;
Fee_UserType:byte;Fee_Terminal_id:String;
Msg_Fmt:Byte;Msg_src:String;FeeType:String;
FeeCode:String;Valid_Time,At_Time:String;
Src_Terminal_id:String;Dest_terminal_id:TStrings;
Msg_length:Byte;Msg_Content_Str:String;
Msg_Content_Array:TcharArray);
procedure CMPP_Submit_Rep(Msg_id:int64;Error:byte);
procedure CMPP_Terminate;
procedure CMPP_Terminate_REP;
function GetMessage(var Msg_Header:TCMPPMsgHeader;var Msg_Body:Pointer):Byte;
published
{ Published declarations }
end;
TCMPPSocketClient = class(TWSocketClient)
private
{ Private declarations }
protected
{ Protected declarations }
FSMCID:String;
public
{ Public declarations }
procedure CMPP_Connect(SPID:String;Passwd:String;Version:Byte);
procedure CMPP_Connect_Rep(Status:Byte;AuthenticatorSP:T4x4LongWordRecord;
Passwd:String;Version:Byte);
procedure CMPP_Deliver(Destnation_id:String;Service_id:String;Msg_Fmt:Byte;
Src_terminal_id:String;isRD:Byte;Msg_Length:Byte;
Msg_Content:TCharArray;var RMsg_id:int64;var Stat:String;
var Submit_Time,Done_Time:String;
var Dest_Terminal_id:String;var SMSC_sequence:longword);
procedure CMPP_Deliver_REP(Msg_id:int64;Error:Byte);
procedure CMPP_Query(aTime:String;Query_Type:Byte;var Query_Code:String);
procedure CMPP_Query_Rep(aTime:String;Query_Type:Byte;Query_Code:String;
MT_TLMsg,MT_Tlusr,MT_Scs,MT_WT,MT_FL,MO_Scs,MO_WT,
MO_FL:Longword);
procedure CMPP_Submit(RD:Byte;Msg_Level:Byte;Service_id:String;
Fee_UserType:byte;Fee_Terminal_id:String;
Msg_Fmt:Byte;Msg_src:String;FeeType:String;
FeeCode:String;Valid_Time,At_Time:String;
Src_Terminal_id:String;Dest_terminal_id:TStrings;
Msg_length:Byte;Msg_Content_Str:String;
Msg_Content_Array:TcharArray);
procedure CMPP_Submit_Rep(Msg_id:int64;Error:byte);
procedure CMPP_Terminate;
procedure CMPP_Terminate_REP;
function GetMessage(var Msg_Header:TCMPPMsgHeader;var Msg_Body:Pointer):Byte;
published
{ Published declarations }
end;
procedure Register;
function GetSeqId:Longword;
function GetCMPP_MSG_id(SMCId:String):int64;
function ReadMsgHeader(Stream:TMemoryStream):TCMPPMsgHeader;
function Read_Connect(Stream:TMemoryStream):TCMPP_Connect;
function Read_Connect_Rep(Stream:TMemoryStream):TCMPP_Connect_REP;
function Read_Deliver(Stream:TMemoryStream):TCMPP_Deliver;
function Read_Deliver_REP(Stream:TMemoryStream):TCMPP_Deliver_Rep;
function Read_Query(Stream:TMemoryStream):TCMPP_Query;
function Read_Query_Rep(Stream:TMemoryStream):TCMPP_QUERY_REP;
FUNCTION Read_Submit(Stream:TMemoryStream):TCMPP_submit;
function Read_Submit_Rep(Stream:TMemoryStream):TCMPP_sUBMIT_REP;
procedure WriteMsgHeader(Stream:TMemoryStream;Header:TCMPPMsgHeader);
procedure Write_Connect(Stream:TMemoryStream;Msg:TCMPP_Connect);
procedure Write_Connect_Rep(Stream:TMemoryStream;Msg:TCMPP_Connect_REP);
procedure Write_Deliver(Stream:TMemoryStream;Msg:TCMPP_Deliver);
procedure Write_Deliver_REP(Stream:TMemoryStream;Msg:TCMPP_Deliver_Rep);
procedure Write_Query(Stream:TMemoryStream;Msg:TCMPP_Query);
procedure Write_Query_Rep(Stream:TMemoryStream;Msg:TCMPP_QUERY_REP);
procedure Write_Submit(Stream:TMemoryStream;Msg:TCMPP_submit);
procedure Write_Submit_Rep(Stream:TMemoryStream;Msg:TCMPP_sUBMIT_REP);
var
Seq_ID:LongWord;
Message_Index:int64;
const
CMP_Connect :longword = $00000001;
CMP_Connect_REP :longword = $80000001;
CMP_Terminate :longword = $00000002;
CMP_Terminate_REP :longword = $80000002;
CMP_Submit :longword = $00000004;
CMP_Submit_REP :longword = $80000004;
CMP_Deliver :longword = $00000005;
CMP_Deliver_REP :longword = $80000005;
CMP_Query :longword = $00000006;
CMP_Query_REP :longword = $80000006;
CMP_Cancel :longword = $00000007;
CMP_Cancel_REP :longword = $80000007;
implementation
function GetSeqId:Longword;
begin
Result:=Seq_id;
if Seq_id<=4294967294 then Seq_id:=Seq_id+1 else Seq_id:=0;
end;
function GetCMPP_MSG_id(SMCId:String):int64;
var
atime:int64;
asmc:int64;
aSerial:int64;
begin
aTime:=Strtoint(formatDateTime('mmddhhnn',now));
aTime:=aTime shl 44;
asmc:=Strtoint(SMCID);
asmc:=asmc shl 17;
aSerial:=Message_Index;
if Message_Index>=131071 then Message_Index:=0 else Message_Index:=Message_Index+1;
Result:=aTime or asmc or aSerial;
end;
procedure Register;
begin
RegisterComponents('LK-SOFT', [TCMPPSocket]);
end;
{ TCMPPSocket }
function Read_Connect(Stream:TMemoryStream): TCMPP_Connect;
begin
Stream.ReadBuffer(Result.Source_Addr[1],6);
Result.Source_Addr[0]:=#6;
Stream.SaveToFile('c:\test.bin');
Stream.ReadBuffer(Result.AuthenticatorSP,16);
Result.AuthenticatorSP[0]:=intSwap(Result.AuthenticatorSP[0]);
Result.AuthenticatorSP[1]:=intSwap(Result.AuthenticatorSP[1]);
Result.AuthenticatorSP[2]:=intSwap(Result.AuthenticatorSP[2]);
Result.AuthenticatorSP[3]:=intSwap(Result.AuthenticatorSP[3]);
Stream.ReadBuffer(result.Version,1);
Stream.ReadBuffer(Result.Timestamp,4);
Result.TimeStamp:=intswap(Result.TimeStamp);
end;
function Read_Connect_Rep(Stream:TMemoryStream): TCMPP_Connect_REP;
begin
Stream.ReadBuffer(Result.Status,1);
Stream.ReadBuffer(Result.AuthenticatorISMG,16);
Result.AuthenticatorISMG[0]:=intSwap(Result.AuthenticatorISMG[0]);
Result.AuthenticatorISMG[1]:=intSwap(Result.AuthenticatorISMG[1]);
Result.AuthenticatorISMG[2]:=intSwap(Result.AuthenticatorISMG[2]);
Result.AuthenticatorISMG[3]:=intSwap(Result.AuthenticatorISMG[3]);
Stream.ReadBuffer(Result.Version,1);
end;
function Read_Deliver(Stream:TMemoryStream): TCMPP_Deliver;
var
aChars:array[0..255] of char;
begin
Stream.ReadBuffer(result.Msg_Id,8);
Result.Msg_Id:=int64Swap(Result.Msg_Id);
Stream.ReadBuffer(Result.Destnation_id[1],21);
Result.Destnation_id[0]:=#21;
Stream.ReadBuffer(Result.Service_id[1],10);
Result.Service_id[0]:=#10;
Stream.ReadBuffer(Result.TP_pid,1);
Stream.ReadBuffer(Result.TP_udhi,1);
Stream.ReadBuffer(Result.Msg_Fmt,1);
Stream.ReadBuffer(Result.Src_terminal_id[1],21);
Result.Src_terminal_id[0]:=#21;
Stream.ReadBuffer(Result.Registered_Deliver,1);
Stream.ReadBuffer(Result.Msg_Length,1);
if Result.Registered_Deliver=0 then
begin
Stream.ReadBuffer(Result.Msg_Content,Result.Msg_Length);
end else
begin
Stream.ReadBuffer(Result.Msg_Report.Msg_id,8);
Result.Msg_Report.Msg_id:=int64swap(Result.Msg_Report.Msg_id);
Stream.ReadBuffer(Result.Msg_Report.Stat[1],7);
Result.Msg_Report.Stat[0]:=#7;
Stream.ReadBuffer(Result.Msg_Report.Submit_Time[1],10);
Result.Msg_Report.Submit_Time[0]:=#10;
Stream.ReadBuffer(Result.Msg_Report.Done_Time[1],10);
Result.Msg_Report.Done_Time[0]:=#10;
Stream.ReadBuffer(Result.Msg_Report.Dest_terminal_id[1],21);
Result.Destnation_id[0]:=#21;
Stream.ReadBuffer(Result.Msg_Report.SMSC_Sequence,4);
Result.Msg_Report.SMSC_Sequence:=intswap(Result.Msg_Report.SMSC_Sequence);
end;
Stream.ReadBuffer(aChars,8);
end;
function Read_Deliver_REP(Stream:TMemoryStream): TCMPP_Deliver_Rep;
begin
Stream.ReadBuffer(Result.Msg_id,8);
Result.Msg_id:=int64swap(Result.Msg_id);
Stream.ReadBuffer(Result.Result,1);
end;
function Read_Query(Stream:TMemoryStream): TCMPP_Query;
var
aChars:Array[0..7] of char;
begin
Stream.ReadBuffer(Result.Time[1],8);
Result.Time[0]:=#8;
Stream.ReadBuffer(Result.Query_Type,1);
Stream.ReadBuffer(Result.Query_Code,10);
Stream.ReadBuffer(aChars,8);
end;
function Read_Query_Rep(Stream:TMemoryStream): TCMPP_QUERY_REP;
begin
Stream.ReadBuffer(Result.Time[1],8);
Result.Time[0]:=#8;
Stream.ReadBuffer(Result.Query_Type,1);
Stream.ReadBuffer(Result.Query_Code[1],10);
Stream.ReadBuffer(Result.MT_TLMsg,4);
Stream.ReadBuffer(Result.MT_Tlusr,4);
Stream.ReadBuffer(Result.MT_Scs,4);
Stream.ReadBuffer(Result.MT_WT,4);
Stream.ReadBuffer(Result.MT_FL,4);
Stream.ReadBuffer(Result.MO_Scs,4);
Stream.ReadBuffer(Result.MO_WT,4);
Stream.ReadBuffer(Result.MO_FL,4);
Result.MT_TLMsg:=intswap(Result.MT_TLMsg);
Result.MT_Tlusr:=intswap(Result.MT_Tlusr);
Result.MT_Scs:=intswap(Result.MT_Scs);
Result.MT_WT:=intswap(Result.MT_WT);
Result.MT_FL:=intswap(Result.MT_FL);
Result.MO_Scs:=intswap(Result.MO_Scs);
Result.MO_WT:=intswap(Result.MO_WT);
Result.MO_FL:=intswap(Result.MO_FL);
end;
function Read_Submit(Stream:TMemoryStream): TCMPP_submit;
var
aChars:Array[0..170] of char;
i:Byte;
begin
Stream.ReadBuffer(Result.Msg_id,8);
Result.Msg_id:=int64swap(Result.Msg_id);
Stream.ReadBuffer(Result.Pk_total,1);
Stream.ReadBuffer(Result.Pk_number,1);
Stream.ReadBuffer(Result.Registered_Deliver,1);
Stream.ReadBuffer(Result.Msg_level,1);
Stream.ReadBuffer(Result.Service_id[1],10);
Result.Service_id[0]:=#10;
Stream.ReadBuffer(Result.Fee_UserType,1);
Stream.ReadBuffer(Result.Fee_terminal_id[1],21);
Result.Fee_terminal_id[0]:=#21;
Stream.ReadBuffer(Result.TP_pid,1);
Stream.ReadBuffer(Result.TP_udhi,1);
Stream.ReadBuffer(Result.Msg_Fmt,1);
Stream.ReadBuffer(Result.Msg_src[1],6);
Result.Msg_src[0]:=#6;
Stream.ReadBuffer(Result.FeeType[1],2);
Result.FeeType[0]:=#2;
Stream.ReadBuffer(Result.FeeCode[1],6);
Result.FeeCode[0]:=#6;
Stream.ReadBuffer(Result.Valid_Time[1],17);
Result.Valid_Time[0]:=#17;
Stream.ReadBuffer(Result.At_Time[1],17);
Result.At_Time[0]:=#17;
Stream.ReadBuffer(Result.Src_terminal_id[1],21);
Result.Src_terminal_id[0]:=#21;
Stream.ReadBuffer(Result.DestUsr_tl,1);
for i:=1 to Result.DestUsr_tl do
begin
Stream.ReadBuffer(aChars,21);
aChars[21]:=#0;
Result.Dest_terminal_id:=Result.Dest_terminal_id+String(aChars)+#13#10;
end;
Stream.ReadBuffer(Result.Msg_Length,1);
if Result.Msg_Fmt in [0,15] then
begin
Stream.ReadBuffer(aChars,Result.Msg_Length);
aChars[Result.Msg_Length]:=#0;
Result.Msg_Content_Str:=String(aChars);
end else
begin
Stream.ReadBuffer(Result.Msg_Content_array,Result.Msg_Length);
end;
Stream.ReadBuffer(aChars,8);
end;
function Read_Submit_Rep(Stream:TMemoryStream): TCMPP_sUBMIT_REP;
begin
Stream.ReadBuffer(Result.Msg_Id,8);
Result.Msg_id:=int64swap(Result.Msg_id);
Stream.ReadBuffer(Result.Result,1);
end;
function ReadMsgHeader(Stream:TMemoryStream): TCMPPMsgHeader;
begin
Stream.ReadBuffer(Result.Total_Length,4);
Stream.ReadBuffer(Result.Command_ID,4);
Stream.ReadBuffer(Result.Sequence_ID,4);
Result.Total_Length:=intswap(Result.Total_Length);
Result.Command_ID:=intswap(Result.Command_ID);
Result.Sequence_ID:=intswap(Result.Sequence_ID);
end;
procedure Write_Connect(Stream:TMemoryStream;Msg: TCMPP_Connect);
begin
Stream.WriteBuffer(Msg.Source_Addr[1],6);
Msg.AuthenticatorSP[0]:=intSwap(Msg.AuthenticatorSP[0]);
Msg.AuthenticatorSP[1]:=intSwap(Msg.AuthenticatorSP[1]);
Msg.AuthenticatorSP[2]:=intSwap(Msg.AuthenticatorSP[2]);
Msg.AuthenticatorSP[3]:=intSwap(Msg.AuthenticatorSP[3]);
Stream.WriteBuffer(Msg.AuthenticatorSP,16);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -