Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

VOIP - jaki program (SIP Softphone) na PC (Windows 7) dla firmy?

maniootek 14 Lis 2014 10:04 11334 104
  • #32
    przeqpiciel
    Poziom 31  
    Ponieważ to GUI wciąż jest RC (kandydat do wydania), ma w sobie kilka bugów i może mocno zniechęcić do koryzstania z tego oprogramowania. Poza tym spróbuj trixbox'a bądź elastix'a moim zdaniem są o wiele lepsze niż to konkretne GUI.

    Co do pytania czy nie ma jakiegoś gotowca. Lekka znajomość PHP i rozwiązanie masz gotowe lub poczekaj aż skończę swojego VPBX'a :)
  • #33
    maniootek
    Poziom 14  
    Ten trixbox i elastix to sa gotowe dystrybucje instalowane jako system prawda? Ja mam juz maszyne z systemem debiana i chcialbym to wykorzystac wiec bardziej chcialbym jakas paczke zainstalowac a nie caly system. Znasz moze cos takiego?
    Aha no i opowiedz cos wiecej nad czym to pracujesz. Co to ten VPBX
  • #34
    przeqpiciel
    Poziom 31  
    Tak, gotowe.

    VPBX to nic innego jak Virtual Private Branch Extenstion - czyli wirtualna centrala telefoniczna. Chcę stworzyć system, który będzie oferować wszystko za symboliczną opłatą.

    Powracając do Twojego problemu. Skoro masz działającego debiana i jakiś żywy organizm tam to moim zdaniem pozostaje Tobie stworzenie samemu czegoś więcej. Asteriska już masz, możesz dostawić drugą maszynę z bazą danych i Apache'm dla webaplikacji i składowania informacji od centrali.

    Albo poprostu napisz co potrzebujesz to sie pomysli konkretniej.
  • #35
    Gawcio90
    Poziom 16  
    Udało się zrobić jak pisałeś, czyli wszystko mam w lokalnej bazie danych i dostęp do niej bezpośrednio z przeglądarki.

    Czy jest możliwość nagrywania nie tylko samej rozmowy ale żeby również nagrywał się dam sygnał? Zarówno dla połączeń wychodzących jak i przychodzących?
  • #36
    przeqpiciel
    Poziom 31  
    jeżeli dobrze pamiętam to nagrywanie zaczyna się od zestawienia kanałów czyli od chwili gdy ktoś odbierze połączenie.
  • #37
    Gawcio90
    Poziom 16  
    Dokładnie tak jak piszesz, a jak w przypadku kiedy mam kolejki i menu i chcę przedstawić Klienowi, że jest nagrywany? Domyślam się, że ta część powinna również zostać nagrana.

    Kolejna bardzo istotna sprawa, w którym miejscu asterisk tworzy inserta do bazy danych? Chodzi mi o to iż po każdej rozmowie tworzony jest rekord bazie i w tym momencie potrzebuję dodać coś do tego inserta.

    Miało by to działać tak iż zaraz po rozmowie jeszcze przed utworzeniem rekordu w bazie sprawdzam czy ten numer nie znajduje się już w innej bazie i w zależności od tego dodaje np imię i nazwisko do bazy danych.

    Możesz jakoś pomóc?

    EDIT:

    Jeszcze jeden problem, jak zrobić aby sygnał był zajęty kiedy linia aktualnie jest zajęta? W tym momencie nawet w przypadku zajętości można dzwonić na zajętą linię.

    Kombinowałem w taki sposób, jednak bez powodzenia:
    Code:
    exten => przychodzace,1,Noop(Polaczenie przychodzace od ${CALLERID(num)}) 
    
    same => n,MixMonitor(/mnt/records/${UNIQUEID}.wav,ab)
    same => n,Dial(SIP/100)
    same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy)                             
    same => n(busy),Busy(10)
    same => n,StopMixMonitor()
    same => n,Hangup
  • #38
    przeqpiciel
    Poziom 31  
    Do bazy danych możesz sam cokolwiek dodawać za pomocą dialplanów bądź dodać nowe pole do CDR, który jest zapisywany na końcu połączenia

    Code:

    exten => 1,1,Set(CDR(userfield)=Value)


    Cytat:
    Miało by to działać tak iż zaraz po rozmowie jeszcze przed utworzeniem rekordu w bazie sprawdzam czy ten numer nie znajduje się już w innej bazie i w zależności od tego dodaje np imię i nazwisko do bazy danych.

    Jeżeli takie cuda to utworzyłbym odrebne makro, które to wszystko weryfikuj lub skorzystał z PHPAgi

    VoIP pozwala ja wiele połączeń na jedno konto, aby utworzyć ograniczenie zadzwoń do operatora lub dodaj wpis do sip.conf w sekcji dotyczacej konta parametr
    call-limit = 1
  • #39
    Gawcio90
    Poziom 16  
    call-limit = 1, działa jednak kiedy dzwoni kolejna osoba to komunikat jest iż telefon jest nieosiągalny. Klient może pomyśleć, że po prostu sobie wyłączyliśmy telefon.

    Nie ma innego sposobu aby uzyskać sygnał zajętości?


    Cytat:
    Jeżeli takie cuda to utworzyłbym odrebne makro

    Mógłbyś podać przykład jak mógłbym to wykorzystać do swoich celów?

    Czy dialpanem mogę uruchomić jakiś skrypt w bashu?
    Wtedy przekazałbym do skryptu numer telefonu, a sam skrypt już by sprawdził zaktualizował baze w razie konieczności.
  • #40
    przeqpiciel
    Poziom 31  
    Możliwe, że takie połączenie spada na exten 'h', który trzeba by było dodatkowo oprogramować.

    Jednak możesz sprawdzić inny pomysł. Pierwsza myśl to upewnić się czy w Twoim telefonie (hardphone/softphone) funkcja WaitingCall jest wyłączona.

    A jeżeli to nic nie pomoże zawsze możesz spróbować dodatkowo skorzystać z DEVICE_STATE w celu sprawdzenia jaki stan aktualnie peer posiada.

    Code:

    exten => a,1,Noop(${DEVICE_STATE(SIP/100)})


    Powinno zwrócić NOT_INUSE lub INUSE ewentualnie masę innych w tych gorszych przypadkach :) I na podstawie tego zbudować łądnego GOTOIF lub GOTO, który albo wykonuje DIAL albo odtwarzanie dzwieku.

    Gawcio90 napisał:
    Czy dialpanem mogę uruchomić jakiś skrypt w bashu?

    Chwila wysiłku na googole i byś znalazł odpowiedź :)
    Code:

      -= Info about application 'System' =-

    [Synopsis]
    Execute a system command.

    [Description]
    Executes a command  by  using  system(). If the command fails, the console
    should report a fallthrough.
    Result of execution is returned in the ${SYSTEMSTATUS} channel variable:
    ${SYSTEMSTATUS}:
        FAILURE: Could not execute the specified command.
        SUCCESS: Specified command successfully executed.

    [Syntax]
    System(command)

    [Arguments]
    command
        Command to execute

    [See Also]
    Not available

    Gawcio90 napisał:

    Wtedy przekazałbym do skryptu numer telefonu, a sam skrypt już by sprawdził zaktualizował baze w razie konieczności.


    Jeżeli zewnętrzne skrypt to bash jak piszesz poprzez komendę SYSTEM bądź AGI a jako, że BASH'a nie znam to najchętniej PHPAgi, które udostępnia skłądnię PHP do tworzenia skryptów dla Asteriska

    http://www.voip-info.org/wiki/view/Asterisk+AGI
    http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/AGI-quickstart.html
  • #41
    Gawcio90
    Poziom 16  
    Dzięki za naprowadzenie, najsensowniej było to zrobić tak:
    Code:
    same => n,GotoIf($[ ${DEVICE_STATE(SIP/100)} = INUSE ]?busy:aval)                            
    
    same => n(busy),Busy(10)
    same => n(aval),Dial(SIP/100)


    Potrzebuję jeszcze pomocy przy AGI, mam prosty skrypt:

    Kod: php
    Zaloguj się, aby zobaczyć kod


    Jak wysłać zmienną $uniqueid do konsoli CLI asterisk? Znacznie łatwiej będzie coś testować mając taką możliwość.
  • #43
    Gawcio90
    Poziom 16  
    Czy przy tworzeniu kolejek korzystasz z jakiegoś zewnętrznego oprogramowania czy samemu wszystko pisałeś?
  • #44
    przeqpiciel
    Poziom 31  
    Ja korzystam z wbudowanego systemu kolejek, bo po co armatą otwierać wyważać drzwi skoro już je ktoś otworzył ? :D

    Queues.conf oraz w dialplanie komenda Queue(NAZWA_KOLEJKI) :)
  • #45
    Gawcio90
    Poziom 16  
    Czy mógłbyś pokazać jak u Ciebie wygląda plik queue.conf?
    Tam jest milion opcji do wykorzystania domyślam się, że wiele z nich całkowicie zbędnych.

    Na tą chwilę potrzebuję prostą kolejkę, która będzie dla jednego konsultanta.
  • #46
    przeqpiciel
    Poziom 31  
    Plis, zanim zadasz pytanie to spojrz w google

    http://www.voip-info.org/wiki/view/Asterisk+cmd+Queue

    Code:

    [example_queue]
    music = default ; ktora klasa MOH
    strategy = ringall ; strategia obdzwaniania agentow
    context = queue-out ; Here we go when the caller presses a single digit, while in the queue
    timeout = 15 ; po ilu sekundach skacze na kolejnego agenta
    wrapuptime=10 ; ile sekund dac agentowi zanim zacznie mu dzwonic telefon ponownie
    joinempty = yes ; opcja czy dzwoniacy ma wejsc do kolejki gdy nie ma agentow
    member => SIP/100 ; dodanie telefonu do tej kolejki
    member => SIP/101; dodanie telefonu do tej kolejki
    member => SIP/102 ; dodanie telefonu do tej kolejki
    member => SIP/103 ; dodanie telefonu do tej kolejki
  • #47
    Gawcio90
    Poziom 16  
    Dzięki za naprowadzenie.

    Nie mogę znaleźć rozwiązania jak ustawić aby po nie odebraniu telefonu w ciągu 10s przez agenta dzwoniący dostał komunikat.

    Masz może pomysł jak to zrealizować?
  • #48
    przeqpiciel
    Poziom 31  
    Code:

    ;----------------------QUEUE TIMING OPTIONS------------------------------------
    ; A Queue has two different "timeout" values associated with it. One is the
    ; timeout parameter configured in queues.conf. This timeout specifies the
    ; amount of time to try ringing a member's phone before considering the
    ; member to be unavailable. The other timeout value is the second argument
    ; to the Queue() application. This timeout represents the absolute amount
    ; of time to allow a caller to stay in the queue before the caller is
    ; removed from the queue. In certain situations, these two timeout values
    ; may clash. For instance, if the timeout in queues.conf is set to 5 seconds,
    ; the retry value in queues.conf is set to 4, and the second argument to Queue()
    ; is 10, then the following may occur:


    Code:

    [Description]
    In addition to transferring the call, a call may be parked and then picked
    up by another user.
    This application will return to the dialplan if the queue does not exist,
    or any of the join options cause the caller to not enter the queue.
    This application does not automatically answer and should be preceeded by
    an application such as Answer(), Progress(), or Ringing().
    This application sets the following channel variable upon completion:
    ${QUEUESTATUS}: The status of the call as a text string.
        TIMEOUT
        FULL
        JOINEMPTY
        LEAVEEMPTY
        JOINUNAVAIL
        LEAVEUNAVAIL
        CONTINUE

    [Syntax]
    Queue(queuename[,options[,URL[,announceoverride[,timeout[,AGI[,macro[,gosub[,rul                                                                                                 e[,position]]]]]]]]])


    Code:

    exten => kolejka,1,Queue(NAZWA_KOLEJKI,,,10)
    same => n,background(komunikat)



    Albo w dialplanie ustawic timeoutabsolute

    Code:

    exten => wejscie,1,Noop(start logiki dazacej do kolejki)
    same => n,Set(Timeout(ABSOLUTE)=10)
    same => n,Queue(testowa)

    exten => T,1,Noop(Timeout)
    same => n,background(komunikat)
  • #49
    Gawcio90
    Poziom 16  
    Dokładnie o to mi chodziło.

    Softphony mają możliwość ustawienia różnych statusów jak dostępny, zajęty, niedostępny czy po prostu wylogowany.

    Czy da się jakoś wyciągnąć taki status aby na jego podstawie zbudować coś w dialplanie?

    Było by to dobre zabezpieczenie na wypadek kiedy trzeba wyjść z biura w czasie pracy.
  • #50
    przeqpiciel
    Poziom 31  
    Nie wydaje mi się aby była możliwość sprawdzania co użytkownik sobie w softphonie ustawił, ale ! jeżeli nie byłoby to jakimś wielkim utrudnieniem można by było zaprogramować 2 numery to włączania/wyłączania blokady ale w takim wypadku trzeba by było pamiętać, że coś takiego jest włączone.

    Jeszcze jeden pomysł bazujący na tym co powyżej, że użytkownik wdzwaniałby się do centrali ( zerowy koszt połączenia OFC ) gdzie byłby zmieniany parametr który bylby parametrem do logiki odnosnie czy wejsc do kolejki czy tez nie a po zakonczeniu polaczenia zdejmowana bylaby blokada
  • #51
    Gawcio90
    Poziom 16  
    Rzeczywiście, sprawdzanie statusu to być może zbyt skomplikowane.

    Jednak żeby nie było możliwości sprawdzenia czy agent jest w ogóle zalogowany to już dziwne. Z CLI można chyba sprawdzić ponieważ wyświetla się czy jest reachable lub nie.
  • #52
    przeqpiciel
    Poziom 31  
    Wiesz, agent to agent, peer to peer.
    Agent to telefon na ktorym uzytkownik wdzwonil sie i zautoryzowal jako agent i wtedy w kolejce opisujesz go jako:
    agent/JEGO_NAZWA
    tutaj mamy przyklad zastosowania zwyklego peer'a
    sip/NUMER_WEW

    Dodano po 26 [minuty]:

    Code:

    exten => test,1,Noop(moj)
       same => n,Noop(sprawdzam warunek >>${DEVICE_STATE(Custom:blokada)}<<)
       same => n,GotoIf($["${DEVICE_STATE(Custom:blokada)}" = "NOT_INUSE"]?kolejka,1:zajete,1)
       
    exten => zajete,1,Noop(zajety agent)
       same => n,Hangup
       
    exten => wl,1,Noop(Wlaczam blokade)
          same => n,Set(DEVICE_STATE(Custom:blokada)=BUSY)
          
    exten => wyl,1,Noop(Wylaczam blokade)
          same => n,Set(DEVICE_STATE(Custom:blokada)=NOT_INUSE)

    exten => kolejka,1,Noop(Wrzucam do kolejki)
    same => n,Queue(nazwa_koleji)
  • #53
    Gawcio90
    Poziom 16  
    Też znalazłem pewne rozwiązanie:

    Code:
    same => n,GotoIf($["${SIPPEER(100,status):0:3}"="OK "]?on:off)
    
    same => n(off),Noop(Peer is NOT reachable)
    same => n(on),Noop(Peer is reachable)
  • #54
    przeqpiciel
    Poziom 31  
    W sumie. Jak wyłączysz/wyrejestrujesz peera to powinno zadzialac.
  • #55
    Gawcio90
    Poziom 16  
    Do bazy zapisują się dwie wartości: "duration" oraz "billsec"

    W momencie wprowadzenia kolejek te czasy są równe, jest możliwość zrobienia aby "duration" był to czas od momentu połączenia do końca rozmowy, a "billsec" od momentu odebrania przez agenta do końca rozmowy?
  • #56
    przeqpiciel
    Poziom 31  
    cala roznica jest najbardziej do zauwazenia przy polaczeniach wychodzacych.
    duration to jest czas mierzony od momentu wybrania numeru przez centrale do konca polaczenia
    a bill sec jest czasem od momentu zestawienia kanalow - czyli od chwili gdy ktos to polaczenie odbierze, nawet IVR.

    jezeli cos takiego osiagnac to moze trzeba by bylo zrobic male obejscie bo ot tak nic nie przychodzi mi do glowy.

    Code:

    [agent]
    exten => agent,1,Noop(wzywam agenta)
    same=> n,Set(start=${EPOCH})
    same =>n,Dial(SIP/100)
    same =>n,Set(roznica=${start}-${EPOCH})
    same =>n,Set(CDR(rozmowaAgent)=${roznica})


    a w konfiguracji kolejki zamiast member=>sip/100 dac local/agent@agent moze coś w tym stylu
  • #57
    Gawcio90
    Poziom 16  
    Witam ponownie, pierwsze co to dzięki wielkie za pomoc, asterisk spisuje się perfekcyjnie od czasu jak został skonfigurowany na plikach a nie na gui. Cenna porada!

    Odkąd go postawiłem miałem jakby dwa problemy. Dzwoniąc na numer otrzymywałem komunikat, że nie ma takiego numeru. Sprawdzając konto sip w centrali to było zarejestrowane, w logach natomiast wyskakiwał komunikat, że nie istnieje odpowiednie extension.

    Po restarcie centrali wszystko wracało do normy, jest to bardzo sporadyczny przypadek jednak nie wiadomo kiedy się powtórzy, czy spotkałeś się z takim zachowaniem?
  • #58
    przeqpiciel
    Poziom 31  
    jeżeli chodzi o połączenia wychodzące to fakt zarejestrowania numeru nie ma nic wspólnego z wyjściem na świat.

    powracam też o wklejenie pełnego błedu jaki wyrzuca konsola asteriska w takim wypadku no i dobrze jest chwycic tcpdump'em sygnalizacje
    Code:

    tcpdump -w /tmp/blad.cap
  • #59
    robboh
    Poziom 9  
    Jak się zdążyłem zorientować kontrybucja Asterisk - Elastix jest gotową platformą z zaszytym Contos, czyli tak na prawdę do instalacji na gołym kompie, nie nadaje się do instalacji na działającym serwerze z zainstalowanym Linuksem. Jak się mylę niech mnie ktoś naprostuje, jednak wymagana jest instalacja z obrazu iso i w instrukcji jest wyraźne ostrzeżenie, że nastąpi formatowanie dysku. Brak jest też możliwości instalki przez ssh tylko z bezpośrednim dostępem do konsoli.
    Asterisk wydaje się nie mieć tego ograniczenia.
    Czy możecie potwierdzić moje spostrzeżenia?
  • #60
    przeqpiciel
    Poziom 31  
    ok, od początku.

    Asterisk jest pakietem oprogramowania, który pozwala Tobie na ogarnięcie tematu IP PBX.

    Elastix, Freepbx itp to nic innego jak gotowa dystrybucja linuksa z wgranym i gotowym asteriskiem oraz nakladka graficzna aby móć wyklikiwać, różnego rodzaju bajery.

    Samego asteriska masz w wielu repozytoriach, różnych dystrybucji linuxa. Debian i jego APT, Centos i ... pacman ? yum ? i jesteś w stanie go zainstalować za pomocą SSH

    Z gotowcami z ISO jest ten problem, że faktycznie potrzebujesz podejsc do komputera z plyta. Zatem jezelii jestesmy przy temacie Twojego dedyka to jedynie pozostaje Tobie czysty asterisk