Автор работы: Пользователь скрыл имя, 25 Июня 2013 в 22:01, дипломная работа
Останім часом все ширше стає застосовуватись мережі Інтернет. І якщо років 10 тому аналітики заперечували можливість передачі голосу і відео через мережу Інтернет, то сьогодні їхні погляди на ці речі повністю змінились. Наприклад, з прогнозу дослідницької фірми Analysys у 2003 році на Інтернет-телефонію буде припадати 36% всіх міждународних переговорів.
Великим поштовхом для прогресивного розвитку Інтернет-телефонії стало те що використання мережі Інтернет для передавання голосових і відео повідомлень є досить зручним і є набагато дешевшим чим звичайний телефоний дзвінок.
ІР - телефонія , за допомогою Інтернету дозволяє організовувати дзвінки між комп'ютерами . В ІР - телефонії використовуються канали зв'язку мережі Інтернет. При розмові наші голосові сигнали перетворюються в пакети даних які стискаються
ВСТУП 9
Розділ 1. IP - ТЕЛЕФОНІЯ і SIP ПРОТОКОЛ 13
1.1. Історія розвитку ІР - телефонії 13
1.2. Принцип дії ІР - телефонії 13
1.3. Якість Зв'язку ІР - телефонії 14
1.4. Протокол SIP 16
1.5.Можливості протоколу SIP 17
1.6. Повідомлення SIP 18
1.7. Приклад встановлення з'єднання 20
1.8.Мережа на базі протоколу SIP 22
1.9. Висновок до першого розділу 26
2. ВИБІР ЗАСОБІВ ДЛЯ РЕАЛІЗАЦІЇ ПРОГРАМИ 27
2.1. Вибір мови програмування 27
2.2. Опис мови програмування і її основні елементи 27
2.3. Структура програми 29
2.4. Характеристики Delphi SIP Component 31
2.5. Вимог до апаратних 32
2.6. Призначення програми 32
2.7. Вимоги до програми загалом 32
2.8. Розробка узагальненого алгоритму функціонування програми 33
2.9. Висновок до другого розділу 35
3. ПРОГРАМНА РЕАЛІЗАЦІЯ СИСТЕМИ 36
3.1. Розробка архітектури програмного рішення 36
3.1.1. MainForm - головне вікно 36
3.1.2 DialForm - форма дизайну і розташування всіх компонентів 37
3.1.3 AudiFrm - форма налаштування звуку. 38
3.1.4 AccountsFrm - форма налаштування користувачів. 39
3.2. Проектування інтерфейсу користувача 40
3.2.1 Головне вікно 40
3.2.2 Вікно "Account Settings" 41
3.2.3 Вікно "Audio Settings" 43
3.2.4 Вікно "About" 43
3.2.5 Розробка діаграм функцій для програми. 44
3.3. Тестування роботи програми 51
3.4. Висновок до третього розділу 53
4. ЕКОНОМІЧНА ЧАСТИНА 54
4.1. Розрахунок витрат на розробку та впровадження проектного рішення 54
4.3. Визначення комплексного показника якості 60
4.4. Визначення експлуатаційних витрат 62
4.5. Розрахунок ціни споживання проектного рішення 64
4.6. Визначення показників економічної ефективності 65
4.6.1. Показник конкурентоздатності: 65
4.6.2. Економічний ефект в сфері проектування рішення: 65
4.6.3. Економічний ефект в сфері експлуатації : 65
4.6.4. Оскільки Епр>0 і Еекс>0, розраховуємо додатковий економічний ефект в сфері проектування: 66
4.6.5. Сумарний ефект 66
4.7.Висновок до четвертого розділу 67
ВИСНОВОК 68
Ini.ReadString('ACCOUNT', 'Password', PasswordEditText);
Ini.WriteString('ACCOUNT', 'STUN', STUNEditText);
Ini.WriteString('ACCOUNT', 'Proxy', ProxyEditText);
if Length(ServerEditText) > 0 then
OnlineMenuClick(Self);
end;
end;
finally
Ini.Free;
end;
end;
procedure TMainForm.RemoveActionUpdate(
begin
RemoveAction.Enabled := (TAccountsFrm1.AccountList.
end;
procedure TMainForm.AddActionExecute(
var
RF: TRegistrationForm;
cnt, i: Integer;
s, u: String;
sl, ul, pl, tl, xl: TStringList;
Ini: TIniFile;
exists: Boolean;
begin
RF := TRegistrationForm.Create(nil);
try
if RF.ShowModal = mrOk then
begin
s := RF.ServerEdit.Text;
u := RF.UserEdit.Text;
exists := False;
for i := 0 to TAccountsFrm1.AccountList.
if (TAccountsFrm1.AccountList.
begin
exists := True;
break;
end;
if not exists then
begin
Ini := TIniFile.Create(
try
cnt := Ini.ReadInteger('ACCOUNT', 'Count',0);
sl := TStringList.Create;
ul := TStringList.Create;
pl := TStringList.Create;
tl := TStringList.Create;
xl := TStringList.Create;
try
for i := 1 to cnt do
begin
if (s <> Ini.ReadString('ACCOUNT'+
(u <> Ini.ReadString('ACCOUNT'+
begin
sl.Add(Ini.ReadString('
ul.Add(Ini.ReadString('
pl.Add(Ini.ReadString('
tl.Add(Ini.ReadString('
xl.Add(Ini.ReadString('
end;
Ini.EraseSection('ACCOUNT'+
end;
sl.Add(s);
ul.Add(u);
pl.Add(RF.PasswordEdit.Text);
tl.Add(RF.STUNEdit.Text);
xl.Add(RF.ProxyEdit.Text);
for i := 0 to sl.Count - 1 do
begin
Ini.WriteString('ACCOUNT'+
Ini.WriteString('ACCOUNT'+
Ini.WriteString('ACCOUNT'+
Ini.WriteString('ACCOUNT'+
Ini.WriteString('ACCOUNT'+
end;
Ini.WriteInteger('ACCOUNT', 'Count', sl.Count);
finally
sl.Free;
ul.Free;
pl.Free;
tl.Free;
xl.Free;
end;
TAccountsFrm1.AccountList.
TAccountsFrm1.AccountList.
finally
Ini.Free;
end;
end;
end;
finally
RF.Free;
end;
end;
procedure TMainForm.EditActionUpdate(
begin
EditAction.Enabled := (TAccountsFrm1.AccountList.
(TAccountsFrm1.AccountList.
end;
procedure TMainForm.EditActionExecute(
var
RF: TRegistrationForm;
s, u: String;
idx: Integer;
Ini: TIniFile;
cur: Boolean;
cnt, i: Integer;
begin
RF := TRegistrationForm.Create(nil);
try
Ini := TIniFile.Create(
try
s := TAccountsFrm1.AccountList.
u := TAccountsFrm1.AccountList.
RF.ServerEdit.Text := s;
RF.UserEdit.Text := u;
cur := (s = Ini.ReadString('ACCOUNT', 'Server','')) and
(u = Ini.ReadString('ACCOUNT', 'User',''));
if cur then
begin
RF.PasswordEdit.Text := Ini.ReadString('ACCOUNT', 'Password','');
RF.STUNEdit.Text := Ini.ReadString('ACCOUNT', 'STUN','');
RF.ProxyEdit.Text := Ini.ReadString('ACCOUNT', 'Proxy','');
end;
cnt := Ini.ReadInteger('ACCOUNT', 'Count',0);
idx := 0;
for i := 1 to cnt do
begin
if (s = Ini.ReadString('ACCOUNT'+
(u = Ini.ReadString('ACCOUNT'+
begin
RF.PasswordEdit.Text
:= Ini.ReadString('ACCOUNT'+
RF.STUNEdit.Text
:= Ini.ReadString('ACCOUNT'+
RF.ProxyEdit.Text
:= Ini.ReadString('ACCOUNT'+
idx := i;
break;
end;
end;
if RF.ShowModal = mrOk then
begin
if cur then
begin
OfflineMenuClick(nil);
ServerEditText := RF.ServerEdit.Text;
UserEditText := RF.UserEdit.Text;
PasswordEditText := RF.PasswordEdit.Text;
STUNEditText := RF.STUNEdit.Text;
ProxyEditText := RF.ProxyEdit.Text;
Ini.WriteString('ACCOUNT', 'Server',ServerEditText);
Ini.WriteString('ACCOUNT', 'User',UserEditText);
Ini.WriteString('ACCOUNT', 'Password',PasswordEditText);
Ini.WriteString('ACCOUNT', 'STUN',STUNEditText);
Ini.WriteString('ACCOUNT', 'Proxy',ProxyEditText);
end;
if idx > 0 then
begin
Ini.WriteString('ACCOUNT'+
Ini.WriteString('ACCOUNT'+
Ini.WriteString('ACCOUNT'+
Ini.WriteString('ACCOUNT'+
Ini.WriteString('ACCOUNT'+
end;
TAccountsFrm1.AccountList.
TAccountsFrm1.AccountList.
end;
finally
Ini.Free;
end;
finally
RF.Free;
end;
end;
procedure TMainForm.SipClientDtmf(
const Dtmf: String);
var
i: Integer;
begin
for i := 1 to 6 do
begin
if (FLines[i] = ACall) and (ACall.State = csActive) then
begin
FDtmf[i] := FDtmf[i] + Dtmf;
ShowMemo;
end;
end;
end;
procedure TMainForm.ShowMemo;
var
text: String;
begin
text := 'Line '+IntToStr(FLineIndex);
if Assigned(FLines[FLineIndex]) then
begin
if FLines[FLineIndex].CallType = ctIncoming then
text := text + ' Incoming'+#13#10
else
text := text + ' Outgoing'+#13#10;
text := text + FLines[FLineIndex].RemoteUser;
if FDtmf[FLineIndex] <> '' then
text := text + #13#10 + 'DTMF detected: '+FDtmf[FLineIndex];
if FLines[FLineIndex].State = csRinging then
text := text + #13#10 + 'Ringing...';
end;
TDialFrm1.LineMemo.Text := text;
end;
procedure TMainForm.SBtn1Click(Sender: TObject);
begin
FLineIndex := (Sender as TSpeedButton).Tag;
RefreshLines;
end;
procedure TMainForm.RecordActionExecute(
var
Dlg: TSaveDialog;
begin
if not Assigned(FRecorder) then
begin
FRecorder := SipClient.CreateRecorder;
if Assigned(FLines[FLineIndex]) then
FLines[FLineIndex].
end
else
begin
Dlg := TSaveDialog.Create(nil);
try
if Dlg.Execute then
FRecorder.SaveToFile(Dlg.
finally
Dlg.Free;
end;
FRecorder := nil;
end;
end;
procedure TMainForm.RecordActionUpdate(
begin
RecordAction.Enabled := (Assigned(FLines[FLineIndex]) and
(FLines[FLineIndex].State in [csActive, csRinging, csHold, csConnecting]))
or Assigned(FRecorder);
TDialFrm1.RecordBtn.Enabled := RecordAction.Enabled;
if not Assigned(FRecorder) then
begin
if TDialFrm1.RecordBtn.Caption <> 'Çàïèñòè' then
TDialFrm1.RecordBtn.Caption := 'Çàïèñàòè'
end
else
begin
if TDialFrm1.RecordBtn.Caption <> 'Çáåðåãòè ÿê...' then
TDialFrm1.RecordBtn.Caption := 'Çáåðåãòè ÿê...';
end;
end;
procedure TMainForm.RefreshLines;
var
i: Integer;
procedure SetGlyph(Index: Integer);
var
B: TBitmap;
begin
B := TBitmap.Create;
try
StatusImages.GetBitmap(2+
B.PixelFormat := pf24bit;
FButtons[Index].Glyph.Assign(
FButtons[Index].Glyph.
FButtons[Index].Glyph.
finally
B.Free;
end;
end;
begin
for i := 1 to 6 do
begin
if Assigned(FLines[i]) then
begin
if FLines[i].EnableAudioOut <> (FLineIndex = i) then
FLines[i].EnableAudioOut := FLineIndex = i;
if FLines[i].EnableAudioIn <> (FLineIndex = i) then
FLines[i].EnableAudioIn := FLineIndex = i;
end;
if (FLineIndex = i) and Assigned(FLines[i]) and (FLines[i].State = csActive) then
begin
if not FLineImages[i] then
begin
FLineImages[i] := True;
end;
end
else
begin
if Assigned(FLines[i]) and (FLines[i].State <> csInactive) then
begin
FLineImages[i] := not FLineImages[i];
end
else
begin
if FLineImages[i] then
begin
FLineImages[i] := False;
end;
end;
end;
end;
ShowMemo;
end;
procedure TMainForm.Timer1Timer(Sender: TObject);
begin
RefreshLines;
end;
procedure TMainForm.
begin
TDialFrm1.Visible := True;
TAccountsFrm1.Visible := False;
TAudioFrm1.Visible := False;
end;
procedure TMainForm.
begin
TDialFrm1.Visible := False;
TAccountsFrm1.Visible := True;
TAudioFrm1.Visible := False;
end;
procedure TMainForm.
begin
TDialFrm1.Visible := False;
TAccountsFrm1.Visible := False;
TAudioFrm1.Visible := True;
end;
procedure TMainForm.SpeedButton1Click(
begin
MessageBox(0,PChar('Sip Phone Free software version 1.0.0'+#13#10+'Розробив
студент НУ Львівська
end;
procedure TMainForm.
begin
TDialFrm1.PhoneEdit.Clear;
end;
end.
Рис. 1. Головне вікно програми SoftPhone
Рис. 2. Вікно налаштувань користувачів
Рис. 3. Вікно налаштувань звуку
Рис. 4. Вікно інформації про програму
Рис. 5. Знімки інтерфейсу програми «Sippoint».
Рис. 6. Знімки інтерфейсу програми «Sippoint».