Niniejszy tekst jest przekładem dwóch artykułów, których autorem jest Henry Jensen. Poniżej przedstawiony zostanie sposób na wykonanie niedrogiego urządzenia umożliwiającego korzystanie z coraz bardziej powszechnej metody komunikowania się jaką jest VoIP. Praca urządzenia będzie możliwa dzięki wykorzystaniu oprogramowania linuksowego.

Uwagi wstępne

Usługa Voice over IP (VoIP) jest na ustach wszystkich. Możliwość korzystnego lub darmowego telefonowania przez Internet jest kusząca. VoIP jest interesujący dla użytkowników Linuksa przynajmniej od chwili ukazania się wersji komunikatora Skype dla Linuksa.
Jednak VoIP ma także kilka wad:

  • W przypadku korzystania z oprogramowowania klienckiego, uzyskiwana jakość mowy jest często słaba.
  • Aparat telefoniczny z obsługą protokołu SIP jest względnie drogi.
  • Fritzbox Fon, który umożliwia używanie zwykłego telefonu także jako telefonu internetowego, również nie jest tani.

Wspólną cechą wszystkich ww. rozwiązań jest to, że jest się przywiązanym do jednego dostawcy usługi VoIP przez SIP, który jest de facto standardowym protokołem VoIP i nie jest optymalny z punktu widzenia bezpieczeństwa w sieci. Trzeba otworzyć nie tylko port 5060 UDP dla SIP, lecz także porty UDP dla RTP (Real Time Protocol, właściwe przesyłanie strumienia danych z głosem).
Rozwiązanie przedstawione w artykule oferuje następujące zalety:

  • Telefon (ISDN) może być używany w sieci tradycyjnej oraz do telefonowania internetowego w ramach VoIP.
  • Nie jest wymagany ani aparat telefoniczny ani FritzBox, jedynie trochę oprogramowania oraz oprzyrządowania, które można korzystnie zgromadzić.
  • Otwarty musi być tylko jeden port UDP.
  • Zagwarantowana jest niezależność od dostawcy osprzętu oraz dostawców protokołu SIP.

Po wykonaniu opisanych czynności będziemy dysponować urządzeniem umożliwiającym wykonywanie rozmów poprzez ISDN oraz VoIP, a wszystko to w oparciu o Linuksa, który zaoferuje nam niezliczone możliwości dostępne jedynie w drogich urządzeniach telefonicznych. W pierwszej części zbudujemy i skonfigurujemy oprzyrządowanie. W drugiej części zajmiemy się bliżej konfiguracją i możliwościami Asterisk.
Oprogramowaniem telefonicznym dla Linuksa jest Asterisk. Asterisk jest pełnowartościową, programową implementacją kompletnego urządzenia telefonicznego potrafiącego obsługiwać ISDN, VoIP i znacznie więcej. Niniejszy program został napisany przez Marka Spencera. Jest on dostępny jako Otwarte i Wolne Oprogramowanie.
Istnieje projekt podobny do tego, co zamierzamy uzyskać: PBX4Linux. Różni się on od Asterisk tym, że (jeszcze) nie umie realizować usługi VoIP i jest (niemal) czystym urządzeniem telefonicznym ISDN opartym na Linuksie. Bez względu na to, wskazówki i instrukcje z PBX4Linux, przede wszystkim te dotyczące oprzyrządowania, są bardzo przydatne.

Część I

1. Wymagania techniczne

Aby zbudować linuksowy, internetowy telefon, należy spełnić następujące wymagania:

  • karta / przyłącze ISDN (wprawdzie istnieją także karty dla urządzeń analogowych, np. TDM400P firmy Digium, jednak tego typu rozwiązanie byłoby dość drogie)
  • przyłącze DSL

Konieczne jest posiadanie następującego oprzyrządowania:

  • Komputer z Linuksem
  • Dodatkowe zakończenia ISDN-NTBA.

Można je korzystnie nabyć. Wiele firm masowo się ich pozbywa. Poza tym eBay sprzedaje je już od około 13,00 PLN, a czasem i taniej.

  • Kabel typu 'patch’ albo najlepiej kabel ISDN (tylko cztery przewody w środku)
  • Dwie karty ISDN z chipsetem HFC-S, np. Acer ISDN 128 Surf PCI, w cenie od około 122,00 złotych. Lista kart z chipsetem HFC dostępna jest tutaj. Jeśli urządzenie ma realizować wyłącznie usługę VoIP, wówczas wystarczy jedna taka karta.
  • szczypce do zaciskania wtyczek, szczypce do cięcia drutu, wtyczka RJ45

2. Montaż osprzętu

Najpierw przygotujemy skrośny kabel ISDN. Nie możemy skorzystać ze skrośnego kabla ethernetowego. Autor artykułu nie znalazł w sieci sprzedawców skrośnych kabli ISDN, dlatego poniżej zamieszczony został opis, w jaki sposób przygotować go samemu.
kabel skrośny
Aby zbudować odpowiedni kabel, musimy odciąć jedną końcówkę kabla ISDN. W przypadku takiego kabla zajęte są piny 3, 4, 5 i 6. Dwa wewnętrzne i dwa zewnętrzne przewody tworzą pary (4-5 i 3-6). Pierwsza para umożliwia nadawanie (TX), a druga odbiór (RX). Czynność, którą musimy teraz wykonać, polega na zamianie par na jednym końcu kabla. Parę wewnętrzną należy podłączyć na zewnątrz, a parę zewnętrzną do wewnątrz. Inaczej mówiąc, parę 4-5 musimy podłączyć w miejsce pary 3-6 a parę 3-6 w miejsce pary 4-5. Na końcu trzeba jeszcze nałożyć i zacisnąć wtyczkę RJ45. W ten sposób jesteśmy już w posiadaniu odpowiedniego przewodu.
Alternatywnie kabel skrośny ISDN można także zbudować przebudowując NTBA, jednak ten sposób uważany jest za bardziej skomplikowany. Osoby chcące, pomimo tego, spróbować tej metody mogą zapoznać się z treścią pliku PBX4Linux-3.0.pdf, gdzie znajduje się odpowiedni opis wraz ze zdjęciami.
Obydwie karty ISDN muszą być zainstalowane w komputerze pracującym pod kontrolą Linuksa. W przypadku PBX4Linux należy zwrócić uwagę na to, żeby każda karta miała przydzielony własny numer IRQ i nie dzieliła go z innymi urządzeniami.
setup

Ostateczna instalacja osprzętu

Przed podłączeniem kabli, należy ponownie zabootować wbudowane karty. W ten sposób dokonujemy sprawdzenia, czy dana karta jest wykrywana przez system operacyjny – aktywacja sterowników: isdn4linux lub kernelcapi lub mISDN i czy następuje załadowanie modułów jądra.
Może to zabrzmi paradoksalnie, ale chcemy, aby ww. sterowniki nie zostały aktywowane. Dokładnie mówiąc, moduł HiSax, jak również moduły isdn4linux, kernelcapi, czy mISDN powinny zostać odinstalowane. Chodzi o to, że później będziemy korzystali z naszego własnego sterownika, specyficznego dla Asterisk.
Następnie należy wyłączyć komputer i podłączyć przewody. Najpierw zwykłym kablem ISDN (nie kablem skrośnym) łączymy telefon z dodatkowym NTBA. Z kolei NTBA podłączamy, tym razem kablem skrośnym ISDN, do pierwszej karty ISDN. Kartę tę nazwiemy kartą NT, ponieważ uruchomimy ją później w trybie NT. Drugą kartę ISDN łączymy z naszym przyłączem ISDN (z reguły jest to NTBA założone wcześniej przez naszego dostawcę usług telekomunikacyjnych). Kartę tę możemy więc nazwać kartą TE.

3. Instalacja Asterisk

Teraz możemy rozpocząć instalację Asterisk. W tym celu musimy jedynie pobrać odpowiedni pakiet. Następnie rozpakowujemy go poleceniem tar xvzf bristuff-0.2.0-RC8g.tar.gz. Pakiet kompilujemy po dowiązaniu źródeł Linuksa do /usr/src/linux-2.6 (jeśli źródła nie zostały wcześniej zainstalowane należy to zrobić – autor artykułu zakłada, że większość osób korzysta z kernela w wersji 2.6.X.(Y)).
Następnie przechodzimy do katalogu bristuff-0.2.0-RC8g i wywołujemy polecenie: ./install.sh. Skrypt załaduje kolejne elementy: Asterisk, libpri oraz zaptel, nałoży łatę na źródła, skompiluje je i zainstaluje.
Po zakończonej instalacji, możemy zająć się konfigurowaniem kart ISDN. Najpierw musimy utworzyć plik /etc/zaptel.conf. W pliku tym umieszczamy następujący wpis:
#/etc/zaptel.conf
loadzone=pl
defaultzone=pl
span=1,1,3,ccs,ami
bchan=1-2
dchan=3
span=2,1,3,ccs,ami
bchan=4-5
dchan=6
Teraz możemy załadować moduł jądra: modprobe zaphfc modes=1
Opcja modes=1 przełącza pierwszą kartę ISDN w tryb NT. Za pomocą modes=2 przełączylibyśmy drugą kartę w ww. tryb, natomiast opcja modes=3 przełączyłaby w tryb NT obydwie karty.
Na końcu wykonujemy jeszcze polecenie: ztcfg -v, które aktywuje karty.
Aby sprawdzić, czy karty działają prawidłowo, należy obejrzeć pliki: /proc/zaptel/1 i /proc/zaptel2.
bash$ cat /proc/zaptel/1
Span 1: ZTHFC1 „HFC-S PCI A ISDN card 0 [NT] layer 1 ACTIVATED (F4)” AMI/CCS
1 ZTHFC1/0/1 Clear (In use)
2 ZTHFC1/0/2 Clear (In use)
3 ZTHFC1/0/3 HDLCFCS (In use)
bash$ cat /proc/zaptel/2
Span 1: ZTHFC1 „HFC-S PCI A ISDN card 0 [TE] layer 1 ACTIVATED (F4)” AMI/CCS
4 ZTHFC1/0/1 Clear (In use)
5 ZTHFC1/0/2 Clear (In use)
6 ZTHFC1/0/3 HDLCFCS (In use)
Wpisy powinny być zbliżone do przedstawionych powyżej. Następnie można wywołać polecenie zttool. Jest to małe narzędzie służące do kontroli pracy kart, podczas używania którego, obydwie karty powinny działać prawidłowo.
Aby Asterisk mógł rozpocząć współpracę z kartami, musimy je odpowiednio skonfigurować. Plikiem konfiguracyjnym jest: /etc/asterisk/zapata.conf.
#/etc/asterisk/zapata.conf
switchtype = euroisdn
signalling = bri_net_ptmp
pridialplan=local
echocancel=yes
immediate=yes
group = 1
context=default
channel => 1-2
signalling = bri_cpe_ptmp
group = 2
channel => 4-5
Aby nie pozostawić czytelnika z urządzeniem jedynie w połowie gotowym do pracy, poniżej jeszcze kilka uwag umożliwiających diagnozowanie urządzenia.
W pliku konfiguracyjnym Asterisk: /etc/asterisk/extensions.conf – w sekcji [default], należy umieścić dwa wpisy niezbędne do zwykłego telefonowania. Zakładamy, że numerem naszego telefonu jest 123456.
[default]
exten => 123456,1,Dial(Zap/g1/${EXTEN})
exten => _X.,1,Dial(Zap/g2/${EXTEN})
Na końcu należy włączyć Asterisk. W tym celu, podczas pierwszego uruchomienia, musimy wywołać polecenie: asterisk -vvvc. Wyświetlony zostanie cały szereg komunikatów. Jeśli wszystko przebiegnie pomyślnie, wówczas w linii poleceń wyświetlony zostanie znak zachęty. Teraz mamy już dostęp do różnych poleceń umożliwiających diagnozowanie urządzenia. Aby np. poznać stan pierwszej karty ISDN, należy wydać polecenie: pri show span 1. help wyświetli informacje nt. wszystkich dostępnych poleceń.

Część II

Poniżej skonfigurujemy Asterisk tak, że możliwe już będzie przeprowadzenie pierwszej rozmowy telefonicznej.

4. Konfiguracja kart ISDN

Konfiguracja Asterisk może być naprawdę obszerna i skomplikowana. Dlatego zapewne nie omówimy tu w wyczerpujący sposób wszystkich związanych z nią zagadnień.
Kolejne adresy przedstawiają wybrane źródła, które zajmują się wspomnianą konfiguracją i przedstawiają odpowiedzi na wiele pytań z nią związanych:

Najpierw zajmiemy się optymalizacją ustawień kart ISDN. Dla karty NT należy w pliku /etc/asterisk/zapata.conf umieścić następujący wpis:
;/etc/asterisk/zapata.conf
[channels]
language=pl
switchtype = euroisdn
signalling = bri_net_ptmp
pridialplan = dynamic
prilocaldialplan = local
nationalprefix = 0
internationalprefix = 00
echocancel=yes
echotraining = 100
echocancelwhenbridged=yes
immediate=no
overlapdial=yes
group = 1
context=default
channel => 1-2
Natomiast dla karty TE należy do tego samego pliku wpisać:
group = 2
signalling = bri_cpe
; ewentualnie także
; signalling = bri_cpe_ptmp, w przypadku podłączenia wielu aparatów
group = 2
context=default
channel => 4-5
Znaczenie większości parametrów tłumaczy się samo. immediate=no oraz overdaldial=yes ustawione są zasadniczo tylko po to, aby można było wybierać numer także przy podniesionej słuchawce. Domyślne ustawienie jest takie, że Asterisk zaczyna wybierać numer, gdy tylko zostanie podniesiona słuchawka. Często nie odpowiada to przyzwyczajeniom użytkowników, mimo że w przypadku większości dzisiejszych telefonów możliwe byłoby wybieranie numeru przy odłożonej słuchawce i podniesienie słuchawki dopiero po wprowadzeniu numeru. W wyniku powyższego ustawienia Asterisk czeka na podanie numeru telefonu, jednak czas oczekiwania nie jest nieograniczony. Pomiędzy wprowadzeniem kolejnych cyfr Asterisk czeka najwyżej pięć sekund, a nastepnie zaczyna wybierać numer. W niektórych sytuacjach czas ten może okazać się zbyt krótki, np. gdy numer jest gdzieś zapisany i po kolei przez nas czytany. Jeśli zatem zechcemy ustawić dłuższy czas, wówczas musimy to uczynić poleceniem DigitTimeout w schemacie połączeń (dialplan).

5. Schemat połączeń (dialplan)

Mała część schematu połączeń została zaprezentowana już wcześniej w ramach niniejszego artykułu. Ponieważ schemat połączeń jest najobszerniejszą i niestety także najbardziej skomplikowaną częścią konfiguracji oprogramowania Asterisk, chcąc nie chcąc musimy poznać nieco teorii.
Schemat połączeń definiuje, w jaki sposób mogą komunikować się poszczególne kanały (channels – Zap, SIP, IAX, itd.). Plikiem konfiguracyjnym zawierającym odpowiednie definicje jest plik extensions.conf.
Tutaj należy od razu wyjaśnić dwa pojęcia. Rozszerzenie (exten) jest wybieranym celem, czyli najczęściej numerem telefonu. Istnieje jednak także specjalne rozszerzenie.
Kontekst jest grupą wewnątrz schematu połączeń. Kontekst [default] jest otwarty dla wszystkich. W pozostałych przypadkach obowiązuje zasada, że dostępne dla nas są tylko te rozszerzenia, które znajdują się w tym samym kontekście, co my. Kontekst, do którego należymy, definiowany jest w konfiguracji kanałów (channels), a odpowiedni numer w schemacie połączeń.
W celu uzyskania dostępu do innych kontekstów, żądany kontekst można włączyć do własnego kontekstu za pomocą instrukcji include. Typowy kontekst mógłby wyglądać tak:
[firma]
exten => 151,1,Dial(Zap/g1/151,30,rt)
exten => 151,2,Dial(Zap/g1/152,30,rt)
exten => 152,1,Dial(Zap/g1/152,30,rt)
exten => 152,2,Dial(Zap/g1/151,30,rt)
[CEO]
include => firma
exten => 161,1,Dial(Zap/g1/161,30,rt}
exten => 162,1,Dial(Zap/g1/162,30,rt}
Każdy, kto należy do kontekstu CEO, może korzystać z rozszerzeń zapisanych w kontekstach firma oraz CEO. Jednak ten, kto należy do kontekstu firma, nie ma dostępu do rozszerzeń z kontekstu CEO.
Wiersz, w którym zapisane jest rozszerzenie, ma zawsze następujący format:
exten => rozszerzenie,priorytet,polecenie
Mówiąc dokładniej:

  • Rozszerzenie oznacza: wybierany numer.
  • Priorytet oznacza: priorytet (kolejność) przetwarzania polecenia. Możliwe jest ustawienie najpierw priorytetu 2, a potem priorytetu 1, ale Asterisk wewnętrznie posortuje rosnąco. Blok, który należy do pojedynczego rozszerzenia, zostanie sekwencyjnie przetworzony rosnąco, chyba że przetwarzanie zostanie przerwane, choćby wskutek sygnału hangup (odłożona słuchawka) albo komunikatu błędnie wykonanego polecenia.
  • Polecenie: znane także jako application command, patrz poniżej.

W przypadku większych instalacji wprowadzanie pojedynczych numerów / rozszerzeń byłoby uciążliwe, dlatego istnieje możliwość korzystania z wzorców i zmiennych. Wzorzec definiowany jest poprzez użycie znaku podkreślenia, np. wzorzec
exten => _1XX,1,Dial(Zap/g1/${EXTEN},30,rt}
oznacza, że 3-cyfrowe rozszerzenie, które rozpoczyna się cyfrą 1, należy wybrać poprzez Zap/g1. Podczas tworzenia wzorców wykorzystywane są następujące oznaczenia:
X – każda cyfra od 0-9
Z – każda cyfra od 1-9
N – każda cyfra od 2-9
[1237-9] – każda cyfra w nawiasach (tutaj 1,2,3,7,8,9)
. – dzika karta, jeden albo wiele następujących znaków
Aby np. wychwycić każdy możliwy do wybrania numer, trzeba by utworzyć tylko wzorzec X.
Co jednak się stanie, jeśli numer będzie pasować do większej ilości wzorców? Asterisk wybierze wówczas wzorzec, który pasuje najdokładniej. Załóżmy, że podane są wzorce: 1XX, 1. oraz X.. Gdyby teraz ktoś wybrał numer 123, wtedy pasować będą wszystkie trzy wzorce (każdy 3-cyfrowy numer zaczynający się od 1, każdy numer zaczynający się od 1, każdy numer). Jednak wzorzec 1XX pasuje najdokładniej i Asterisk skorzysta właśnie z niego, o ile nie zostało zdefiniowane jednoznaczne rozszerzenie 123.
Polecenia wykorzystywane w przypadku każdego rozszerzenia nazywane są także application commands. Obecnie istnieje około 140 różnych poleceń, które opisane zostały na stronach www.voip-info.org. Zapewne najważniejszym z nich jest polecenie Dial. Format niniejszego polecenia wygląda następująco.
Dial(type/identifier,timeout,options,URL)
Powyższe parametry mają następujące znaczenie:

  • type – oznacza typy kanału, czyli SIP, Zap, IAX itd.
  • identifier – oznacza numer telefonu (rozszerzenie), który ma zostać wybrany. W błąd często może wprowadzić fakt, że typ kanału może posiadać parametry, które również oddzielane są od siebie za pomocą slasha ( / ). O ile SIP/101 jest jeszcze zapisem jednoznacznym (Wybierz 101 na kanale SIP), o tyle instrukcja Zap/g1/101 (Wybierz 101 na kanale Zap grupy 1) nie da się już całkiem łatwo odczytać, a w przypadku instrukcji IAX2/1234:4567@192.168.1.12/101@extern trzeba się dokładnie przyjrzeć, gdzie właściwie znajduje się żądany numer (Wybierz 101 na kanale IAX na serwerze IAX o numerze IP 192.168.1.12, a następnie zaloguj się jako użytkownik 1234 posiadający hasło 4567 i wybierz tam kontekst extern.)
  • timeout – timeout w sekundach
  • options – oznacza szereg opcji, które można podać wraz z poleceniem Dial. Wszystkie opcje należy zapisywać bezpośrednio jedna za drugą. Najważniejszymi z nich są:
    t: zezwól odbiorcy połączenia na transfer połączenia.
    T: zezwól dzwoniącemu na transfer połączenia.
    r: generuj sygnał dzwonka po stronie odbiorcy połączenia do chwili, gdy ktoś podniesie słuchawkę.
    m: odtwarzaj MusicOnHold do chwili, gdy ktoś podniesie słuchawkę (muzyka zamiast sygnału dzwonka)
    g: wykonuj kolejne polecenie zapisane w niniejszym kontekście, zamiast przerwać połączenie po od odłożeniu słuchawki.
    A(x): odtwórz zapowiedź x.gsm (zamiast sygnału dzwonka)
    S(n): odłóż słuchawkę po „n” sekundach liczonych od momentu podniesienia słuchawki

Pełna lista opcji dostępna jest na stronach www.voip-info.org.
URL – przesyłany przez dzwoniącego, w przypadku gdy kanał obsługuje taką opcję. Nieobowiązkowe.
W schemacie połączeń można, podobnie jak w skrypcie powłoki, ustawiać zmienne oraz używać zmiennych systemowych. Najważniejszą zmienną jest ${EXTEN}, która zawiera żądane rozszerzenie. Można z niej łatwo korzystać w połączeniu z wzorcami rozszerzeń. Dzięki temu np. instrukcja
exten => _X.,1,Dial(SIP/${EXTEN})
nie oznacza niczego innego, jak Wybierz żądany numer na kanale SIP. Listę zmiennych systemowych można znaleźć na stronach www.voip-info.org.

6. VoIP

Zanim przejdziemy do kilku praktycznych, przykładowych schematów połączeń, powinniśmy lepiej poznać VoIP. To, w jaki sposób można wykorzystywać Asterisk do zwykłego telefonowania (nazywanego w żargonie technicznym PSTN, czyli Public switched telephone network), powinno być już dla nas mniej więcej jasne. Jednak na czym polega telefonia internetowa?
Z punktu widzenia struktury istnieją dwie możliwości. Można zbudować własną sieć (np. wraz z kolegami, krewnymi i przyjaciółmi można podać do serwera Asterisk dane nt. kont oraz / lub dokonać wpisów „ENUM” dla własnych numerów telefonów sprzężonych z SRV record dodanego dla własnego serwera Asterisk na publicznym serwerze DNS). Można też poszukać jednego bądź wielu dostawców VoIP.
Oczywiście można również połączyć obydwie możliwości.
Asterisk rozmawia posługując się wieloma protokołami VoIP.

  • H.323 – matka wszystkich protokołów VoIP, obsługiwany przede wszystkim przez starszy osprzęt, obecnie jego stosowanie coraz bardziej zanika
  • SIP – de facto dzisiejszy standard
  • MGCP – kolejny, raczej rzadko spotykany protokół VoIP
  • Skinny/SCCP – protokół VoIP dla telefonów Cisco, po części obsługiwany jedynie w podstawowym stopniu
  • IAX2 – własny protokół VoIP oprogramowania Asterisk

Pomimo tego, że SIP jest dzisiejszym standardem, protokół ten nie jest optymalny. Chlebem powszednim są problemy z NATem i Firewallami tych, którzy stosują serwery SIP (złożone z usług: registrar, proxy i location server). Wynika to stąd, że SIP składa się właściwie z trzech protokołów: SIP, SDP oraz RTP. Mówiąc w uproszczeniu, w przypadku dwóch pierwszych chodzi o wymianę komunikatów sterujących, natomiast dane z właściwym głosem płyną za pośrednictwem protokołu RTP.
Wszystkich tych problemów pozbawiony jest IAX2 (Inter-Asterisk eXchange). IAX wykorzystuje tylko jeden jedyny port, tj. 4569. Zwykle możliwy jest także UDP – TCP.
Dlatego w przypadku poszukiwań dostawcy VoIP zalecałbym znalezienie takiego, który obsługuje IAX. Najprostsze oferty zapewniające obsługę portu IAX często nic nie kosztują i wewnętrzne rozmowy VoIP są bezpłatne.
Poniższy fragment dotyczy amerykańskiego IAXtel, zatem może posłużyć jedynie jako przykład działania.
IAXtel dostarcza sieć IAX, która jest (prawie) niekomercyjna i ukierunkowana na Społeczność. IAXtel sponsorowana jest przez „producenta” Asterisk, firmę Digium. Po zarejestrowaniu otrzymamy 11-cyfrowy numer telefonu rozpoczynający się od 1-700. IAXtel dostosowany jest do warunków amerykańskich, jednak, aby nie preferować żadnego rodzimego dostawcy, posłuży on nam za przykład dla konfiguracji IAX. W przypadku wszystkich innych dostawców oferujących IAX rzecz powina wyglądać tak samo. W przykładzie posłużę się przyznanym przez IAXtel, następującym numerem: 17001234567.
Aby odróżnić numery VoIP od zwykłych numerów telefonów, należy odpowiednio skonfigurować Asterisk. Jako podstawę wykorzystamy przykład z górnej części artykułu.
;/etc/asterisk/extensions.conf
[default]
exten => 123456,1,Dial(Zap/g1/${EXTEN})
exten => 17001234567,1,Dial(Zap/g1/123456)
[extern]
exten => _1700NXXXXXX,1,Dial(IAX2/user:password@iaxtel.com/${EXTEN}@iaxtel)
exten => _1888NXXXXXX,1,Dial(IAX2/user:password@iaxtel.com/${EXTEN}@iaxtel)
exten => _1877NXXXXXX,1,Dial(IAX2/user:password@iaxtel.com/${EXTEN}@iaxtel)
exten => _1866NXXXXXX,1,Dial(IAX2/user:password@iaxtel.com/${EXTEN}@iaxtel)
exten => _1800NXXXXXX,1,Dial(IAX2/user:password@iaxtel.com/${EXTEN}@iaxtel)
exten => _X.,1,Dial(Zap/g2/${EXTEN})
Jak widać, zostało wprowadzonych kilka zmian. Przede wszystkim w kontekście [default] widnieje teraz już tylko nasz numer. Pozostałe numery znajdują się w innym kontekście, mianowicie [extern]. Ma to uniemożliwić telefonowanie na nasz koszt dzwoniącym z zewnątrz. W tym celu należy także odpowiednio zmienić kontekst przewodu Zap/g1. Dla przypomnienia – poniższy wpis odpowiada karcie NT.
;/etc/asterisk/zapata.conf
switchtype = euroisdn
signalling = bri_net_ptmp
pridialplan=local
echocancel=yes
immediate=yes
group = 1
context=extern
channel => 1-2
signalling = bri_cpe_ptmp
group = 2
context=default
channel => 4-5
Dzięki temu możemy telefonować na zewnątrz. Wszyscy, którzy nawiązują połączenie za pomocą innego interfejsu niż Zap/g1, mogą wybierać tylko nasze własne numery.
Aby móc telefonować poprzez IAXtel, musimy jeszcze w pliku /etc/asterisk/iax.conf umieścić następujący wpis:
;/etc/asterisk/iax.conf
register => user:password@iaxtel.com
Aby inni użytkownicy mogli się z nami kontaktować poprzez IAXtel, musimy otworzyć u nas port UDP 4569. Najlepiej, żebyśmy jednak ograniczyli się przy tym tylko do serwera, który będzie się z nami łączyć. W przykładzie jest to serwer iaxtel.com. W przeciwieństwie do SIP, nie musimy otwierać kolejnych portów dla RTP.
Jeśli mamy dostawcę VoIP, który poprzez IAX umożliwia routing także do PSTN, wówczas możemy, w zależności od tego, co jest tańsze, wybierać również zwykłe numery za pośrednictwem tego dostawcy. W poniższym przykładzie pokazany został routing krajowych numerów z tradycyjnej sieci telefonicznej poprzez IAX, natomiast numery telefonów komórkowych, jak też numery 0180 i 0190 nadal wybierane są poprzez zwykłe łącze telefoniczne.
;/etc/asterisk/extensions.conf
[default]
exten => 123456,1,Dial(Zap/g1/${EXTEN})
[extern]
exten => _01[6-9]X.,1,Dial(Zap/g2/${EXTEN})
exten => _X.,1,Dial(IAX2/user:password@iaxprovider/${EXTEN})
exten => _X.,2,Dial(Zap/g2/${EXTEN})
Wszystko, co nie zaczyna się od 01[6-9]X, wybierane jest poprzez dostawcę IAX. Jeśli to nie zadziała, wtedy włączy się drugi priorytet i połączenie zostanie wykonane poprzez zwykłe łącze telefoniczne.
Teraz można dać upust niczym nieograniczonej fantazji i odpowiednio do zachcianek i humoru zadać mniej lub bardziej skomplikowane regułki.

7. Poczta głosowa

Dzięki Astrisk nie trzeba już posiadać zewnętrznej automatycznej sekretarki. Odpowiednia aplikacja, która przejmie jej funkcję, nosi nazwę VoiceMail.
VoiceMail można najprościej zainstalować w następujący sposób.
Najpierw w pliku /etc/asterisk/voicemail.conf informujemy Asterisk o istnieniu głosowej skrzynki pocztowej (voicemailbox) dla danego użytkownika:
;/etc/asterisk/voicemail.conf
[default]
123456 => 123456, automatyczna sekretarka
Następnie umieszczamy odpowiedni wpis w pliku extensions.conf:
;/etc/asterisk/extensions.conf
[default]
exten => 123456,1,Dial(Zap/g1/${EXTEN},30)
exten => 123456,2,VoiceMail(u123456)
Telefon dzwoni przez 30 sekund. Jeśli nikt nie odbierze słuchawki, wtedy odtworzona zostanie standardowa wiadomość i dzwoniący będzie mógł zostawić wiadomość. Zostanie ona zapisana w pliku /var/spool/asterisk/voicemail/default/123456/INBOX, w formie dwóch plików WAV oraz jednego pliku GSM.
Niniejsze pliki można będzie odtworzyć za pomocą MPlayera albo innego programu bądź bezpośrednio odsłuchać z telefonu. Aby to uczynić, w pliku extensions.conf trzeba dokonać kolejnego wpisu:
;/etc/asterisk/extensions.conf
[extern]
exten => 99999,1,VoicemailMain(s123456)
Jeśli teraz wybierzemy numer 99999, znajdziemy się w systemie poczty głosowej i po wciśnięciu 1 będziemy mogli odsłuchać wiadomości.
Aplikacja VoiceMail może być również „nadużywana” w celu nagrywania, w najprostszy sposób, własnych dźwięków w formacie GSM, bez potrzeby korzystania z programów do nagrywania i konwersji dźwięku. Do pliku extensions.conf wpisujemy wówczas tylko rozszerzenie, które zawsze wywoła aplikację VoiceMail, i już możemy wygodnie nagrywać własne zapowiedzi za pomocą telefonu. Oczywiście można dyskutować nt. ich jakości.
Przekierowanie połączenia na telefon komórkowy, jeszcze przed włączeniem się automatycznej sekretarki, można realizować w bardzo prosty sposób. Najpierw należy nagrać własny plik dźwiękowy z zapowiedzią wspomnianego przekierowania. Nazwijmy go przekierowanie.gsm. Potem należy go skopiować do /var/lib/asterisk/sounds. Następnie w pliku extensions.conf zapisujemy co następuje, przy czym numer 017123456 jest numerem naszego telefonu komórkowego.
;/etc/asterisk/extensions.conf
[default]
exten => 123456,1,Dial(Zap/g1/${EXTEN},30)
exten => 123456,2,Playback(przekierowanie)
exten => 123456,3,Dial(Zap/g2/017123456,30)
exten => 123456,4,VoiceMail(u123456)
Automatyczna serkretarka włączy się dopiero wtedy, gdy nikt nie odbierze telefonu domowego oraz telefonu komórkowego. W przypadku takiego rozwiązania należy zwrócić uwagę na to, że przekierowanie na telefon komórkowy związane jest z opłatami, ponieważ następuje ono poprzez nasze własne łącze. Dlatego telefon komórkowy należy odbierać tylko w przypadku ważnych spraw ;-).
Istnieje dużo innych możliwości korzystania z poczty głosowej, np. Asterisk dostarcza interfejs WWW, przez który możliwe jest jej odsłuchiwanie. Można także zlecić przesyłanie wiadomości pocztowych w postaci załącznika pod wskazany adres poczty elektronicznej. Rozwijanie tego tematu wybiegałoby jednak poza ramy niniejszych warsztatów. Zainteresowane osoby powinny odwiedzić stronę www.voip-info.org.

8. Odbieranie faksów

Pomimo poczty elektronicznej i innych możliwości komunikowania się, wciąż żywe jest faksowanie. Zwłaszcza w obszarze działalności gospodarczej, a także w komunikacji z urzędami, posiadanie faksu jest bardzo pomocne.
W przypadku zwykłego łącza opartego na ISDN do dyspozycji mamy trzy numery telefoniczne. Czyż jest coś prostszego, jak tylko wykorzystanie jednego z nich jako numeru faksu? Asterisk potrafi, dzięki odpowiedniej łatce, odbierać faksy oraz w ograniczonym zakresie działać jako nadajnik faksów. Dzieje się tak dzięki emulowaniu faksmodemu. Możliwe jest zatem nawet to, co z technicznego punktu widzenia jest niemożliwe, czyli faksowanie przez DSL.
Jednak rozwiązanie, o którym mowa (faks przez Asterisk) nie jest w 100% stabilne. Przynajmniej w przypadku wysyłania faksów w warunkach domowych zalacałbym skorzystanie z innego oprogramowania np. efax. Dlatego nie będę tutaj bliżej opisywać faksowania.
Aby nauczyć Asterisk odbierania faksów, będziemy potrzebować biblioteki spandsp, której autorem jest Steve Underwood. Jest ona dostępna tutaj. Następnie powinniśmy pobrać łatę i pliki dla Asterisk z serwera ftp.soft-switch.org. Instrukcję instalacji spandsp z Asterisk znaleźć można tutaj.
Aby ponownie skompilować Asterisk, możemy znowu skorzystać z metody przedstawionej w pierwszej części artykułu. Jednak tym razem nie uruchomimy skryptu ./install.sh, lecz najpierw skrypt ./downoload.sh. Następnie powinniśmy skopiować pliki z ftp.soft-switch.org do bristuff-0.2.0-RC8g/asterisk-1.0.7/apps i w tym katalogu nałożyć łatę wydając polecenie: patch -p0 < apps_makefile.patch. Na zakończenie w katalogu bristuff należy uruchomić skrypt ./compile.sh.
Aby teraz odebrać faks, wystarczy tylko określić numer, który będzie znany jako numer faksu (np. 123457). Następnie zakładamy katalog /var/spool/asterisk/fax i do pliku extensions.conf wpisujemy:
;/etc/asterisk/extensions.conf
[default]
exten => 123457,1,SetVar(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID}.tif)
exten => 123457,2,rxfax(${FAXFILE})
exten => 123457,3,Hangup
Jeśli faks zostanie odebrany, wówczas znajdzie się on w katalogu /var/spool/asterisk/fax jako plik TIF. Możliwa jest tu dalsza edycja np. za pomocą skryptu cron można zautomatyzować konwersję faksów do PDF, przesyłanie ich pod wskazany adres pocztowy i / lub automatyczne przesyłanie do drukarki.
Zresztą, tak jak już wcześniej wspomniałem, odbieranie faksów nie musi odbywać się tylko poprzez kartę ISDN, lecz możliwe jest także poprzez Internet. Warunkiem tego jest jednak skorzystanie z kodeka audio G.711 (alaw), który należy dodatkowo wskazać w pliku iax.conf. Inne kodeki, pracujące z kompresją, prowadzą jedynie do tego, że odbierane są śmieci, więc nie można ich stosować z Asterisk.
Tak oto doszliśmy do końca naszego opisu. Z powodu rozległej ilości funkcji mogłem przedstawić jedynie mały wybór możliwości Asterisk. W następnej części zajmiemy się bliżej budową własnej sieci Asterisk, wraz z ENUM. Wyjdziemy więc poza właściwy temat niniejszego artykułu, gdyż nowe zagadnienia dotyczyć będą już raczej obszaru zainteresowań profesjonalistów.
Źródło:
Pro-Linux
Archiwalny news dodany przez użytkownika: wojtek_germ.
Kliknij tutaj by zobaczyć archiwalne komentarze.

Oznaczone jako → 
Share →