SoftPhone. Система голосових дзвінків

Автор работы: Пользователь скрыл имя, 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

Вложенные файлы: 1 файл

1True1.docx

— 1.12 Мб (Скачать файл)

        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(Sender: TObject);

begin

  RemoveAction.Enabled := (TAccountsFrm1.AccountList.Items.Count > 0) and (TAccountsFrm1.AccountList.Selected <> nil);

end;

 

procedure TMainForm.AddActionExecute(Sender: TObject);

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.Items.Count - 1 do

      if (TAccountsFrm1.AccountList.Items[i].Caption = s) and (TAccountsFrm1.AccountList.Items[i].SubItems[0] = u) then

      begin

        exists := True;

        break;

      end;

      if not exists then

      begin

        Ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+IniFileName);

        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'+IntToStr(i), 'Server','')) or

              (u <> Ini.ReadString('ACCOUNT'+IntToStr(i), 'User','')) then

              begin

                sl.Add(Ini.ReadString('ACCOUNT'+IntToStr(i), 'Server',''));

                ul.Add(Ini.ReadString('ACCOUNT'+IntToStr(i), 'User',''));

                pl.Add(Ini.ReadString('ACCOUNT'+IntToStr(i), 'Password',''));

                tl.Add(Ini.ReadString('ACCOUNT'+IntToStr(i), 'STUN',''));

                xl.Add(Ini.ReadString('ACCOUNT'+IntToStr(i), 'Proxy', ''));

              end;

              Ini.EraseSection('ACCOUNT'+IntToStr(i));

            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'+IntToStr(i+1), 'Server',sl[i]);

              Ini.WriteString('ACCOUNT'+IntToStr(i+1), 'User',ul[i]);

              Ini.WriteString('ACCOUNT'+IntToStr(i+1), 'Password',pl[i]);

              Ini.WriteString('ACCOUNT'+IntToStr(i+1), 'STUN',tl[i]);

              Ini.WriteString('ACCOUNT'+IntToStr(i+1), 'Proxy', xl[i]);

            end;

            Ini.WriteInteger('ACCOUNT', 'Count', sl.Count);

          finally

            sl.Free;

            ul.Free;

            pl.Free;

            tl.Free;

            xl.Free;

          end;

          TAccountsFrm1.AccountList.Items.Add.Caption := s;

          TAccountsFrm1.AccountList.Items[TAccountsFrm1.AccountList.Items.Count-1].SubItems.Add(u);

        finally

          Ini.Free;

        end;

      end;

    end;

  finally

    RF.Free;

  end;

end;

 

procedure TMainForm.EditActionUpdate(Sender: TObject);

begin

  EditAction.Enabled := (TAccountsFrm1.AccountList.Items.Count > 0) and

    (TAccountsFrm1.AccountList.Selected <> nil);

end;

 

procedure TMainForm.EditActionExecute(Sender: TObject);

var

  RF: TRegistrationForm;

  s, u: String;

  idx: Integer;

  Ini: TIniFile;

  cur: Boolean;

  cnt, i: Integer;

begin

  RF := TRegistrationForm.Create(nil);

  try

    Ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+IniFileName);

    try

      s := TAccountsFrm1.AccountList.Selected.Caption;

      u := TAccountsFrm1.AccountList.Selected.SubItems[0];

      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'+IntToStr(i), 'Server','')) and

        (u = Ini.ReadString('ACCOUNT'+IntToStr(i), 'User','')) then

        begin

          RF.PasswordEdit.Text := Ini.ReadString('ACCOUNT'+IntToStr(i), 'Password','');

          RF.STUNEdit.Text := Ini.ReadString('ACCOUNT'+IntToStr(i), 'STUN','');

          RF.ProxyEdit.Text := Ini.ReadString('ACCOUNT'+IntToStr(i), 'Proxy', '');

          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'+IntToStr(idx), 'Server', RF.ServerEdit.Text);

          Ini.WriteString('ACCOUNT'+IntToStr(idx), 'User', RF.UserEdit.Text);

          Ini.WriteString('ACCOUNT'+IntToStr(idx), 'Password', RF.PasswordEdit.Text);

          Ini.WriteString('ACCOUNT'+IntToStr(idx), 'STUN', RF.STUNEdit.Text);

          Ini.WriteString('ACCOUNT'+IntToStr(idx), 'Proxy', RF.ProxyEdit.Text);

        end;

        TAccountsFrm1.AccountList.Selected.Caption := RF.ServerEdit.Text;

        TAccountsFrm1.AccountList.Selected.SubItems[0] := RF.UserEdit.Text;

      end;

    finally

      Ini.Free;

    end;

  finally

    RF.Free;

  end;

end;

 

procedure TMainForm.SipClientDtmf(Sender: TObject; const ACall: ISipCall;

  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(Sender: TObject);

var

  Dlg: TSaveDialog;

begin

  if not Assigned(FRecorder) then

  begin

    FRecorder := SipClient.CreateRecorder;

    if Assigned(FLines[FLineIndex]) then

      FLines[FLineIndex].SetRecorder(FRecorder);

  end

  else

  begin

    Dlg := TSaveDialog.Create(nil);

    try

      if Dlg.Execute then

        FRecorder.SaveToFile(Dlg.FileName);

    finally

      Dlg.Free;

    end;

    FRecorder := nil;

  end;

end;

 

procedure TMainForm.RecordActionUpdate(Sender: TObject);

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+Integer(FLineImages[Index]), B);

      B.PixelFormat := pf24bit;

      FButtons[Index].Glyph.Assign(B);

      FButtons[Index].Glyph.TransparentColor := clWhite;

      FButtons[Index].Glyph.Transparent := True;

    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.ActivateDialpadFrameBtnClick(Sender: TObject);

begin

  TDialFrm1.Visible := True;

  TAccountsFrm1.Visible := False;

  TAudioFrm1.Visible := False;

end;

 

procedure TMainForm.ActivateAccountsFrameBtnClick(Sender: TObject);

begin

  TDialFrm1.Visible := False;

  TAccountsFrm1.Visible := True;

  TAudioFrm1.Visible := False;

end;

 

 

 

procedure TMainForm.ActivateAudioFrameBtnClick(Sender: TObject);

begin

  TDialFrm1.Visible := False;

  TAccountsFrm1.Visible := False;

  TAudioFrm1.Visible := True;

end;

 

procedure TMainForm.SpeedButton1Click(Sender: TObject);

begin

 

MessageBox(0,PChar('Sip Phone Free software version 1.0.0'+#13#10+'Розробив  студент НУ Львівська політехніка'+#13#10+Студент  КІ-43 Глухенький М.П..'+#13#10+'2013 Рік.'), 'About', MB_ICONINFORMATION);

end;

 

procedure TMainForm.TDialFrm1Button1Click(Sender: TObject);

begin

  TDialFrm1.PhoneEdit.Clear;

end;

 

end.

 

 

 

 

 

 

 

 

 

 

 

ДОДАТОК Б. ЗНІМКИ ЕКРАНІВ ПРОГРАМИ

 

Рис. 1. Головне вікно програми SoftPhone

 

Рис. 2. Вікно налаштувань користувачів

 

Рис. 3. Вікно налаштувань звуку

 

 

Рис. 4. Вікно інформації про програму

 

Рис. 5. Знімки інтерфейсу програми «Sippoint».

Рис. 6. Знімки інтерфейсу програми «Sippoint».


Информация о работе SoftPhone. Система голосових дзвінків