⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmppsocket.pas

📁 纯Delphi写的CMPP短信协议控件纯Delphi写的CMPP短信协议控件
💻 PAS
📖 第 1 页 / 共 3 页
字号:
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 + -