技术文档
电话分机系统采用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:6BF
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;
}