Szukaj

Konfiguracja kolejek w Asterisku

Konfiguracja kolejek w Asterisku

Jeżeli masz zainstalowanego Asteriska, to pewnie warto uruchomić i skonfigurować dodatkowe funkcjonalności takie jak obsługa kolejek. W takich systemach jak FreePBX czy Issabel wystarczy użyć gotowego przycisku i sprawa załatwiona. Okazuje się, że nie jest to dużo trudniejsze, jeżeli chciałbyś to zrobić sam od podstaw. Ten artykuł pokaże Ci jak dodać kolejki a do nich agentów statycznych i dynamicznych oraz pomoże Ci wybrać najbardziej przydatne opcje.

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

Ustawienia globalne znajdziemy w sekcji general. Przykładowa sekcja general naszego pliku konfiguracyjnego queues.conf dla systemu Asterisk może wyglądać następująco:
				
					[general]
persistentmembers = yes
autofill = yes
shared_lastcall=yes
monitor-type = MixMonitor


				
			
Ustawienie 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

Ustawienie opcji 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.
Opcja 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.

Opcja 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

Każda kolejna sekcja będzie już traktowana jak nazwa kolejki. Przykładowa konfiguracja kolejki dla systemu Asterisk może wyglądać następująco:
				
					[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
				
			
W nawiasach kwadratowych mamy nazwę sekcji będącą jednocześnie unikalną nazwą kolejki, w naszym przykładzie to 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łączenie
  • fewestcalls – dzwoni do agenta, który ma najmniej odebranych połączeń w tej kolejce
  • random – przydziela połączenia wybierając agentów losowo
  • rrmemory – (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 konfiguracyjnego
  • rrordered – (Round-Robin Ordered) podobnie co rrmemory, 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 dodani
  • wrandom – dzwoni do losowo wybranego agenta, ale używa parametru penalty, 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.

Opcja 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.
W przypadku opcji 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.
Opcja 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.
Opcja 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.
Opcja 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.
Opcja 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.

Opcja 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
Opcja 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.
Opcja announce-frequency określa co ile sekund będzie odtwarzana informacja o pozycji w kolejce lub o szacunkowym czasie oczekiwania.
Opcja reportholdtime=no spowoduje, że agent tuż przed zestawieniem komunikacji, nie otrzyma informacji ile czasu klient czekał na połączenie
Opcja 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
Omówmy teraz sposób przypisania agentów do kolejki. Możemy zrobić to na dwa sposoby: przypisując agentów statycznych lub dołączając agentów dynamicznie.

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]
				
			
Oto co oznaczają poszczególne argumenty:
  • 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ść na yes, 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 stanie Wrap-up po zakończeniu połączenia. Stan Wrap-up pozwala agentowi na zakończenie pracy z poprzednim klientem i przygotowanie się do obsługi kolejnego połączenia.
Przykładowe użycie: 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 AddQueueMemberRemoveQueueMember. 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()

				
			
Tutaj widzimy wywołanie aplikacji właściwie tylko z jednym parametrem, nazwą kolejki. Jednak na tym poziomie można dołączyć wiele parametrów konfiguracyjnych. Pełny ich opis można uzyskać wchodząc do konsoli asterisk i wywołując polecenie pokazujące nam istniejące opcje.
				
					asterisk -rv
core show application queue

				
			

Oto niektóre opcje, które można wykorzystać w komendzie Queue w extensions.conf:  

  1. timeout: Ustawia czas oczekiwania dla każdego połączenia w kolejce przed przekazaniem go do następnego agenta. Przykład: Queue(myqueue,t,,,30)
  2. musicclass: Ustawia muzykę oczekiwania dla połączeń w kolejce. Przykład: Queue(myqueue,t,default)
  3. maxlen: Ustawia maksymalną długość kolejki – gdy kolejka osiągnie tę wartość, nowe połączenia zostaną odrzucone. Przykład: Queue(myqueue,t,,,10)
  4. announce: Ustawia nagłos, który będzie odtwarzany klientowi, zanim zostanie przekierowany do kolejki. Przykład: Queue(myqueue,t,,”Dziękujemy za oczekiwanie”)
  5. 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

Jak widać zarówno proste jak i bardziej zaawansowane funkcje dotyczące kolejek nie mają już przed nami tajemnic. Zapraszam do śledzenia naszego bloga.

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!

Share this post

Masz pytania lub potrzebujesz oferty?

Skontaktuj się z naszym doradcą.

Popularne wpisy

Powiązane posty

Projekt wystartował!

Monitorowanie i raportowanie Twojego serwera VoIP