Asterisk a obsluha stisku tlačítek (DTMF) v průběhu hovoru

Následující text popíše základní a některé další pokročilejší způsoby obsluhy stisku tlačítek (tóny DTMF) Asteriskem v průběhu probíhajícího hovoru. Předpokladem experimentování s dále uváděnými příklady konfigurací je existence vlastní VoIP ústředny Asterisk 1.8, např. na http://www.4smart.cz bez webového rozhraní (FreePBX, …) s fungujícím nastavením alespoň pro koncové VoIP telefony (sip.conf) a dialplánem (extensions.conf). Pozn. Návody pro základní nastavení Asterisku bez www rozhraní naleznete také zde na http://wiki.4smart.cz.

Základní možnosti obsluhy DTMF příkazem Dial()

Příkaz Dial(), používaný v dialplánu Asterisku (extensions.conf), slouží k vytvoření telefonického spojení. Základní podoba tohoto příkazu může vypadat například takto pro volání extension (telefonu) s číslem 102:

Dial(SIP/102)

Nebo pro volání vytočeného čísla ${EXTEN} přes trunk odorik definovaný v sip.conf.

Dial(SIP/${EXTEN}@odorik)

Kromě výše uvedeného lze příkazu Dial() zadat ještě různé parametry. Mezi ty významné z pohledu DTMF patří parametry:

  • h,H, které umožňují volanému, volajícímu zavěsit probíhající hovor - ve výchozím nastavení stiskem * ,
  • t,T, které dovolují volajícímu, volanému přepojit hovor jinam a dále - ve výchozím nastavení stiskem #
  • x,X, případně w,W pro zahájení nahrávání hovoru (v tom prvním případě s použitím automixer, kdy jsou v jednom souboru nahrávky zaznamenány všichni účastníci hovoru).

Lze tedy zapsat například následující, přičemž je třeba dodržet syntaxi příkazu Dial() a definovat ještě hodnotu timeout - čas v sekundách, po který se bude příkaz Dial() snažit navázat spojení:

Dial(SIP/102,30,tThHxX)

Nastavení vlastního mapování pro obsluhu DTMF základních funkcí příkazu Dial()

Ne každému, kdo se rozhodne tyto základní funkce obsluhy DTMF příkazu Dial() využívat, může vyhovovat základní mapování na klávesy *, #, apod. V adresáři, kde se nacházejí konfigurační soubory Asterisku, obvykle /etc/asterisk, proto vytvoříme čistý soubor features.conf. V souboru features.conf nyní definujeme sekci featuremap a předefinujeme volby pro nahrávání hovoru na stisk '*33' a přepojení hovoru na stisk '*44':

[featuremap]
disconnect => *22
automixmon => *33
blindxfer => *44

Nesmíme přitom zapomenout redefinovat také výchozí volbu pro zavěšení '*'. Stisk hvězdy totiž ve výchozím nastavení vede k zavěšení hovoru, resp. pouze v případě, kdy v dialplánu ve funkci Dial() nastavujeme parametry 'hH'. Proto by všechny jinak definované volby začínající '*' neměly efekt. Funkci pro zavěšení proto přenastavujeme na volbu '*22'.

Definice vlastních aplikací, přesahujících možnosti parametrů funkce Dial()

Jak je z textu výše patrné, omezuje funkce Dial() obsluhu DTMF pouze na několik základních funkcí - nahrávání hovoru, zavěšení, přepojení, což může být nedostačující. Doplněním sekce applicationmap do souboru features.conf je možně definovat vlastní aplikace (v kontextu dokumentace Asterisku označované jako dynamické vlastnosti), které budou provedeny v reakcích na nastavené DTMF volby. Základní podmínkou pro provádění těchto aplikací je probíhající hovor. Zadáním DTMF volby v situaci, kdy druhá strana teprve vyzvání, nebude mít za následek vykonání odpovídající aplikace.

Nastavení v sekci applicationmap v souboru features.conf může vypadat například takto:

...
[applicationmap]
testfeature => #9,peer,Playback,tt-monkeys
...

Nejprve se zaměřme na syntaxi a sémantiku zápisu těchto dynamických vlastností, která je podstatná k jejímu pochopení (následuje rozšířený překlad z dokumentace Asterisku):

<název_dynamické_vlastnosti> => <DTMF_sekvence>,<vykonat_na_kanále>[/<lze_aktivovat_kým>],<aplikace_k_vykonání>[,<argumenty_aplikace>[,MOH_třída]]
  • název dynamické vlastnosti - je použitý k nastavení globální proměnné DYNAMIC_FEATURES, jehož uvedení zde povoluje vykonání této aplikace. Globální proměnná DYNAMIC_FEATURES musí být definována v dialplánu před příkazem Dial(), nebo v sekci [globals] a obsahovat názvy těchto dynamických vlastností, je-li jich více, oddělených znakem '#'. Příklad definice v dialplánu před voláním extension 200:
Set(DYNAMIC_FEATURES=hangup#play#testfeature)
Dial(SIP/200)
  • DTMF_sekvence - určuje volbu, tj. kombinaci stisknutých kláves v průběhu hovoru, která má vést k vykonání nastavené aplikace.
  • vykonat_na_kanále - typický hovor dvou účastníků si lze představit jako spojení dvou kanálů (hlas se přenáší jedním směrem i druhým směrem). Možným nastavením je peer, kdy by protistrana v příkladu výše měla slyšet řev opic, nebo self, kdy řev opic uslyší ten, kdo příslušnou DTMF volbu zadal.
  • lze_aktivovat_kým - určuje, kdo tuto volbu smí aktivovat, možnosti jsou volající caller, volaný callee, oba both.
  • aplikace_k_vykonání - představuje aplikaci, podobně jako v dialplánu, např.: Playback, PauseMonitor, atd. Pozor však - nejsou podporovány všechny aplikace, které lze definovat v dialplánu! Je tomu tak proto, že vykonávání těchto dynamických vlastností probíhá jinak, nežli vykonávání aplikací v kontextu dialplánu. Jde především o příkazy určující změnu vykonávání dialplánu (Goto, GoSub, Background, …).
  • argumenty_aplikace - předávané volané aplikaci.
  • MOH_třída - definuje třídu, která určuje, jaká hudba se bude přehrávat, zatímco se bude čekat na dokončení provedení celé dynamické vlastnosti (aplikace).

Příklad z praxe - přepojení obou účastníků obyčejného hovoru do konference ConfBridge stiskem '*1' v průběhu hovoru

Představte si následující situaci: V průběhu hovoru, například s kolegou, zjistíte, že by bylo potřeba do hovoru přizvat ještě jiného kolegu a to tak, aby hovor mohl posléze probíhat za účasti tří účastníků (lze i více). V průběhu hovoru tedy stisknete '*1' a Asterisk zařídí, že druhý (volaný) účastník bude přepojen do konferenční místnosti ID 9000 a následně bude do téže místnosti přepojen i volající. Volající poté může zavěsit a vytočit druhého kolegu, kterého je potřeba přizvat do konference. V momentě, kdy volaný (kolega číslo 2) přijme hovor a volající mu krátce sdělí, o co se jedná, přepne volající i tohoto kolegu stiskem '*1' do konferenční místnosti ID 9000, kde již čeká kolega číslo 1. Přitom Asterisk přepne do této konferenční místnosti i volajícího, takže nyní jsou v konferenci všichni tři účastníci - požadovaný stav.

fetures.conf

[applicationmap]
cnfredirect => *1,self,Macro,redirect-to-conference

Tato dynamická vlastnost zajistí obsluhu v reakci na stisk volby '*1' voláním makra v dialplánu, jehož jméno je redirect-to-conference. Z uvedeného je zřejmé, že kód bude vykonán v kontextu kanálu toho účastníka, který tuto volbu na svém telefonu zadal (self) a dále je zřejmé, že tuto dynamickou vlastnost mohou zahájit oba (výchozí volba both, pokud není uvedeno). Jinými slovy - konferenci nemusí v tomto případě zahájit bezpodmínečně pouze volající, ale i volaný.

extensions.conf

V sekci [global] bude pro jednoduchost nastavena globální proměnná DYNAMIC_FEATURES, která bude povolovat vykonávání dynamické vlastnosti cnfredirect v kontextu celého dialplánu. V praxi se ale může hodit tuto globální proměnnou nastavovat až v průběhu vykonávání dialplánu a omezit tak její použití jen pro vhodné případy.

...
[globals]
__DYNAMIC_FEATURES => cnfredirect
...

Za povšimnutí stojí počet podtržítek na začátku názvu proměnné - dvě podtržítka určují dostupnost těchto dynamických vlastností na obou kanálech spojení. Jinak je dostupnost definovaných dynamických vlastností omezena pouze na původní kanál.

Mějme kontext internal, ve kterém je definována obsluha volání na číslo (extension) 997. Kontext internal bude určen jako výchozi kontext pro vnitřní telefony naší ústředny. Případným voláním kteréhokoliv vnitřního telefonu naší ústředny na 997 dojde k jeho připojení ke konferenci ConfBridge(), do místnosti ID 9000 (což se může také hodit):

...
exten => 997,1,Answer()
exten => 997,n,ConfBridge(9000,cM(default)s)
exten => 997,n,Playback(vm-goodbye)
exten => 997,n,Hangup()
...

Volání aplikace ConfBridge obsahuje přednastavené ID konferenční místnosti, kam bude hovor spojen, parametr 'c' povoluje oznamování počtu účastníků v místnosti, parametr 'M(default)' definuje třídu Music On Hold pro přehrávání hudby v situaci, kdy je v místnosti jediný účastník, 's' povoluje konferenční menu dostupné pod stiskem '*' - nezávislé na nastavení features.conf.

A zbývá definovat makro redirect-to-conference, které má být voláno v případě stisku '*1' (makro definujeme podobně, jako kontext):

...
[macro-redirect-to-conference]
exten => s,1,Noop(Prepojuji peera ${BRIDGEPEER} do konference)
exten => s,n,ChannelRedirect(${BRIDGEPEER},internal,997,1)
exten => s,n,Noop(Prepojuji sebe ${CHANNEL} do konference)
exten => s,n,ChannelRedirect(${CHANNEL},internal,997,1)
...

Jak je vidět, makro provede volání aplikace ChannelRedirect(). Dojde tak k rozpojení kanálů mezi původními účastníky hovoru. Nejprve je přesměrován kanál volaného (proměnná ${BRIDGEPEER}) do kontextu internal, extension 997, priorita 1. Následuje přesměrování kanálu volajícího - do stejného kontextu, extension, priority. Hovor pak pokračuje v konferenci, a pokud tuto konferenci některý z účastníků opustí, ostatní v ní nadále zůstávají, hovor není ukončen. Uvedený postup pak lze opakovat a konferenci dál rozšířit o další účastníky hovoru.

 
asterisk-obsluha-dtmf-v-prubehu-hovoru.txt · Poslední úprava: 2015/08/20 15:35 autor: misa