Analogová telefonní karta v IP ústředně Asterisk Jan Gaura, Tomáš Hrabálek 25.1.2007 Semestrální projekt do předmětu: Technologie počítačových sítí
Úvod Přenos hlasu je neodmyslitelnou součástí dnešního světa. V době snižování nákladů se začíná přecházet od tradičního analogového způsobu přenosu hlasu na přenos digitální v IP sítích. Tento přechod však není možné provézt skokově a proto po poměrně dlouhou dobu budou digitání a analogové systémy koexistovat. Příklad takovéhoto soužití je předmětem tohoto projektu. Ukážeme si, jak propojit stávajicí analogovou sít s digitální ústřednou Asterisk a navíc jak připojit analogový a SIP telefon. Ústředna Asterisk Asterisk je IP pobočková telefonní ústředna určená pro přenos hlasu po různých druzích sítí. Ústředna je schopna konvertovat hlas z různých druhů zdrojů (analogový telefon, ISDN telefon, atd.) na jiné. Nesmírnou výhodou Asterisku je volná dostupnost zdrojového kódu pod svobodnou licencí (open source). Ústředna je zdarma ke stažení na Internetu z http://www.asterisk.org. Asterisk pracuje na platformě GNU/Linux. Postupně si popíšeme, jak Asterisk nainstalovat a nakonfigurovat pro potřeby projektu. Testovací zapojení je uvedeno na obrazku [1]. Obrázek 1: Testovací zapojení Analogová karta TDM400P Pro připojení Asterisku k analogové síti a analogovému telefonu byla použita karta Digium TDM400P. Tato karta je běžně dostupná v obchodech českého internetu. Karta je vyobrazena na obrázku [2]. Karta disponuje 4 sloty, které mohou být osazeny dle potřeby bud FXS nebo FXO moduly. FXS modul slouží pro připojení analogového telefonu, dodává mu napájení a provádí 2
Obrázek 2: Analogová karta Digium TDM400P vyzvánění. FXO modul se používá k připojení k jiné (analogové) pobočkové ústředně, popřípadě k připojení přímo do analogové veřejné telefonní sítě. Naše karta disponuje jedním FXS modulem ve slotu 1 a jedním FXO modulem ve slotu 2. Je důležité vědět umístění modulů pro pozdější konfiguraci Asterisku. V případě zapomenutí umístění modulů se však neděje nic tragického. Modul jádra operačního systému, který přímo ovládá kartu, nahlásí chybnou konfiguraci a odmítne se nahrát do paměti. Instalace ústředny Asterisk V projektu byl použit Asterisk verze 1.4.0. Vzhledem k tomu, že tato verze byla vydána velmi nedávno (leden 2007), není obsažena jako balíček v distribuci Debian GNU/Linux Sarge. Z tohoto důvodu provedeme instalaci ze zdrojových kódů. Z http://ftp1.digium.com/pub/ stáhneme následující archivy: libpri-1.4.0.tar.gz zaptel-1.4.0.tar.gz asterisk-1.4.0.tar.gz asterisk-addons-1.4.0.tar.gz Jednotlivé součásti zkompilujeme a nainstalujeme v takovém pořadí, v jakém jsou výše zmíněny. Kompilaci a instalaci každého archivu provedeme takto: $./configure $make 3
#make install Nyní bychom již měli mít Asterisk nainstalován. Asterisk můžeme interaktivně ovládat pomocí prostředí CLI. Do tohoto prostředí se dostaneme spuštěním Asterisku s parametrem -c, tedy #asterisk -c. Pokud nám již Asterisk běží na pozadí jako démon, můžeme se k němu připojit tak, že spustíme asterisk s parametrem -r, tedy #asterisk -rc. Konfigurace ústředny Asterisk Konfigurace ústředny se provádí prostřednictvím souborů v adresáři /etc. Nejprve je třeba nakonfigurovat analogovou kartu, tedy určit, které sloty jsou osazeny moduly a jakými. Toto provedeme v souboru /etc/zaptel.conf přídáním řádků: fxoks = 1 fxsks = 2 V tomto souboru přiřazujeme jednotlivým slotům (a jim přislušným modulům) signalizaci. Signalizace je však opačná, než je určení modulu! Tedy například pro modul FXO je signalizace fxsks, ponevadž do FXO modulu může přijít vyzváněcí signál z jiné ústředny a tedy se FXO modul chová jako telefon, který požívá signalizaci FXS. Proto tedy FXO modul, který je umístěn ve slotu 2, bude mít signalizaci fxsks. Další konfiguraci provedeme v souboru /etc/asterisk/zapata.conf: [channels] context=internal usecallerid=yes hidecallerid=no signalling=fxo ks echocancel=yes echotraining=yes busydetect=yes channel=>1 context=incoming signalling=fxs ks channel=>2 Zde určíme jednotlivé kontexty pro hovory ústředny. Kontext internal bude sloužit pro hovory odchozí z ústředny. Podobně kontext incoming slouží pro hovory přicházející do 4
ústředny. Proberme si nyní jednotlivé položky: Sekce [channels] - slouží k určení signalizace a parametrů pro hardwarové kanály. context=internal - definujeme kontext, pro který provedeme nastavení, která jsou uvedena níže. Pro nás je toto interní kontext s analogovým telefonem. usecallerid=yes - každý uživatel bude poskytovat (vysílat) své telefonní číslo volanému. hidecallerid=no - určuje, že identifikátor uživatele nebude skryt při odchozím volání. signalling=fxo ks - určuje použití signalizace fxo ks pro telefonní přístroj. echocancel=yes - ústředna bude eliminovat zpětnou vazbu v hlasové komunikaci, tedy aby uživatel neslyšel sám sebe. echotraining=yes - po zvednutí sluchátka si ústředna sama zjistí, jaké jsou podmínky na dané lince vysláním jednoduchého signálu. Podle toho bude posléze upravovat zpětnou vazbu. channel=>1 - vsechny příkazy, které předcházejí tomuto příkazu, se budou aplikovat na kanál 1. context=incoming - definice příchozího kontextu (směrem do pobočky) s FXO modulem. signalling=fxs ks - definice signalizace fxs ks na FXO modulu. channel=>2 - říká, že nastavení platí pro kanaál 2. Dále vytvoříme číslovací plán (Dial plan) v souboru /etc/asterisk/extensions.conf. Tento soubor je svázán s definicemi kontextů v souboru /etc/asterisk/zapata.conf tak, že každý kontext v něm definovaný má nadefinován číslovací plán v /etc/asterisk/extensions.conf. Podívejme se nyní na naši konfiguraci (čísla viz. obrázek [1]): [internal] exten => 611,1,Echo() exten => 611,2,Hangup() ; calling external line on ATEL exten => 26,1,Dial(Zap/2/26) exten => 26,2,Hangup() ;SIP cislo 300 5
exten => 300,1,Dial(SIP/300) exten => 300,2,Hangup() exten => 400,1,Dial(Zap/1) exten => 400,2,Hangup() [incoming] exten => 400,1,Dial(Zap/1) exten => 400,2,Hangup() exten => 300,1,Dial(SIP/300) exten => 300,2,Hangup() Číslovací plán pro jednotlivé kontexty uvedeme jménem kontextu v hranatých závorkých. V našem případě tedy [internal] a [incoming]. Formát příkazů je následující: exten => číslo,priorita,funkce Naší konfiguraci postupně projdeme: exten => 611,1,Echo() exten => 611,2,Hangup() Na telefonní číslo 611 jsme přiřadili funkci Echo(). Tato funkce pracuje jednoduše tak, že přesměrovává vstup na výstup. Uživatel tak slyší sám sebe. Tato funkce je hojně využívána operatory jako test spojení pro klienty. Po ukončení hovoru je třeba linku zavěsit a tím ukončit hovor ze strany ústředny. Toto provedeme přiřazením funkce Hangup(). Funkci Hangup() použijeme u všech telefonních čísel. exten => 26,1,Dial(Zap/2/26) exten => 26,2,Hangup() Telefonnímu číslu 26 jsme přiřadili funkci Dial(). Tato funkce provede volání tam, kde ukazuje její parametr. V našem případě tedy chceme volat číslo 26, které je umístěno na analogové pobočkové ústředně ATEL, která je do Asterisku připojena na FXO kanál, který má číslo 2. Podívejme se však na parametr funkce Dial() podrobněji. Pokud uživatel analogového telefonu připojeného k Asterisku nebo uživatel pripojený protokolem SIP vytočí číslo 26, Asterisk zvedne FXO kanál (Zap/2, kanál pro odchozí volání) a na něm vytočí číslo 26. Tato operace se volajícímu jeví, jako by byl přímo připojeni k ústředně ATEL. exten => 300,1,Dial(SIP/300) exten => 300,2,Hangup() 6
Číslu 300 jsme přiřadili uživatele připojeného protokolem SIP s číslem 300. Na tomto místě je vhodné zmínit, že uživatelé připojeni prostřednictvím SIP protokolu mohou mít též čísla v podobě alfanumeriských znaků. exten => 400,1,Dial(Zap/1) exten => 400,2,Hangup() Analogovém telefonu připojenému do Asterisku jsme přiřadili číslo 400. Pokud tedy přijde na Asterisk požadavek o volání na číslo 400, Asterisk bude signalizovat zvonění na kanál FXS. Pro kontex [incoming], který je definován na FXO kanále, je tato konfigurace: [incoming] exten => 400,1,Dial(Zap/1) exten => 400,2,Hangup() exten => 300,1,Dial(SIP/300) exten => 300,2,Hangup() V tomto kontextu jsou zpracována volaná čísla, která přicházejí na Asterisk z analogové ústředny ATEL. Asterisk a ATEL jsou spojeni linkou s číslem 25. Volající, který je připojen v ATELu, tedy nejprve vytočí číslo 25, čímž se dovolá na Asterisk. Dále pak vytočí požadované číslo účastníka (v našem případě tedy číslo 300 nebo 400). Tato čísla jsou zpracována ve formě DTMF signálů, které volajíci zadá po dovolání se na Asterisk, který DTMF signalizaci rozpozná. Parametry příkazu by již čtenáři měly být dostatečně známy z předchozího textu. Konfigurace SIP Konfigurace SIP protokolu se provádí v souboru /etc/asterisk/sip.conf. [300] type=friend secret=300 qualify=yes nat=no host=dynamic canreinvite=no context=internal 7
Jednotlivé řádky si opět podrobněji probereme: [300] - jméno klienta. V tomto případě je to číslo 300, ale můžeme použít i textový řetezec. type=friend - klient bude moci hovory přijímat i uskutečnovat. secret=300 - heslo, které klient zadáva pro přihlášení k ústředně. qualify=yes - Asterisk zjisti jaké je zpoždění na lince ke klientovi. Automaticky je toto zpoždění nastaveno na 2 sekundy. Pokud je zpoždění vetší, klientovi nebude umožněno přihlášení. Změnu času zpoždění můžeme provezt zadáním času v milisekundách, tedy např. qualify=1000. nat=no - klient nebude operovat za NAT/PAT. host=dynamic - klient bude moci mít jakoukoli IP adresu. canreinvite=no - klient nebude moci měnit parametry probíhajíciho hovoru. Díky tomu bude Asterisk poslouchat probíhající hovor a tak v případě potřeby například obsloužit DTMF signály. context=internal - přiřazení klienta do kontextu internal. Závěr V tomto projektu jsme porvedli praktickou implementaci propojení klasické telefonní a IP sítě. Zapojení bylo prakticky odzkoušeno a všichni klienti jsou schopni si zavolat (samozřejmě ne najednou). Tento projekt ukázal praktické možnosti nasazení Asterisku ve firemním prostředí. Pro případné reálné nasazení stačí jen konfiguraci náležitě rozšířit. 8