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

📄 main.pas

📁 cmpp协议的delphi解析cmpp协议的点歌系统
💻 PAS
📖 第 1 页 / 共 4 页
字号:
    SqlStr1:='insert into Dg_source_data with(rowlock)';
    SqlStr2:='insert into Dg_now_data with(rowlock)';
    SqlStr3:='insert into Dg_waiting_data with(rowlock)';

    SqlStrValue:='(play_time,src_terminal_id,dest_terminal_id'+
               ' ,song_id,bless_id,star_id,send_name,Play_order,'+
               ' Sequence_ID,handle,msg_id_high,msg_id_low,source_addr) values('+
               ''''+play_str_time+''''+
               ','+''''+src_terminal_id+''''+
               ','+''''+dest_terminal_id+''''+
               ','+''''+song_id+''''+
               ','+''''+bless_id+''''+
               ','+''''+star_id+''''+
               ','+''''+send_name+''''+
               ','+''''+play_order+''''+
               ','+inttostr(Sequence_ID)+
               ','+inttostr(ReadSock.SocketHandle)+
               ','+''''+msg_id_high+''''+
               ','+''''+msg_id_low+''''+
               ','+''''+sp_flag+''''+')';

//              ''''+',Password'+'''';
 try
   //db_main.StartTransaction ;
    with Qry_source_data do
    begin
       Close;
       SQL.Clear;
       SQL.Add(SqlStr1+SqlStrValue);
       ExecSQL;
    end;

      if (play_str_time='0000-00-00 00:00:00') or (play_str_time='') then
      begin
        with Qry_now_data do
        begin
         Close;
         SQL.Clear;
         SQL.Add(SqlStr2+SqlStrValue);

         ExecSQL;
        end;
     end
     else
     begin
        with Qry_waiting_data do
        begin
         Close;
         SQL.Clear;
         SQL.Add(SqlStr3+SqlStrValue);
         ExecSQL;
        end;
     end;
   //db_main.Commit;
   except on e:exception do
   begin
       if LogRec.s_time='' then
       begin
          logrec.s_funcname:='CmppRead_SUBMIT';
          logrec.s_oper :='CmppRead_SUBMIT数据库操作';
          logrec.s_result :='失败';
          logrec.s_errcode :='0';
          logrec.s_err :=e.Message;
          logrec.s_time :=FormatDateTime('yyyy-mm-dd hh:mm:ss',now);
          WriteLog();
       end;
      //db_main.Rollback ;
   end;
   end;

   //ISMG对SP发起的连接请求
    try
        int1 := SizeOf( TCMPP_HEAD_tag );
        int2 := SizeOf( TCMPP_SUBMIT_RESP_tag );
        int3 := int1 + int2;

        FillChar( bInit.head, int1, 0 );
        FillChar( bInit.body, int2, 0 );
        DateTimeToString( timestr, 'MMDDHHMMSS', now );
        bInit.head.Total_Length := htonl( int3 );
        bInit.head.Command_ID := htonl(CMPP_SUBMIT_RESP);
        bInit.head.Sequence_ID := Cmpp_Head.Sequence_ID ;

        StrPCopy(bInit.body.Song_Name,CMPP_SUBMIT_tag.Song_Name);
        //bInit.body.Msg_Id:=CMPP_SUBMIT_tag.Msg_Id ;
        bInit.body.Msg_Id.LowPart :=Msg_Id.HighPart  ;
        bInit.body.Msg_Id.HighPart :=Msg_Id.LowPart  ;

        bInit.body.Result:=0;

        if ReadSock.SendBuf( bInit, int3 ) <> int3 then
        begin
         memo1.Lines.Add( '发送点歌响应信息操作失败'+#13#10 );
            exit;
        end;

         memo1.Lines.Add( '发送点歌响应信息成功  '+
         '当前时间:'+datetimetostr(now)+
         'msg_id_high:'+msg_id_high+
         'msg_id_low:'+msg_id_low +
         'SP代码:'+sp_flag+
         'SOCKET句柄:'+inttostr(ReadSock.SocketHandle )+#13#10 );

    except on e: exception do
    begin
       if LogRec.s_time='' then
       begin
          logrec.s_funcname:='CmppRead_SUBMIT';
          logrec.s_oper :='CmppRead_SUBMIT数据发送';
          logrec.s_result :='失败';
          logrec.s_errcode :='0';
          logrec.s_err :=e.Message;
          logrec.s_time :=FormatDateTime('yyyy-mm-dd hh:mm:ss',now);
          WriteLog();
       end;
       memo1.Lines.Add( '发送点歌响应信息操作失败,错误信息' + e.Message +#13#10);
     end;
    end; //try-except

end;

procedure TFrmMain.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
    ReadBufSize: integer;
    CMPP_HEAD_tag: tCMPP_HEAD_tag;
begin
    try

        FillChar( CMPP_HEAD_tag, sizeof( tCMPP_HEAD_tag ), 0 );
        ReadBufSize := Socket.ReceiveBuf( CMPP_HEAD_tag, sizeof( tCMPP_HEAD_tag ) );

        if ( ReadBufSize = 0 ) or ( ReadBufSize = -1 ) or ( ReadBufSize <> SizeOf( tCMPP_HEAD_tag ) ) then
            exit;

        CMPP_HEAD_tag.Command_Id := ntohl( CMPP_HEAD_tag.Command_Id );

        if CMPP_HEAD_tag.Command_Id = CMPP_CONNECT then 
            CmppRead_CONNECT( Socket, CMPP_HEAD_tag );

//      if CMPP_HEAD_tag.Command_Id = CMPP_CONNECT_RESP then
  //        CmppRead_CONNECT_RESP( Socket, CMPP_HEAD_tag );

        if CMPP_HEAD_tag.Command_Id = CMPP_TERMINATE then //短信中心发起的断开连接操作
            CmppRead_TERMINATE( Socket, CMPP_HEAD_tag );

        if CMPP_HEAD_tag.Command_Id = CMPP_TERMINATE_RESP then
            memo1.Lines.Add('断开与短信网关的连接'+#13#10);

        if CMPP_HEAD_tag.Command_Id = CMPP_DELIVER_RESP then
            CmppRead_DELIVER_RESP( Socket, CMPP_HEAD_tag );

        if CMPP_HEAD_tag.Command_Id = CMPP_SUBMIT then
            CmppRead_SUBMIT( Socket,CMPP_HEAD_tag );

        if CMPP_HEAD_tag.Command_Id = CMPP_ACTIVE_TEST then
            CmppRead_ACTIVE_TEST( Socket, CMPP_HEAD_tag );

         if CMPP_HEAD_tag.Command_Id = CMPP_ACTIVE_TEST_RESP then
            CmppRead_ACTIVE_RESP_TEST( Socket, CMPP_HEAD_tag );

         if CMPP_HEAD_tag.Command_Id = CMPP_BROCKEN then
            CmppRead_BROCKEN( Socket, CMPP_HEAD_tag );
    except

    end;
end;

procedure TFrmMain.ServerSocket1ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
    ErrorCode := 0;
end;

procedure TFrmMain.Timer1Timer(Sender: TObject);
var
    CMPP_DELIVER_tag:TCMPP_DELIVER_tag;
    flow_id:integer;
    Sequence_Id:integer;
    Src_terminal_Id:string;
    Dest_terminal_Id:string;
    stat:string;
    Submit_time:string;
    Play_count:integer;
    timestr:string;
    handle:integer;
    msg_id_high:string;
    msg_id_low:string;
    msg_id:Tulargeinteger;
    sp_code:string;
begin
   try
      with Qry_ivr_tmp_data do
      begin
          Close;
          SQL.Clear;
          SQL.Add('delete from Dg_ivr_tmp_data  with(rowlock) where isdel=1');
          ExecSQL;
      end;
   except on e:exception do
   begin
       if LogRec.s_time='' then
       begin
          logrec.s_funcname:='Timer1Timer';
          logrec.s_oper :='Timer1Timer数据库操作';
          logrec.s_result :='失败';
          logrec.s_errcode :='0';
          logrec.s_err :=e.Message;
          logrec.s_time :=FormatDateTime('yyyy-mm-dd hh:mm:ss',now);
          WriteLog();
       end;
       memo1.Lines.Add('删除dg_ivr_tmp_data数据失败!'+#13#10);
   end;
   end;

   try
     with Qry_ivr_tmp_data do
     begin
         Close;
         SQL.Clear;
         SQL.Add('select * from Dg_ivr_tmp_data with(nolock) where isdel=0');
         Open;
     end;
   except on e:exception do
       memo1.Lines.Add('查询dg_ivr_tmp_data数据失败!'+#13#10);
   end;

   if Qry_ivr_tmp_data.IsEmpty then exit;

   Qry_ivr_tmp_data.First;
   while not Qry_ivr_tmp_data.Eof do
   begin
     flow_id:=0;
     Sequence_Id:=0;
     Src_terminal_Id:='';
     Dest_terminal_Id:='';
     stat:='';
     Play_count:=0;
     fillchar(CMPP_DELIVER_tag,sizeof(CMPP_DELIVER_tag),0);

     flow_id:=Qry_ivr_tmp_data.fieldbyname('Flow_id').AsInteger ;
     Sequence_Id:=Qry_ivr_tmp_data.fieldbyname('Sequence_Id').AsInteger;
     Src_terminal_Id:=Qry_ivr_tmp_data.fieldbyname('Src_terminal_Id').AsString;
     Dest_terminal_Id:=Qry_ivr_tmp_data.fieldbyname('Dest_terminal_Id').AsString;
     stat:=Qry_ivr_tmp_data.fieldbyname('stat').AsString;
     Play_count:=Qry_ivr_tmp_data.fieldbyname('Play_num').AsInteger;
     handle:=Qry_ivr_tmp_data.fieldbyname('handle').AsInteger;
     msg_id_high:=Qry_ivr_tmp_data.fieldbyname('msg_id_high').AsString ;
     msg_id_low:=Qry_ivr_tmp_data.fieldbyname('msg_id_low').AsString ;
     sp_code:=trim(Qry_ivr_tmp_data.fieldbyname('Source_addr').AsString) ;

     StrPCopy(CMPP_DELIVER_tag.Src_terminal_Id, trim(Src_terminal_Id ));
     StrPCopy(CMPP_DELIVER_tag.Dest_terminal_Id, trim(Dest_terminal_Id ));
     StrPCopy(CMPP_DELIVER_tag.stat, trim(stat ));
     CMPP_DELIVER_tag.Play_Count :=Play_Count;
     DateTimeToString( timestr, 'YYMMDDHHMM', now );
     StrPCopy(CMPP_DELIVER_tag.Submit_time , trim(timestr) );
//     msg_id.LowPart := strtoint64(msg_id_low);
//     msg_id.HighPart := strtoint64(msg_id_high);
     msg_id.LowPart := strtoint64(msg_id_high);
     msg_id.HighPart := strtoint64(msg_id_low);

     CMPP_DELIVER_tag.Msg_Id :=msg_id;

     //返回播放结果
     bCmpp_DELIVER( TCustomWinSocket(ServerSocket1),sp_code,Sequence_Id,CMPP_DELIVER_tag,msg_id_high,msg_id_low,flow_id);
     Qry_ivr_tmp_data.Next;
   end;
end;

procedure TFrmMain.FormCreate(Sender: TObject);
var
  AppIni: TIniFile;
  server_name:string;
  user_name:string;
  database_name:string;
  alias_name:string;
  password:string;
  i:integer;
begin
try
  //formatDateTime('yyyy-mm-dd',now);
  //SetLocaleInfo(LOCALE_SYSTEM_DEFAULT,LOCALE_SDATE,'yyyy-mm-dd');
   AppIni := TIniFile.Create('.\playsong.ini');

   server_name := AppIni.ReadString('dbset', 'server_name', '');
   user_name := AppIni.ReadString('dbset', 'user_name', '');
   database_name := AppIni.ReadString('dbset', 'database_name', '');
   password := AppIni.ReadString('dbset', 'password', '');
   //difftime := strtoint(AppIni.ReadString('system', 'difftime', ''));
   difftime := AppIni.ReadInteger('system', 'difftime', 40);
   del_now_time := AppIni.ReadInteger('system', 'del_now_time', 3);
   msg_gateway:=AppIni.ReadString('system', 'gateway_code', '');
   AppIni.Free;
except on e:exception do
begin
       if LogRec.s_time='' then
       begin
          logrec.s_funcname:='FormCreate';
          logrec.s_oper :='ini文件操作';
          logrec.s_result :='失败';
          logrec.s_errcode :='0';
          logrec.s_err :=e.Message;
          logrec.s_time :=FormatDateTime('yyyy-mm-dd hh:mm:ss',now);
          WriteLog();
       end;
      showmessage('ini文件操作失败!');
end;
end;

try
   DB_main.Connected    := False ;
   DB_main.Params.Values['SERVER NAME'] := server_name ;//数据库服务器名称
   DB_main.Params.Values['USER NAME'] := user_name ;//用户名称
   DB_main.Params.Values['DATABASE NAME'] := database_name;//数据库名称
   DB_main.Params.Values['PASSWORD'] := password ;//用户密码

   DB_main.Connected:=True;
   Timer1.Enabled := true;
   T_waittonow.Enabled := true;
   Timer_active_test.Enabled := true;

   for i:=0 to MAXCON-1 do
   begin
       aryclient[i].CUsed := false; //连接数组当前位置已经占用
       aryclient[i].IsLogin := false;
       aryclient[i].CHandle :=0;
   end;
       
except on e:exception do
begin
       if LogRec.s_time='' then
       begin
          logrec.s_funcname:='FormCreate';
          logrec.s_oper :='数据库连接操作';
          logrec.s_result :='失败';
          logrec.s_errcode :='0';
          logrec.s_err :=e.Message;
          logrec.s_time :=FormatDateTime('yyyy-mm-dd hh:mm:ss',now);
          WriteLog();
       end;

   showmessage('数据库操作失败!');
end;
end;
    binit.Click;
end;

procedure TFrmMain.T_waittonowTimer(Sender: TObject);
var
  time1:Tdatetime;
  Sqlstr:string;
begin

       time1 :=now  ;
       with QWating do
       begin
            close;
            SQl.Clear;
            SqlStr:='';
            SqlStr:='select * from dg_waiting_data with(nolock) ';

⌨️ 快捷键说明

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