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

📄 main.pas

📁 东软CMPP Delphi版简单实现 很简单的一个程序 测试成功
💻 PAS
📖 第 1 页 / 共 2 页
字号:
function TfrmMain.CmppSubmit( CmppSocket: TCustomWinSocket ): boolean;
var
    cSubmit1: TSubmit1;
    cSubmit2: TSubmit2;
    cSubmit3: TSubmit3;
    MemStream: TMemoryStream;
    int1, int2, StreamLength: integer;
    buffer1: array of char;
begin
    Result := False;
    FillChar( cSubmit1, sizeof( TSubmit1 ), 0 );
    FillChar( cSubmit2, sizeof( TSubmit2 ), 0 );
    FillChar( cSubmit3, sizeof( TSubmit3 ), 0 );
    MemStream := TMemoryStream.Create;
    try
        try
            strpcopy( cSubmit1.SP_ID, eSpid.Text );
            int1 := length( trim( eSpid.Text ) );
            strpcopy( cSubmit1.ServiceType, CMPP_SERVICE_TYPE );
            int2 := length( CMPP_SERVICE_TYPE );
            MemStream.WriteBuffer( cSubmit1.SP_ID, int1 + 1 );
            MemStream.WriteBuffer( cSubmit1.ServiceType, int2 + 1 );

            with cSubmit2 do
            begin
                FeeType := 1; //byte; //资费类型
                FeeCode := htonl( 10 ); //        LongWord; //资费代码,单位为分,cmpp2.0里面应该定义为,array[0..5] of char;
                ProtocolID := 1; //byte; //DEMO例子里面设为1,TP_pid???Protocol ID协议标识 ,东软协议里面说的不详细
                MessageMode := 1; //byte; //DEMO例子里面设为1,???消息模式
                Priority := 5; //byte; //优先级别,0--9,默认填0,9最高级别
                //Vallid_Time:=    byte; //array[0..16] of char; //信息存活有效期   17 or 1
                //ScheduleTime:   byte; //array[0..16] of char; //消息定时发送时间 17 or 1
                FeeUserType := 3; //byte; //计费用户类型,
            end;
            MemStream.WriteBuffer( cSubmit2, SizeOf( TSubmit2 ) );

            with cSubmit3 do
            begin
                StrPCopy( FeeUser, eTel.Text ); // :array[0..20] of char; //计费用户,如果计费类型为3,则本参数必须填写  Var.Max 21
                MemStream.WriteBuffer( FeeUser, 21 );
                StrPCopy( SourceAddress, eTel.Text ); //  :  array[0..20] of char; //源终端号码.    Var.Max 21
                MemStream.WriteBuffer( SourceAddress, 21 );
                UserCount := 1; //      byte; //接收用户数量,1-255(Cmpp里面定义小于100)
                MemStream.WriteBuffer( UserCount, 1 );
                StrPCopy( UserNumber, eTel.Text ); //:     array[0..20] of char; //:TelCount;接收信息的用户号码;  //长度为UserCount
                MemStream.WriteBuffer( UserNumber, 20 );

                //UserNumberQF:   array[0..5334] of char; //根据UserCount 来定  Var.Max 21  Var.Max 5334

                Data_Msg_Fmt := 15; //   byte; //数据编码,信息格式
                MemStream.WriteBuffer( Data_Msg_Fmt, 1 );
                Message_Length := 13; // 短消息内容长度
                MemStream.WriteBuffer( Message_Length, 1 );
                StrPCopy( Msg_Content, 'test message' ); //:    array[0..160] of char; //长度为  MessageLength; Var.Max 161
                MemStream.WriteBuffer( Msg_Content, Message_Length );
            end;
            StreamLength := Memstream.Size;
            SetLength( buffer1, StreamLength );
            MemStream.Seek( 0, soFromBeginning );
            //SizeOf( @buffer1[0] );
            MemStream.ReadBuffer( buffer1[0], StreamLength );

            if CmppSocket.SendBuf( buffer1[0], StreamLength ) <> StreamLength then
                memo1.Lines.Add( 'submit提交失败' )
            else
                memo1.Lines.Add( 'submit提交成功,等待响应信息' );
        except
            on e: exception do
            begin
                memo1.Lines.Add( 'submit提交异常:' + e.Message );
            end;
        end;
    finally
        buffer1 := nil;
        MemStream.Free;
    end; //try-finally
end;

function TfrmMain.CmppLSH: integer;
begin
    Result := Sequence_Number;
    inc( Sequence_Number );
end;

procedure TfrmMain.Cmpp_ClientRead( Sender: TObject;
    Socket: TCustomWinSocket );
var
    CMPPHead: TCMPPHead;
    CSubmit_Resp: TSubmit_Resp;
    Login_Resp: TLogin_Resp;
    buffer1: array[0..2048] of char;
    //tempCommand: longword;
    str1: string;
    deliver_file: TFileStream;
    timestr: string;
    Read_File: TFileStream;
begin
    DateTimeToString( timestr, 'yyyymmddhhss', now );
    try
        if Socket.ReceiveBuf( CMPPHead, SizeOf( TCMPPHead ) ) <> SizeOf( TCMPPHead ) then
        begin
            memo1.Lines.Add( '收到错误包' );
            exit;
        end;
        CMPPHead.MessageLength := ntohl( CMPPHead.MessageLength );
        CMPPHead.CommandId := ntohl( CMPPHead.CommandId );
        CMPPHead.CommandStauts := ntohl( CMPPHead.CommandStauts );
        CMPPHead.SequenceNumber := ntohl( CMPPHead.SequenceNumber );
        memo1.Lines.Add( '收到数据包,内容:。。。。。。。。。。。。。。。。。。。' );
        memo1.Lines.Add( 'CMPPHead.MessageLength:  ' + inttostr( CMPPHead.MessageLength ) );
        memo1.Lines.Add( 'CMPPHead.CommandId:  ' + inttostr( CMPPHead.CommandId ) );
        memo1.Lines.Add( 'CMPPHead.CommandStauts:  ' + inttostr( CMPPHead.CommandStauts ) );
        memo1.Lines.Add( 'CMPPHead.SequenceNumber:  ' + inttostr( CMPPHead.SequenceNumber ) );
        case CMPPHead.CommandId of
            CMPPE_LOGIN_RESP:
                begin
                    FillChar( Login_Resp, SizeOf( TLogin_Resp ), 0 );
                    if socket.ReceiveBuf( Login_Resp, SizeOf( TLogin_Resp ) ) <> SizeOf( TLogin_Resp ) then
                        memo1.Lines.Add( '收包体错:Login_Resp' )
                    else
                    begin
                        str1 := Login_Resp.Ismg_Auth;
                        Memo1.Lines.Add( '收到CMPPE_LOGIN_RESP响应包-------------------------' );
                        Memo1.Lines.Add( 'IF_Ver:' + IntToStr( Login_Resp.IF_Ver ) );
                        Memo1.Lines.Add( 'Ismg_Auth:' + str1 );
                        if length( str1 ) = 16 then
                        begin
                            Memo1.Lines.Add( 'login成功........' );
                            frmMain.Caption := FRMMAIN_CAPTION + 'login成功........';
                        end
                        else if ( length( str1 ) < 16 ) then
                        begin
                            Memo1.Lines.Add( 'login不成功........' );
                            frmMain.Caption := FRMMAIN_CAPTION + 'login不成功';
                        end;
                    end;

                end;
            CMPPE_LOGOUT_RESP:
                begin
                    Memo1.Lines.Add( 'Logout成功........' );
                    frmMain.Caption := FRMMAIN_CAPTION + 'logout成功';
                end;
            CMPPE_SUBMIT_RESP:
                begin
                    FillChar( CSubmit_Resp, SizeOf( TSubmit_Resp ), 0 );
                    if socket.ReceiveBuf( CSubmit_Resp, CMPPHead.MessageLength - 16 ) <> ( CMPPHead.MessageLength - 16 ) then
                    begin
                        memo1.Lines.Add( '收包体错CSubmit_Resp' );
                        exit;
                    end;
                    if CMPPHead.CommandStauts = CMPPE_RSP_SUCCESS then
                    begin
                        memo1.Lines.Add( '发送到手机号成功,收到的返回值是' );
                        memo1.Lines.Add( '内容标识码是:' + CSubmit_Resp.MessageID );
                    end
                    else
                    begin
                        memo1.Lines.Add( '发送到手机号失败,错误号是' + inttostr( CMPPHead.CommandStauts ) );
                        memo1.Lines.Add( '内容标识码是:' + CSubmit_Resp.MessageID );
                    end;
                end;
            CMPPE_DELIVER:
                begin
                    FillChar( buffer1, 2048, 0 );
                    DateTimeToString( str1, 'yyyymmddhhss', now );
                    deliver_file := TFileStream.Create( '.\Deliver' + str1 + '.del', fmCreate );
                    try
                        socket.ReceiveBuf( buffer1, CMPPHead.MessageLength - 16 );
                        deliver_file.WriteBuffer( buffer1, CMPPHead.MessageLength - 16 );
                        memo1.Lines.Add( '收到短信息,已装信息存入' + '.\Deliver' + str1 + '.del' + '文件中' );
                        with CMPPHead do
                        begin
                            MessageLength := htonl( 16 ); //longword; //消息的总长度(字节)
                            CommandId := htonl( CMPPE_DELIVER_RESP ); //longword; //命令ID
                            CommandStauts := htonl( 0 ); //longword; //命令状态,仅在应答请求包里有效
                            SequenceNumber := htonl( SequenceNumber ); //longword; //序列号,循环使用,步长为1,范围1-0x7fffffff
                        end;
                        socket.SendBuf( CMPPHead, 16 );
                    finally
                        deliver_file.Free;
                    end; //try-finally
                end;
            CMPPE_ACTIVE_RESP:
                begin
                    memo1.Lines.Add( '收到测试包响应信息' );
                end;
            CMPPE_ACTIVE:
                begin
                    memo1.Lines.Add( '收到测试包' );
                    with CMPPHead do
                    begin
                        MessageLength := htonl( 16 ); //longword; //消息的总长度(字节)
                        CommandId := htonl( CMPPE_ACTIVE_RESP ); //longword; //命令ID
                        CommandStauts := htonl( 0 ); //longword; //命令状态,仅在应答请求包里有效
                        SequenceNumber := htonl( SequenceNumber ); //longword; //序列号,循环使用,步长为1,范围1-0x7fffffff
                    end;
                    socket.SendBuf( CMPPHead, 16 );
                end;
        else
            begin
                memo1.Lines.Add( '收到其它包,命令:   ' + inttostr( CMPPHead.CommandId ) );
            end;
        end;
    except
        on e: exception do
        begin
            memo1.Lines.Add( '收包错误,请logout后再login:' + e.Message );
        end;
    end;
end;

procedure TfrmMain.bActiveTestClick( Sender: TObject );
begin
    CmppActive( Cmpp_Client.Socket );
end;

procedure TfrmMain.bLogoutClick( Sender: TObject );
begin
    CmppLogout( Cmpp_Client.Socket );
    CMPP_Client.Close;
end;

procedure TfrmMain.Cmpp_ClientError( Sender: TObject;
    Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
    var ErrorCode: Integer );
begin
    errorcode := 0;
end;

procedure TfrmMain.setCursorDef;
begin
    screen.Cursor := crDefault;
end;

procedure TfrmMain.SetCursorHour;
begin
    screen.Cursor := crHourGlass;
end;

procedure TfrmMain.bSubmitClick( Sender: TObject );
begin
    CmppSubmit( Cmpp_Client.Socket );
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -