技术文档

电话分机系统采用Delphi7.0+SQL Server2000+Visual Studio 2005开发而成。是采用软件结合硬件的方式实现的控制和支持,系统主要利用了时间片轮转、快速优先级算法和多线程技术来实现语音应答,程序流控,信号检测、CTI技术(计算机电话集成)等功能实现。

首先用以上技术得到的信息保存到数据库中,再利用浏览器显示出相关信息。

 

语音应答的语音文件


 

快速优先级算法的每个状态:

WORKING_STATUS=(WS_HANGUP,WS_PLAYING,WS_TIMER,WS_BUSY,WS_RECORDING,WS_READING,WS_WaitDial,WS_DIALING,WS_WAITE,WS_CHECKUSER,WS_SENDFAX,WS_RECFAX,WS_FAX,WS_RECORD);

 

每个状态的部分代码:

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

WS_RECORD:

      begin

        if TV_OffHookDetect(ch)=0 then

        begin

           rzstrgrd1.Cells[3,ch+1] :='内线挂机,停止录音';

           TV_StopPlayFile(ch);

           cs[ch] :=WS_HANGUP;

        end

        else

        begin

            rzstrgrd1.Cells[3,ch+1] :='正在录音,'+IntToStr(RecordFile);

  //          cs[ch] :=WS_RECORD;         

        end;

      end;

     WS_READING:

     begin

        if TV_OffHookDetect(Ch)=0 then    //被叫方先挂机

        begin

           rzstrgrd1.Cells[3,ch+1] :='内线挂机';

           cs[ch] :=WS_HANGUP;

        end

     End;

     WS_FAX:

     begin

       if not (TV_MonitorOffHook(ch_info[ch].Inner,25)=0) then  //监视对方摘机

       begin

         TV_PowerCtrl(ch);

         TV_ConnectChannels(ch,ch_info[ch].inner);

         cs[ch] := WS_SENDFAX;

 

       end

       ELSE if TV_OffHookDetect(ch)=0 then                     //主叫方先挂机;

       Begin

         rzstrgrd1.Cells[3,ch+1] :='内线挂机';

         rzstrgrd1.Cells[2,ch+1] :='挂机';

         rzstrgrd1.Cells[3,ch_info[ch].inner+1] :='对方已挂机';

         rzstrgrd1.Cells[2,ch_info[ch].inner+1] :='挂机';

         cs[ch] :=WS_HANGUP;

       End;

     end;

     WS_SENDFAX:

     begin

        cs[ch_info[ch].Inner]:= WS_HANGUP;

         rzstrgrd1.Cells[3,ch+1] :='内线挂机';

         rzstrgrd1.Cells[2,ch+1] :='挂机';

         rzstrgrd1.Cells[3,ch_info[ch].inner+1] :='对方已挂机';

         rzstrgrd1.Cells[2,ch_info[ch].inner+1] :='挂机';

         cs[ch] :=WS_HANGUP;

       End;

      if cs[Ch_Info[ch].Inner]=WS_HANGUP then    //被叫方先挂机

      begin

         TV_DisconnectChannels(ch,ch_info[ch].Inner);

         TV_HangUpCtrl(ch);

//         TV_PowerCtrl(ch);

         rzstrgrd1.Cells[3,ch+1] :='对方已挂机';

         rzstrgrd1.Cells[2,Ch+1] :='对方挂机';

         rzstrgrd1.Cells[3,ch_info[ch].inner+1] :='内线挂机';

         rzstrgrd1.Cells[2,ch_info[ch].inner+1] :='挂机';

         cs[ch] :=WS_HANGUP;

      end;

      Ch_Info[ch].RingCount :=0;

     end;

 

时间片轮转的图片及部分代码:

procedure TFrmMain.tmr1Timer(Sender: TObject);

var

  Ch,Dstr :Integer;

  dtmf : Integer;

  PlayFile:Integer;

begin

 for Ch :=0 to 7-1 do

 

信号检测代码:

if dtmf<>-1 then

          begin

            TV_FlushDTMF(ch);

            Ch_Info[ch].DTMFStr :=Ch_Info[ch].DTMFStr+char(dtmf);

            Ch_Info[ch].ReciveStr := Ch_Info[ch].ReciveStr+char(dtmf);

          End;

          Ch_Info[ch].StrLen :=Length(Ch_Info[ch].ReciveStr);

          rzstrgrd1.Cells[5,ch+1] :=Ch_Info[ch].DTMFStr;

 

 

分机号登录B/S的代码:

if (r1.IsValid == false)

            return;

        if (r2.IsValid == false)

            return;

        User user = new User();

        if (user.UserLogin(TextBox1.Text.Trim(), TextBox2.Text.Trim()) == false)

        {

            Alert.alert("分机号或密码错误!", Page);

            return;

        }

        Response.Redirect("index.aspx");

利用B/S进行放音的代码:

if (Request.QueryString["id"] == null)

        {

            Page.RegisterStartupScript("","<script>alert('数据出错')</script>");

            Label1.Text = "1";

            return;

        }

        if (!IsPostBack)

        {

            string s = Request.QueryString["id"].ToString();

            s = Server.UrlDecode(s);

            s="tw/"+s;

            string path = "<object id=nstv classid='CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6' width=445 height=51 codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=Loading Microsoft? Windows Media? Player components... type=application/x-oleobject><param name='URL' ";

            path += "value='" + s + "'>";

            path += "<PARAM NAME='UIMode' VALUE='full'><PARAM NAME='AutoStart' VALUE='true'><PARAM NAME='Enabled' VALUE='true'><PARAM NAME='enableContextMenu' VALUE='false'></object> ";

            Label1.Text = path;

        }