Workshop Asterisk: Verbindung zu ISDN

22.02.2006 von STEFAN RUBNER 
In Deutschland ist Telefonie nahezu gleichbedeutend mit ISDN. Auch Asterisk unterstützt dieses Kommunikationsvehikel - wenn auch erst nach einiger Überredung. In diesem Workshop-Teil zeigen wir Ihnen, wie Sie Asterisk und ISDN unter einen Hut bringen.

Genau genommen ist ISDN nach wie vor ein auf Deutschland beschränktes Phänomen. Da verwundert es auch nicht, dass es ausgerechnet zwei deutsche Firmen sind, die sich bei der ISDN-Unterstützung in Asterisk hervortun: Junghanns und Beronet. Beide mit Sitz in Berlin und pikanter Weise einander nicht unbedingt wohl gesonnen.

So passt es denn auch gut ins Bild, dass sie jeweils unterschiedliche Mittel wählen, um Asterisk und ISDN zusammen zu bringen. Dies gilt sowohl für die einfachen ISDN-Karten mit einem S0-Bus wie auch für die größeren Produkte, die sogar die Anbindung an einen Primärmultiplex-Anschluss erlauben.

Beronet setzt bevorzugt auf das mISDN-Modul chan_misdn, das seinerseits auf dem inzwischen im Linux-Kernel enthaltenen ISDN4Linux sowie dem extern entwickelten mISDN-Paket aufbaut. Allerdings ist für dessen Einsatz ein manuelles Übersetzen der Kernel-Module notwendig, was zeitraubend und aufwändig ist.

Wer diesen Aufwand nicht treiben will, weicht besser auf das von Junghanns favorisierte Verfahren und den zugehörigen Treiber chan_capi aus. Dieser setzt für einfache Karten auf der in SUSE Linux 10.0 enthaltenen CAPI auf - bietet aber im Gegensatz zur Beronet-Lösung keine Möglichkeit, auch einen internen S0-Bus bereit zu stellen. Für die hauseigenen Multiport-Adapter und größere Produkte bietet Junghanns einen eigenen Treiber an, Beronet unterstützt auch seine baugleichen Multiport-Produkte über den mISDN-Treiber.

Aufwands- und Bedarfsabschätzung

Welchen Weg sie wählen hängt - zumindest in der Theorie - vor allem vom geplanten Einsatz ab. Ist lediglich ein ISDN-Anschluss vorhanden und genügt es Ihnen, die eingehenden Anrufe auf im lokalen Netz integrierte SIP-Telefone - egal ob Software oder Hardware - zu verteilen, dann können Sie getrost die CAPI-basierte Variante von Junghanns einsetzen.

Wollen Sie hingegen auch einen internen ISDN-Bus zum Anschluss von bereits vorhandenen ISDN-Telefonen oder einer ISDN-Telefonanlage zur Verfügung stellen, steht Ihnen deutlich mehr Aufwand ins Haus. In diesem Fall gibt es wiederum zwei Möglichkeiten der Realisierung: Sie können es mit zwei einfachen ISDN-Adaptern versuchen oder gleich eine der größeren Hardware-Lösungen von Beronet oder Junghanns einsetzen.

Genügen Ihnen zwei ISDN-Adapter müssen Sie darauf achten, dass maximal einer davon eine Fritz-Card von AVM ist. Diese unterstützt nämlich den für die Bereitstellung eines internen ISDN-Busses notwendigen NT-Modus nicht. Dieser wird ausschließlich von Karten mit HFC-Chipsatz angeboten, wie beispielsweise der Billion BiPAC PCI Card.

Benötigen Sie mehr als zwei ISDN-Busse, sollten Sie auf jeden Fall zu einer Multiport-Karte greifen. Zwar kosten diese rund 700 Euro, belegen aber weniger Slots und erzeugen auch eine deutlich geringere Interrupt-Last auf dem Server als mehrere Billigkarten. Zudem erlauben Sie im Bedarfsfall eine Erweiterung nach oben, was beim Einsatz von Single-Port-Adaptern schnell zu einem schwierigen Unterfangen wird.

Die einfache Variante

Für SOHO-Umgebungen mit einem einzelnen ISDN-Anschluss beschreiben wir den Anschluss von Asterisk an das ISDN-Netz per chan_capi. Dazu laden Sie sich die aktuelle Version des Moduls - derzeit 0.4.0-PRE1 - von www.junghanns.net herunter und entpacken es.

Bevor es an das Übersetzen geht, ist allerdings noch eine Änderung im Makefile des Moduls vorzunehmen: Die Zeile CFLAGS+=-DCVS_HEAD ist mit einem Kommentar zu versehen, da in diesem Workshop eine Release-Version von Asterisk verwendet wird. Das Übersetzen und Einrichten des Moduls erfolgt dann mit dem Befehl make install. Bei dieser Aktion wird automatisch auch die zum Modul gehörende Konfigurationsdatei capi.conf in das passende Verzeichnis kopiert.

Damit ist das Einrichten des Moduls erledigt und Sie können Asterisk mittels asterisk -vvvc starten. Geben Sie nun auf der Befehlszeile capi info ein, erhalten Sie eine Meldung über den vom Modul erkannten ISDN-Controller sowie die auf diesem verfügbaren B-Kanäle.

ISDN-Test

Haben Sie die ISDN-Karte bereits mit Ihrem NTBA verbunden, können Sie jetzt einen Probeanruf starten. Sie landen im aus dem ersten Abschnitt des Workshops bekannten Demo-Menü. Damit ist die generelle Funktion gesichert und es kann an die Konfiguration gehen.

Bislang landen nämlich alle eingehenden Anrufe im Default-Kontext, weshalb Sie beim ersten Test auch die bereits bekannten Ansagen hören. Außerdem nimmt Asterisk jeden eingehenden Ruf an, was bei einer parallel am NTBA angeschlossenen Telefonanlage eventuell gar nicht erwünscht ist.

Zumindest dieses Verhalten ist schnell abgestellt. In der capi.conf findet sich eine Zeile, mit deren Hilfe Sie chan_capi mitteilen, auf welche MSN es reagieren soll. Tragen Sie in der Zeile, die mit incomingsn = beginnt, an Stelle des Sterns die gewünschten MSNs durch Kommata getrennt ein.

Weiterleitung an SIP-Phones

Um die eingehenden Rufe an unser zuvor eingerichtetes SIP-Softphone zu leiten, benötigen wir einen entsprechenden Eintrag in extensions.conf. Per Default leitet chan_capi eingehende Gespräche in den Kontext capi-in weiter, also legen wir diesen einfach an:

[capi-in]

exten = 12345,1,Dial(SIP/test.user1,30)

exten = 12346,1,Dial(SIP/test.user1,30)

exten = t,1,Hangup

Beachten Sie, dass Sie bei einem Mehrgeräteanschluss die komplette Rufnummer ohne Vorwahl, bei einem Anlagenanschluss jedoch nur die jeweilige Durchwahl als Extension verwenden. Eingehende Rufe landen nun alle auf dem SIP-Softphone. Hebt dort 30 Sekunden lang niemand ab, wird die Verbindung automatisch getrennt.

Ausgehende ISDN-Rufe

Nun treiben wie das Call-Routing einen Schritt weiter: Statt einfach alle ausgehenden Gespräche des Softphones über den SIP-Provider abzuwickeln, sollen Ortsgespräche über das ISDN-Netz laufen. Dazu sind in der extensions.conf lediglich minimale Änderungen in der Sektion local-sip notwendig:

[local-sip]

exten=666,2,Dial(SIP/test.user1,30)

exten=667,2,Dial(SIP/test.user2,30)

exten=_089.,1,Dial(CAPI/contr1/${EXTEN},30)

exten=_0XX.,1,Dial(SIP/${EXTEN}@sip-out1,30)

exten=_Z.,1,Dial(SIP/${EXTEN}@sip-out1,30)

exten=t,1,Hangup

Dabei müssen wir um ein "Feature" von Asterisk herum arbeiten: Würde die zweite Wählanweisung statt _0XX. die eigentlich ausreichende Maske _0X. verwenden, gingen alle ausgehenden Rufe nach wie vor über den SIP-Provider. Der Grund dafür ist, dass Asterisk nicht die am besten passende sondern die kürzeste verwendbare Maske für die Entscheidung über die anzuwendende Wählregel heranzieht. Sorgen Sie daher dafür, dass die von Ihnen erstellten Regeln zu einem bestimmten Nummernkreis stets die gleiche Länge haben und füllen Sie gegebenenfalls mit Platzhaltern auf.

Least Cost Routing

Wenn Sie viel Zeit und Muße haben, lässt sich mit diesem Verfahren ein sehr ausgefeiltes Least Cost Routing für Call-by-Call erstellen. Allerdings ist das, angesichts der häufig wechselnden Tarife und der unzähligen Tarifoptionen, eine Sisyphus-Aufgabe.

Wollen Sie aber Ihren Benutzern die Möglichkeit geben, selbst einen Call-by-Call-Anbieter auszuwählen, können Sie das über einen kleinen Umweg erreichen. Dazu tragen Sie einfach die folgende Zeile zusätzlich in [local-sip] ein:

exten=_000.,1,Dial(CAPI/contr1/${EXTEN:3},30)

Dann können Ihre Benutzer über die Rufnummer 000<Call-by-Call-Vorwahl><Gewünschte Rufnummer> den Anbieter auswählen. Dass beim Wählvorgang die drei führenden Nullen verworfen werden, dafür sorgt die Sonderform ${EXTEN:3} zur Angabe der zu wählenden Nummer. Über das Nachstellen des Doppelpunkts gefolgt von der Drei weisen wir Asterisk an, die ersten drei Stellen der gewählten Nummer zu vergessen.

Ein weiterer wichtiger Punkt ist noch nicht abgehandelt, die Notrufnummer. Nach dem aktuellen Regelsatz würde ein Notruf über SIP abgesetzt. Dies ist allerdings nicht möglich, denn bei Notrufnummern sind einige gesetzliche Regularien zu beachten, die viele VoIP-Anbieter derzeit nicht erfüllen können - Stichwort: Röchelruf. Daher weisen Sie Asterisk an, Rufe an 110 und 112 über ISDN zu versenden:

exten=_11X.,1,Dial(CAPI/contr1/${EXTEN},30)

Sie sollten in diesem Fall darauf achten, die Nummern 110 bis 119 nicht als interne Durchwahlen zu vergeben. Diese sind dank des Notruf-Eintrags nämlich nicht mehr erreichbar.

Ausblick

Mit diesem Teil ist der Asterisk-Server in den Grundzügen schon komplett. Im nächsten Teil zeigen wir Ihnen, wie Sie noch ein paar Sahnehäubchen oben drauf setzen. Beispielsweise durch Einrichtung von Sprach-Mailboxen und Konfiguration der Wartemusik, falls ein Anrufer bei Ihnen in der Warteschleife landet. (mha)