Spis treści
1) Podstawowa konfiguracja kolejek
W pliku konfiguracyjnym queues.conf
należy utworzyć kolejki, określając ich numery (nazwy), strategię i listę agentów, którzy mają je obsługiwać. Zawsze warto pod ręką mieć informacje o wszystkich dostępnych opcjach. My oczywiście korzystamy z naszego ulubionego serwisu github gdzie mamy pliki konfiguracyjne Asteriska (queues.conf.sample) . Rozpocznijmy edycję pliku i skonfigurujmy naszą pierwszą kolejkę oraz ustawienia globalne
nano /etc/asterisk/queues.conf
1a) sekcja general
[general]
persistentmembers = yes
autofill = yes
shared_lastcall=yes
monitor-type = MixMonitor
persistentmembers
ma domyslną wartość "no"
warto jednak przestawić je na "yes"
. Będzie to oznaczać, że informacje o członkach kolejki (czyli agentach lub urządzeniach) są przechowywane w bazie danych astdb
, dzięki czemu są one zachowywane nawet po restarcie systemu Asterisk. Zatem, jeśli agent znajdował się w kolejce przed restartem systemu, to po jego ponownym uruchomieniu agent ten zostanie automatycznie dodany do kolejki i jego status będzie zachowany.
Astdb to baza danych wbudowana w system telefoniczny Asterisk. Jest ona używana do przechowywania różnych informacji związanych z działaniem systemu, takich jak: - konfiguracja systemu (np. numery SIP, hasła, numery kanałów) - konfiguracja aplikacji (np. nazwy kontekstów, nazwy plików dźwiękowych) Stany połączeń (np. ID połączenia, numer dzwoniącego, numer odbierającego, czas rozpoczęcia połączenia, czas trwania połączenia) Astdb może być wykorzystywana przez różne moduły i aplikacje w Asterisku, na przykład: - moduł app_queue wykorzystuje astdb do przechowywania informacji o statusie kolejek - moduł CEL (Call Event Logging) wykorzystuje astdb do przechowywania informacji o zdarzeniach związanych z połączeniami
autofill
na "yes"
oznacza, że oczekujący rozmówcy będą łączyć się z dostępnymi członkami kolejki w sposób równoległy, dopóki nie będzie już dostępnych członków lub oczekujących rozmówców. Jest to bardziej oczekiwane działanie kolejki niż domyślna wartość
"no"
dlatego koniecznie trzeba ja przestawić. Inaczej kolejka sprawi, że wszyscy oczekujący dzwoniący będą czekać w kolejce, nawet jeśli jest więcej niż jeden dostępny członek gotowy do odbierania połączeń, dopóki główny rozmówca nie zostanie połączony z członkiem kolejki, do którego próbował się dostać. Następny oczekujący dzwoniący w kolejce staje się głównym dzwoniącym, a następnie jest łączony z następnym dostępnym członkiem, a wszyscy dostępni członkowie i oczekujący dzwoniący czekają, aż to się stanie.
shared_lastcall = yes
sprawi, że informacje o ostatnim odebranym połączeniu będą przekazywane między kolejkami w których jest w tym momencie zalogowany dany agent. Jest to przydatna funkcja jeżeli zależy nam na tym, aby dany agent miał w każdej kolejce respektowany Wrap-up time
niezależnie gdzie odebrał połączenie. Domyślnie
ustawiona jest na "no"
Wrap-up time to czas, który pracownik centrum obsługi klienta potrzebuje po zakończeniu rozmowy z klientem, aby zakończyć wszystkie niezbędne zadania połączone z tą rozmową, takie jak wprowadzenie notatek, aktualizacja systemów lub przygotowanie raportów. Czas ten jest potrzebny, aby umożliwić pracownikowi przejście do następnej rozmowy, a także zapewnić, że wszystkie informacje związane z poprzednią rozmową zostały poprawnie zapisane i przetworzone. Długość czasu potrzebnego na wrap-up time może się różnić w zależności od specyfikacji zadania, standardów jakości pracy i branży, w której działa firma.
monitor-type = MixMonitor
to jedyny obecnie obsługiwany wariant monitor-type
. Ponieważ MixMonitor
domyślnie miksuje dźwięk, używanie parametrów „joining/mixing” dla plików wejściowych/wyjściowych nie jest konieczne.
1b) sekcja kolejki
[queue_1] ; queue_1 - Kolejka testowa
strategy=ringall
context=default
leavewhenempty=unavailable
joinempty=paused
timeout = 15
retry=1
wrapuptime = 5
autopause = yes
autopausebusy = yes
musicclass=default
announce-position=yes
announce-position-limit = 5
announce-holdtime=yes
announce-frequency=15
reportholdtime=no
periodic-announce=recordings/wav/annoucement
periodic-announce-frequency=15
member => SIP/101,,,,no,20
member => SIP/102,,,,no
queue_1
Ilość opcji konfiguracyjnych jest bardzo duża. My skupimy się na kilku najbardziej istotnych i najczęściej wykorzystywanych.
Opcja strategy
określa sposób przydziału przychodzących połączeń do kolejki między agentów. Możliwe są następujące strategie
ringall
– dzwoni jednocześnie do wszystkich dostępnych agentów, aż jeden z nich odbierze (opcja domyślna)leastrecent
– dzwoni do agenta, który jako ostatni zakończył połączeniefewestcalls
– dzwoni do agenta, który ma najmniej odebranych połączeń w tej kolejcerandom
– przydziela połączenia wybierając agentów losoworrmemory
– (Round-Robin Memory): połączenia są rozdzielane między agentów w kolejce w sposób równy, niezależnie od ich obciążenia. Asterisk zapamiętuje informacje o tym, który agent był ostatnio używany, i następne połączenie zostaje przekazane do kolejnego agenta. Zachowana jest kolejność członków kolejki wynikająca z pliku konfiguracyjnegorrordered
– (Round-Robin Ordered) podobnie corrmemory
, z tą różnicą, że połączenia są rozdzielane w sposób równy, ale uwzględniający również obciążenie agentów. Asterisk śledzi, który agent był ostatnio używany i przekierowuje następne połączenie do najmniej obciążonego agenta w kolejce. Dzięki temu strategia rrordered pozwala na bardziej równomierne rozłożenie obciążenia wśród agentów.linear
– dzwoni do agentów w kolejności określonej w tym pliku konfiguracyjnym. W przypadku korzystania z agentów dynamicznych, będą oni wybierani w kolejności, w jakiej zostali dodaniwrandom
– dzwoni do losowo wybranego agenta, ale używa parametrupenalty
, przypisanego do agenta, jako wagi podczas obliczania jego pozycji w kolejce.
Najczęściej nasi klienci korzystają ze strategii ringall, leastrecent lub fewestcalls
Parametr "penalty" określa priorytet (wagi) agenta w kolejce. Im niższa wartość "penalty", tym wyższy priorytet ma dany agent. Oznacza to, że agent z niższą wartością "penalty" będzie miał większą szansę na otrzymanie połączenia niż agent z wyższą wartością "penalty". Domyślnie, wartość "penalty" dla każdego agenta w kolejce jest ustawiona na 0. Można jednak ręcznie zmienić tę wartość dla konkretnych agentów, aby dostosować priorytety w kolejce do indywidualnych potrzeb. Przykładowo, gdy jeden z agentów w kolejce jest lepiej przeszkolony w danym produkcie lub usłudze niż inni, można mu przypisać niższą wartość "penalty", aby miał większą szansę na obsłużenie połączenia dotyczącego tego produktu lub usługi. Warto zauważyć, że parametr "penalty" nie działa w izolacji, ale współpracuje z innymi parametrami konfiguracyjnymi kolejki, takimi jak "ring strategy", "timeout" czy "wrap-up time". Wspólnie te parametry pozwalają na dostosowanie procesu obsługi połączeń do indywidualnych potrzeb i preferencji wewnątrz firmy lub organizacji.
context
pozwala na usunięcie połączenia z kolejki i przekierowanie połączenia bezpośrednio na numer wewnętrzny pasujący do określonego tym konkretnym kontekście.
joinempty
, gdy dzwoniący próbuje wejść do kolejki, sprawdzani są członkowie tej kolejki. Jeśli wszyscy agenci zostaną uznani za niedostępnych z powodu któregokolwiek z warunków wymienionych dla tej opcji, dzwoniący nie będzie mógł wejść do kolejki. Dla opcji leavewhenempty
stan członków kolejki sprawdzany jest okresowo podczas przebywania dzwoniącego w kolejce. Jeśli wszyscy agenci są niedostępni z powodu któregokolwiek z warunków wymienionych dla tej kolejki, dzwoniący zostanie usunięty z kolejki. timeout
odnosi się do czasu oczekiwania na odpowiedź agenta. Jeśli agent nie odbierze połączenia w określonym czasie, połączenie zostanie przekazane do kolejnego agenta.
Opcja retry
mówi po ilu sekundach nastąpi próba ponownego połączenia do agenta, który wcześniej nie odebrał połączenia z kolejki.
wrapuptime
określa czas jaki ma agent na zakończenie obsługi połączenia po rozłączeniu się klientem. Po tym czasie kolejka zobaczy agenta jako gotowego do odebrania kolejnej rozmowy.
autopause = yes
powoduje zmianę statusu z gotowy na pauza dla agenta który nie odbierze połączenia. Natomiast autopausebusy = yes
też zmieni status agenta na pauza gdy urządzenie na którym jest zalogowany agent ma status zajętości w sytuacji gdy agent nie odbierze połączenia.
musicclass
określa, która klasa zapowiedzi ma zastosowanie do tej konkretnej kolejki połączeń. Jedyną klasą, która może zastąpić tę klasę jest ustawienie klasy MOH
za pomocą opcji m
podczas wywoływania aplikacji Queue lub ustawienie bezpośrednio na kanale za pomocą Set(CHANNEL(musicclass)=moje_nagranie)
w dialplanie
Klasa MOH odnosi się do funkcjonalności, która umożliwia odtwarzanie muzyki na czekanie (MOH - Music On Hold) dla osoby, która oczekuje na połączenie w kolejce. Wtedy zamiast słyszeć dźwięk sygnalizujący zajętość linii, może usłyszeć muzykę na czekanie, co jest bardziej przyjemne dla użytkownika. Klasa MOH w Asterisk pozwala na wybór i konfigurację różnych źródeł muzyki na czekanie, takich jak pliki dźwiękowe w formacie WAV lub MP3. Możliwe jest również skonfigurowanie określonej muzyki na czekanie dla określonych zdarzeń lub kanałów, co pozwala na spersonalizowane informacji i wrażeń odbieranych przez oczekującego na połączenie.
announce-position = yes
spowoduje, że klient oczekujący w kolejce usłyszy informacje o tym jaką pozycję zajmuje w oczekiwaniu na odebranie połączenia. Gdy wartość tej opcji będzie równa „more
” klient otrzyma informację o tym, że oczekuje więcej połączeń niż określony limit. Jest on określony w opcji announce-position-limit
. Można wymusić podanie tylko pojedynczej informacji o położeniu w kolejce ustawiając wartość announce-position = limit
Wówczas informacja zostanie podana wtedy gdy klient osiągnie pozycję określoną w opcji announce-position-limit
announce-holdtime
odpowiada za podawanie oczekującym klientom szacunkowego czasu oczekiwania. Może przybierać wartości: „yes”, „no” albo „once”. Czas oczekiwania dla tej ostatniej wartości zostanie podany tylko raz.
announce-frequency
określa co ile sekund będzie odtwarzana informacja o pozycji w kolejce lub o szacunkowym czasie oczekiwania.
reportholdtime=no
spowoduje, że agent tuż przed zestawieniem komunikacji, nie otrzyma informacji ile czasu klient czekał na połączenie
periodic-announce
określa nazwę pliku dźwiękowego zawierającego dodatkową informację odtwarzaną cyklicznie klientowi w czasie oczekiwania w kolejce. Czas powtórzenia jest określony przez opcję periodic-announce-frequency
2) Agenci statyczni
Wpisy zaczynające się od słowa kluczowego member
wskazują nam którzy agenci są przypisani do kolejki na stałe.
W tym konkretnym przypadku mamy przypisanych na stałe dwóch agentów, zdefiniowanych jako 101 i 102 w pliku konfiguracyjnym sip.conf
. Jeżeli chcielibyśmy dodać kolejnych agentów na stałe lub jakichś usunąć z kolejki należy dokonać w tym miejscu ręcznej edycji.
member => SIP/101,,,,no,20
member => SIP/102,,,,no
Pełna składnia wpisu member
jest następująca:
member => interface,[,penalty][,membername][,state_interface][,ringinuse][,wrapuptime]
interface
– określa, który interfejs będzie używany dla tego członka kolejki. Interfejs może być zdefiniowany jako numer telefonu, SIP URI lub inny identyfikator protokołu.penalty
– opcjonalny argument, który określa, jak bardzo agent ma być „ukarany”, jeśli nie odbierze połączenia z kolejki. Im wyższa wartość, tym mniej prawdopodobne, że agent otrzyma następne połączenie z kolejki.membername
– opcjonalny argument, który pozwala nazwać agenta lub interfejs, co ułatwia identyfikację agenta w logach lub raportach.state_interface
– opcjonalny argument, który pozwala określić inny interfejs, którego stan również zostanie zmieniony, gdy agent zostanie dodany do kolejki lub odbierze połączenie.ringinuse
– opcjonalny argument, który określa, czy połączenia będą kierowane do agentów, którzy już mają aktywne połączenia. Jeśli ustawiono tę wartość nayes
, połączenia będą kierowane tylko do agentów, którzy nie są zajęci.wrapuptime
– opcjonalny argument, który określa, jak długo agent powinien pozostać w stanieWrap-up
po zakończeniu połączenia. StanWrap-up
pozwala agentowi na zakończenie pracy z poprzednim klientem i przygotowanie się do obsługi kolejnego połączenia.
member => SIP/101,,,,no,20
– oznacza, że interfejs SIP o nazwie „101” będzie używany jako agent kolejki, z domyślnymi parametrami poprzedzającymi opcję ringinuse, która jest tu ustawiona na „no”. Oczywiście opcję te można było ustawić dla całej kolejki ale jak widać można ją ustawić dla każdego agenta oddzielnie. Tak samo ostatnia wartość wrapuptime ustawiona na 20, dla tego konkretnego agenta, nadpisze globalną wartość dla całej kolejki z naszego przykładu ustawioną na 5 3) Agenci dynamiczni
Aby umożliwić korzystanie z agentów dynamicznym musimy dodatkowo zmodyfikować dialplan. W pliku extensions.conf
dodajemy sekcję odpowiedzialną za przypisywanie agentów dynamicznych do określonej kolejki i restartujemy dialplan
nano /etc/asterisk/extensions.conf
[queue_dynamic_agents]
exten => _*1*X!,1,NoOp(Dynamic agent request)
same => n,Set(sip=SIP/${CUT(CUT(SIP_HEADER(From),@,1),:,2)})
same => n,Set(queue=queue_${EXTEN:3})
same => n,AddQueueMember(${queue},${sip})
same => n,NoOp(Request status: ${AQMSTATUS})
same => n,GotoIf($["${AQMSTATUS}"="ADDED"]?added:)
same => n,GotoIf($["${AQMSTATUS}"="MEMBERALREADY"]?memberalready:)
same => n,GotoIf($["${AQMSTATUS}"="NOSUCHQUEUE"]?nosuchqueue:)
same => n(added),Playback(agent-loginok)
same => n,Goto(hangup)
same => n(memberalready),RemoveQueueMember(${queue},${sip})
same => n,Playback(agent-loggedoff)
same => n,Goto(hangup)
same => n(nosuchqueue),Playback(invalid)
same => n,Goto(hangup)
same => n(hangup),Hangup()
asterisk -x 'dialplan reload'
Dzięki takiej konfiguracji, wybierając na aparacie agenta konfigurację klawiszy *1*<numer kolejki>
dołączymy tego agenta dynamicznie do wskazanej kolejki. Wciskając ponownie tą kombinację klawiszy agent opuści kolejkę. Odpowiedzialne są za to funkcje AddQueueMember
i RemoveQueueMember
. Jeżeli wszystko zrobimy poprawnie usłyszymy komunikat agent-loginok
. Dodatkowo jeżeli pomylona zostanie nazwa kolejki otrzymamy komunikat invalid
.
4) Aplikacja Queue
Oczywiście, żadne połączenie nie trafiłoby do kolejki jeżeli go tam nie skierujemy. Odpowiada za to aplikacja Queue wywoływana z dialplanu. Przykładowa sekcja w naszym pliku extensions.conf
może wyglądać następująco
nano /etc/asterisk/extensions.conf
exten => mój_extension,1,NoOp(Call from ${CALLERID(num)} to ${EXTEN})
same => n,Answer(1)
same => n,Queue(queue_1)
same => n,Hangup()
asterisk -rv
core show application queue
Oto niektóre opcje, które można wykorzystać w komendzie Queue w extensions.conf
:
- timeout: Ustawia czas oczekiwania dla każdego połączenia w kolejce przed przekazaniem go do następnego agenta. Przykład: Queue(myqueue,t,,,30)
- musicclass: Ustawia muzykę oczekiwania dla połączeń w kolejce. Przykład: Queue(myqueue,t,default)
- maxlen: Ustawia maksymalną długość kolejki – gdy kolejka osiągnie tę wartość, nowe połączenia zostaną odrzucone. Przykład: Queue(myqueue,t,,,10)
- announce: Ustawia nagłos, który będzie odtwarzany klientowi, zanim zostanie przekierowany do kolejki. Przykład: Queue(myqueue,t,,”Dziękujemy za oczekiwanie”)
- monitor-format: Ustawia format nagrywania połączeń w kolejce. Przykład: Queue(myqueue,t,,,m(ulaw))
Uwaga: Powyższe przykłady są tylko demonstracją i mogą się różnić w zależności od konkretnej implementacji w danym systemie Asterisk.
Pełna składnia polecenia Queue jest poniżej
Queue(queuename[,options[,URL[,filename[&filename2[&...]][,timeout[,AGI[,macro[,gosub[,rule[,position]]]]]]]]])
Szczegółowy opis poszczególnych opcji jest w dokumentacji asteriska
Jeżeli chciałbyś monitorować wszystko co dzieje się na Twojej centrali wypróbuj nasze autorskie oprogramowanie VOIPERO
System niedawno wystartował i teraz jest udostępniany całkowicie za darmo. Instalacja i konfiguracja zajmuje kilka minut
Dowiedz się jakie możliwości ma system VOIPERO jeżeli chodzi o raportowanie i monitorowanie na żywo systemów VoIP bazujących na asterisku.
Oczywiście potrafi też udostepniać informacje na temat kolejek!