Analogov´a telefonn´ı karta v IP u´stˇrednˇe Asterisk Jan Gaura, Tom´aˇs Hrab´alek 25.1.2007
Semestr´aln´ı projekt do pˇredmˇetu:
Technologie poˇ c´ıtaˇ cov´ ych s´ıt´ı
´ Uvod Pˇrenos hlasu je neodmyslitelnou souˇc´ast´ı dneˇsn´ıho svˇeta. V dobˇe sniˇzov´an´ı n´aklad˚ u se zaˇc´ın´a pˇrech´azet od tradiˇcn´ıho analogov´eho zp˚ usobu pˇrenosu hlasu na pˇrenos digit´aln´ı v IP s´ıt´ıch. Tento pˇrechod vˇsak nen´ı moˇzn´e prov´ezt skokovˇe a proto po pomˇernˇe dlouhou dobu budou digit´an´ı a analogov´e syst´emy koexistovat. Pˇr´ıklad takov´ehoto souˇzit´ı je pˇredmˇetem tohoto projektu. Uk´aˇzeme si, jak propojit st´avajic´ı analogovou s´ıt’ s digit´aln´ı u ´stˇrednou Asterisk a nav´ıc jak pˇripojit analogov´ y a SIP telefon.
´ redna Asterisk Ustˇ Asterisk je IP poboˇckov´a telefonn´ı u ´stˇredna urˇcen´a pro pˇrenos hlasu po r˚ uzn´ ych druz´ıch ´ s´ıt´ı. Ustˇredna je schopna konvertovat hlas z r˚ uzn´ ych druh˚ u zdroj˚ u (analogov´ y telefon, ISDN telefon, atd.) na jin´e. Nesm´ırnou v´ yhodou Asterisku je voln´a dostupnost zdro´ redna je zdarma ke staˇzen´ı na Injov´eho k´odu pod svobodnou licenc´ı (open source). Ustˇ ternetu z http://www.asterisk.org. Asterisk pracuje na platformˇe GNU/Linux. Postupnˇe si pop´ıˇseme, jak Asterisk nainstalovat a nakonfigurovat pro potˇreby projektu. Testovac´ı zapojen´ı je uvedeno na obrazku [1].
Obr´azek 1: Testovac´ı zapojen´ı
Analogov´ a karta TDM400P Pro pˇripojen´ı Asterisku k analogov´e s´ıti a analogov´emu telefonu byla pouˇzita karta Digium TDM400P. Tato karta je bˇeˇznˇe dostupn´a v obchodech ˇcesk´eho internetu. Karta je vyobrazena na obr´azku [2]. Karta disponuje 4 sloty, kter´e mohou b´ yt osazeny dle potˇreby bud’ FXS nebo FXO moduly. FXS modul slouˇz´ı pro pˇripojen´ı analogov´eho telefonu, dod´av´a mu nap´ajen´ı a prov´ad´ı 2
Obr´azek 2: Analogov´a karta Digium TDM400P vyzv´anˇen´ı. FXO modul se pouˇz´ıv´a k pˇripojen´ı k jin´e (analogov´e) poboˇckov´e u ´stˇrednˇe, popˇr´ıpadˇe k pˇripojen´ı pˇr´ımo do analogov´e veˇrejn´e telefonn´ı s´ıtˇe. Naˇse karta disponuje jedn´ım FXS modulem ve slotu 1 a jedn´ım FXO modulem ve slotu 2. Je d˚ uleˇzit´e vˇedˇet um´ıstˇen´ı modul˚ u pro pozdˇejˇs´ı konfiguraci Asterisku. V pˇr´ıpadˇe zapomenut´ı um´ıstˇen´ı modul˚ u se vˇsak nedˇeje nic tragick´eho. Modul j´adra operaˇcn´ıho syst´emu, kter´ y pˇr´ımo ovl´ad´a kartu, nahl´as´ı chybnou konfiguraci a odm´ıtne se nahr´at do pamˇeti.
Instalace u ´ stˇ redny Asterisk V projektu byl pouˇzit Asterisk verze 1.4.0. Vzhledem k tomu, ˇze tato verze byla vyd´ana velmi ned´avno (leden 2007), nen´ı obsaˇzena jako bal´ıˇcek v distribuci Debian GNU/Linux Sarge. Z tohoto d˚ uvodu provedeme instalaci ze zdrojov´ ych k´od˚ u. Z http://ftp1.digium.com/pub/ st´ahneme n´asleduj´ı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´e souˇc´asti zkompilujeme a nainstalujeme v takov´em poˇrad´ı, v jak´em jsou v´ yˇse zm´ınˇeny. Kompilaci a instalaci kaˇzd´eho archivu provedeme takto: $./configure $make 3
#make install Nyn´ı bychom jiˇz mˇeli m´ıt Asterisk nainstalov´an. Asterisk m˚ uˇzeme interaktivnˇe ovl´adat pomoc´ı prostˇred´ı CLI. Do tohoto prostˇred´ı se dostaneme spuˇstˇen´ım Asterisku s parametrem -c, tedy #asterisk -c. Pokud n´am jiˇz Asterisk bˇeˇz´ı na pozad´ı jako d´emon, m˚ uˇzeme se k nˇemu pˇripojit tak, ˇze spust´ıme asterisk s parametrem -r, tedy #asterisk -rc.
Konfigurace u ´stˇ redny Asterisk Konfigurace u ´stˇredny se prov´ad´ı prostˇrednictv´ım soubor˚ u v adres´aˇri /etc. Nejprve je tˇreba nakonfigurovat analogovou kartu, tedy urˇcit, kter´e sloty jsou osazeny moduly a jak´ ymi. Toto provedeme v souboru /etc/zaptel.conf pˇr´ıd´an´ım ˇr´adk˚ u: fxoks = 1 fxsks = 2 V tomto souboru pˇriˇrazujeme jednotliv´ ym slot˚ um (a jim pˇrisluˇsn´ ym modul˚ um) signalizaci. Signalizace je vˇsak opaˇcn´a, neˇz je urˇcen´ı modulu! Tedy napˇr´ıklad pro modul FXO je signalizace fxsks, ponevadˇz do FXO modulu m˚ uˇze pˇrij´ıt vyzv´anˇec´ı sign´al z jin´e u ´stˇredny a tedy se FXO modul chov´a jako telefon, kter´ y poˇz´ıv´a signalizaci FXS. Proto tedy FXO modul, kter´ y je um´ıstˇen ve slotu 2, bude m´ıt signalizaci fxsks. Dalˇs´ı 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ˇc´ıme jednotliv´e kontexty pro hovory u ´stˇredny. Kontext ”internal” bude slouˇzit pro hovory odchoz´ı z u ´stˇredny. Podobnˇe kontext ”incoming” slouˇz´ı pro hovory pˇrich´azej´ıc´ı do 4
u ´stˇredny. Proberme si nyn´ı jednotliv´e poloˇzky: Sekce [channels] - slouˇz´ı k urˇcen´ı signalizace a parametr˚ u pro hardwarov´e kan´aly. context=internal - definujeme kontext, pro kter´ y provedeme nastaven´ı, kter´a jsou uvedena n´ıˇze. Pro n´as je toto intern´ı kontext s analogov´ ym telefonem. usecallerid=yes - kaˇzd´ y uˇzivatel bude poskytovat (vys´ılat) sv´e telefonn´ı ˇc´ıslo volan´emu. hidecallerid=no - urˇcuje, ˇze identifik´ator uˇzivatele nebude skryt pˇri odchoz´ım vol´an´ı. signalling=fxo ks - urˇcuje pouˇzit´ı signalizace fxo ks pro telefonn´ı pˇr´ıstroj. echocancel=yes - u ´stˇredna bude eliminovat zpˇetnou vazbu v hlasov´e komunikaci, tedy aby uˇzivatel neslyˇsel s´am sebe. echotraining=yes - po zvednut´ı sluch´atka si u ´stˇredna sama zjist´ı, jak´e jsou podm´ınky na dan´e lince vysl´an´ım jednoduch´eho sign´alu. Podle toho bude posl´eze upravovat zpˇetnou vazbu. channel=>1 - vsechny pˇr´ıkazy, kter´e pˇredch´azej´ı tomuto pˇr´ıkazu, se budou aplikovat na kan´al 1. context=incoming - definice pˇr´ıchoz´ıho kontextu (smˇerem do poboˇcky) s FXO modulem. signalling=fxs ks - definice signalizace fxs ks na FXO modulu. channel=>2 - ˇr´ık´a, ˇze nastaven´ı plat´ı pro kana´al 2. D´ale vytvoˇr´ıme ˇc´ıslovac´ı pl´an (Dial plan) v souboru /etc/asterisk/extensions.conf. Tento soubor je sv´az´an s definicemi kontext˚ u v souboru /etc/asterisk/zapata.conf tak, ˇze kaˇzd´ y kontext v nˇem definovan´ y m´a nadefinov´an ˇc´ıslovac´ı pl´an v /etc/asterisk/extensions.conf. Pod´ıvejme se nyn´ı na naˇsi konfiguraci (ˇc´ısla viz. obr´azek [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 exten exten exten
=> => => =>
300,1,Dial(SIP/300) 300,2,Hangup() 400,1,Dial(Zap/1) 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´an pro jednotliv´e kontexty uvedeme jm´enem kontextu v hranat´ C´ ych z´avork´ ych. V naˇsem pˇr´ıpadˇe tedy [internal] a [incoming]. Form´at pˇr´ıkaz˚ u je n´asleduj´ıc´ı: exten => ˇ c´ ıslo,priorita,funkce Naˇs´ı konfiguraci postupnˇe projdeme: exten => 611,1,Echo() exten => 611,2,Hangup()
Na telefonn´ı ˇc´ıslo 611 jsme pˇriˇradili funkci Echo(). Tato funkce pracuje jednoduˇse tak, ˇze pˇresmˇerov´av´a vstup na v´ ystup. Uˇzivatel tak slyˇs´ı s´am sebe. Tato funkce je hojnˇe vyuˇz´ıv´ana operatory jako test spojen´ı pro klienty. Po ukonˇcen´ı hovoru je tˇreba linku zavˇesit a t´ım ukonˇcit hovor ze strany u ´stˇredny. Toto provedeme pˇriˇrazen´ım funkce Hangup(). Funkci Hangup() pouˇzijeme u vˇsech telefonn´ıch ˇc´ısel. exten => 26,1,Dial(Zap/2/26) exten => 26,2,Hangup()
Telefonn´ımu ˇc´ıslu 26 jsme pˇriˇradili funkci Dial(). Tato funkce provede vol´an´ı tam, kde ukazuje jej´ı parametr. V naˇsem pˇr´ıpadˇe tedy chceme volat ˇc´ıslo 26, kter´e je um´ıstˇeno na analogov´e poboˇckov´e u ´stˇrednˇe ATEL, kter´a je do Asterisku pˇripojena na FXO kan´al, kter´ y m´a ˇc´ıslo 2. Pod´ıvejme se vˇsak na parametr funkce Dial() podrobnˇeji. Pokud uˇzivatel analogov´eho telefonu pˇripojen´eho k Asterisku nebo uˇzivatel pripojen´ y protokolem SIP vytoˇc´ı ˇc´ıslo 26, Asterisk zvedne FXO kan´al (Zap/2, kan´al pro odchoz´ı vol´an´ı) a na nˇem vytoˇc´ı ˇc´ıslo 26. Tato operace se volaj´ıc´ımu jev´ı, jako by byl pˇr´ımo pˇripojeni k u ´stˇrednˇe ATEL. exten => 300,1,Dial(SIP/300) exten => 300,2,Hangup()
6
ˇ ıslu 300 jsme pˇriˇradili uˇzivatele pˇripojen´eho protokolem SIP s ˇc´ıslem 300. Na tomto C´ m´ıstˇe je vhodn´e zm´ınit, ˇze uˇzivatel´e pˇripojeni prostˇrednictv´ım SIP protokolu mohou m´ıt t´eˇz ˇc´ısla v podobˇe alfanumerisk´ ych znak˚ u. exten => 400,1,Dial(Zap/1) exten => 400,2,Hangup()
Analogov´em telefonu pˇripojen´emu do Asterisku jsme pˇriˇradili ˇc´ıslo 400. Pokud tedy pˇrijde na Asterisk poˇzadavek o vol´an´ı na ˇc´ıslo 400, Asterisk bude signalizovat zvonˇen´ı na kan´al FXS. Pro kontex [incoming], kter´ y je definov´an na FXO kan´ale, 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´ana volan´a ˇc´ısla, kter´a pˇrich´azej´ı na Asterisk z analogov´e u ´stˇredny ATEL. Asterisk a ATEL jsou spojeni linkou s ˇc´ıslem 25. Volaj´ıc´ı, kter´ y je pˇripojen v ATELu, tedy nejprve vytoˇc´ı ˇc´ıslo 25, ˇc´ımˇz se dovol´a na Asterisk. D´ale pak vytoˇc´ı poˇzadovan´e ˇc´ıslo u ´ˇcastn´ıka (v naˇsem pˇr´ıpadˇe tedy ˇc´ıslo 300 nebo 400). Tato ˇc´ısla jsou zpracov´ana ve formˇe DTMF sign´al˚ u, kter´e volaj´ıci zad´a po dovol´an´ı se na Asterisk, kter´ y DTMF signalizaci rozpozn´a. Parametry pˇr´ıkazu by jiˇz ˇcten´aˇri mˇely b´ yt dostateˇcnˇe zn´amy z pˇredchoz´ıho textu.
Konfigurace SIP Konfigurace SIP protokolu se prov´ad´ı v souboru /etc/asterisk/sip.conf. [300] type=friend secret=300 qualify=yes nat=no host=dynamic canreinvite=no context=internal
7
Jednotliv´e ˇr´adky si opˇet podrobnˇeji probereme: [300] - jm´eno klienta. V tomto pˇr´ıpadˇe je to ˇc´ıslo 300, ale m˚ uˇzeme pouˇz´ıt i textov´ y ˇretezec. type=friend - klient bude moci hovory pˇrij´ımat i uskuteˇcnovat. secret=300 - heslo, kter´e klient zad´ava pro pˇrihl´aˇsen´ı k u ´stˇrednˇe. qualify=yes - Asterisk zjisti jak´e je zpoˇzdˇen´ı na lince ke klientovi. Automaticky je toto zpoˇzdˇen´ı nastaveno na 2 sekundy. Pokud je zpoˇzdˇen´ı vetˇs´ı, klientovi nebude umoˇznˇeno pˇrihl´aˇsen´ı. Zmˇenu ˇcasu zpoˇzdˇen´ı m˚ uˇzeme provezt zad´an´ım ˇcasu v milisekund´ach, tedy napˇr. 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ˇenit parametry prob´ıhaj´ıciho hovoru. D´ıky tomu bude Asterisk poslouchat prob´ıhaj´ıc´ı hovor a tak v pˇr´ıpadˇe potˇreby napˇr´ıklad obslouˇzit DTMF sign´aly. context=internal - pˇriˇrazen´ı klienta do kontextu internal.
Z´ avˇ er V tomto projektu jsme porvedli praktickou implementaci propojen´ı klasick´e telefonn´ı a IP s´ıtˇe. Zapojen´ı bylo prakticky odzkouˇseno a vˇsichni klienti jsou schopni si zavolat (samozˇrejmˇe ne najednou). Tento projekt uk´azal praktick´e moˇznosti nasazen´ı Asterisku ve firemn´ım prostˇred´ı. Pro pˇr´ıpadn´e re´aln´e nasazen´ı staˇc´ı jen konfiguraci n´aleˇzitˇe rozˇs´ıˇrit.
8