Installation von mISDN V2 und LCR (Linux Call Router)

Im Artikel Asterisk PBX habe ich die Installation von mISDN 1.x beschrieben. Leider gab es mit dieser Version von mISDN zunehmend Probleme. Vor allem im Zusammenspiel mit neueren Kerneln konnte man mISDN nicht mehr als stabile Lösung bezeichnen. Die gute Nachricht ist, dass es bereits einen Nachfolger für mISDN gibt: mISDN V2. In diesem Artikel beschreibe ich, was bei einem Update von mISDN auf mISDN V2 beachtet werden muss.

Die Schnittstellen

Bisher war es möglich, mISDN 1.x per chan_misdn direkt mit Asterisk kommunizieren zu lassen. Bisher ist chan_misdn jedoch noch nicht kompatibel zu mISDN V2. Um Asterisk an mISDN anzubinden ist daher ein kleiner „Umweg“ nötig. Für mISDN V2 gibt es einen PBX namens Linux Call Router (LCR). LCR bringt erfreulicher Weise einen Channel Treiber für Asterisk namens chan_lcr mit. Es ergibt sich also folgender Aufbau:

mISDN V2 und LCR

 

Unterstützte Hardware

mISDN V2 unterstützt im Wesentlichen die selbe Hardware, die auch von Version 1.x unterstützt wurde. Eine genaue Liste findet ihrhier. Eine Liste mit ISDN Karten, die den NT Modus unterstützen gibt es hier zu sehen.

 

Die Installation

Diese Anleitung bezieht sich auf Debian (Lenny 5.02) mit Kernel 2.6.26. Sie sollte allerdings weitgehend auch auf andere Distributionen bzw. Versionen anwendbar sein. Zu beachten ist, dass mISDN V2 mit Kerneln < 2.6.24 Probleme machen soll. Bei Kerneln > 2.6.26 ist mISDN V2 bereits im Kernel enthalten. Es muss also nur noch mISDNuser manuell installiert werden.

Voraussetzungen

Um mISDN V2 und LCR installieren zu können, müssen mehrere Pakete installiert sein. Folgende Schritte müssen durchgeführt werden, um unter Debian die Voraussetzungen für mISDN 2 und LCR zu schaffen:

Aktuallieren der Paketlisten

apt-get update

Installieren der Compiler und benötigten Bibliotheken

apt-get install gcc g++ make libncurses5-dev

Installieren der Kernel Sources

apt-get install linux-headers-`uname -r`

 

Um zu verhindern, dass es zu Konflikten mit den alten Hisax Treibern und mISDN kommt, müssen die Hisax Module geblacklistet werden:

echo blacklist hisax >> /etc/modprobe.d/blacklist 
echo blacklist hisax_fcpcipnp >> /etc/modprobe.d/blacklist 
echo blacklist crc_ccitt >> /etc/modprobe.d/blacklist 
echo blacklist capi >> /etc/modprobe.d/blacklist 
echo blacklist kernelcapi >> /etc/modprobe.d/blacklist 
echo blacklist kernel_capi >> /etc/modprobe.d/blacklist
echo blacklist capifs >> /etc/modprobe.d/blacklist
echo blacklist zaptel >> /etc/modprobe.d/blacklist
echo blacklist netjetpci >> /etc/modprobe.d/blacklist
echo blacklist avmfitz >> /etc/modprobe.d/blacklist

 

Hinweis: Beim Update von mISDN 1 auf mISDN 2 ist folgendes zu beachten:

Unter „/etc/modprobe.d“ und „/etc/modules.d“ liegt eine Datei namens „mISDN“ mit folgendem Inhalt:

install hfcmulti /usr/sbin/misdn-init start hfcmulti remove hfcmulti /usr/sbin/misdn-init stop
install hfcpci /usr/sbin/misdn-init start hfcpci remove hfcpci /usr/sbin/misdn-init stop
install hfcsusb /usr/sbin/misdn-init start hfcsusb remove hfcsusb /usr/sbin/misdn-init stop
install hfcsmini /usr/sbin/misdn-init start hfcsmini remove hfcsmini /usr/sbin/misdn-init stop
install xhfc /usr/sbin/misdn-init start xhfc remove xhfc /usr/sbin/misdn-init stop
install avmfritz /usr/sbin/misdn-init start avmfritz remove avmfritz /usr/sbin/misdn-init stop
install w6692pci /usr/sbin/misdn-init start w6692pci remove w6692pci /usr/sbin/misdn-init stop
install sedlfax /usr/sbin/misdn-init start sedlfax remove sedlfax /usr/sbin/misdn-init stop

Diese Datei bewirkt, dass z.B. bei der Eingabe von „modprobe hfcmulti“ nicht das Modul „hfcmulti“ geladen sondern „/usr/sbin/misdn-init start hfcmulti“ ausgeführt wird. In Verbindung mit mISDN V2 führt dies zu diversen Fehlermeldungen. Die Datei muss daher vor dem Update aus beiden Ordnern gelöscht werden! Auch das Script „/usr/sbin/misdn-init“ und dessen Symlink nach „/etc/init.d/misdn-init“ sollten gelöscht werden, um Probleme zu vermeiden.

Damit diese Änderungen aktiv werden, ist nun ein Neustart des Rechners empfehlenswert.

Download der Quellen

Unter http://www.linux-call-router.de/download/  findet man die jeweils aktuelle Version von LCR unb dazu passender Versionen von mISDN und mISDNuser. Ich empfehle diese Versionen von mISDN zu verwenden, weil ich davon ausgehe, dass sie mit der jeweiligen LCR Version getestet wurde. So erspart man sich im Vorfeld Ärger mit inkompatiblen Versionen von mISDN und LCR. Da ich im weiteren Verlauf die Version 1.5 von „lcr“ installieren werde, nutze ich auch die mISDN und mISDNuser-Sourcen aus dem entsprechenden Verzeichnis.

Wir wechseln in das Sourcen Verzeichnis unserer Distribution

cd /usr/src

Download von mISDN

wget http://www.linux-call-router.de/download/lcr-1.5/mISDN_20090602.tar.gz

Download von mISDNuser

wget http://www.linux-call-router.de/download/lcr-1.5/mISDNuser_20090602.tar.gz

Download von LCR 1.5

wget www.linux-call-router.de/download/lcr-1.5/lcr_20090615.tar.gz

Installation von mISDN V2

Zuerst entpacken wir mISDN und mISDNuser mit

tar xvzf mISDN_20090602.tar.gz

und

tar xvzf mISDNuser_20090602.tar.gz

Nun können wir mISDN installieren

cd /usr/src/mISDN
make
make install

und danach mISDNuser

cd /usr/src/mISDNuser
make
make install

 

Installation von LCR 1.5

Entpacken von LCR

cd /usr/src
tar xvzf lcr_20090615.tar.gz

Prüfen der Installationsumgebung und erstellen des Makefiles

cd /usr/src/lcr
./configure

Wichtig für die Erstellung von Chan_lcr:

Mittels beliebigem Texteditor sicherstellen, dass im „Makefile“ in der Zeile „ENABLE_ASTERISK_CHANNEL_DRIVER_TRUE = “ am Ende ein „#“ steht und in der Zeile „ENABLE_ASTERISK_CHANNEL_DRIVER_FALSE =„ am Ende kein weiteres Zeichen steht. Mit dem von mir am 11.07.2009 heruntergeladenen Paket war dies nach „./configure“ der Fall.

Wichtig ist außerdem, dass Asterisk vor LCR installiert wird. Chan_lcr wird sonst nicht installiert!

Installieren von LCR

make
make install

LCR bringt ein Tool namens genrc mit, mit dem sich ein Startscript für mISDN erstellen lässt.

Startscript für mISDN erstellen und mISDN erstmals starten

genrc

This program generates a script, which is used to start/stop/restart mISDN
driver. Please select card only once. Mode and options are given by LCR.

Als erstes wird nach der verbauten Hardware gefragt. Im Gegensatz zu misdn-init bei mISDN 1.x gibt es leider keine automatische Erkennung. In diesem Beispiel gehen wir davon aus, dass nur vom Treiber hfcpci unterstützte Hardware verbaut ist:

Select driver for cards:

(1) HFC PCI (Cologne Chip)

(2) HFC-4S / HFC-8S / HFC-E1 (Cologne Chip)

(3) HFC-S USB (Cologne Chip)

Select driver number[1-n] (or enter ‚done‘): 1

Select another driver for cards:

(1) HFC PCI (Cologne Chip)

(2) HFC-4S / HFC-8S / HFC-E1 (Cologne Chip)

(3) HFC-S USB (Cologne Chip) 

Select driver number[1-n] (or enter ‚done‘): done

 

Als nächstes wird der zu verwendende Codec abgefragt. Wir können den Standardwert 0 für a-LAW bestätigen.

Enter LAW audio mode. For a-LAW (default), just enter 0. For u-LAW enter 1.

[0..n | 0xn]: 0

Die folgenden Einstellungen sind nur für Debugging erforderlich und können mit 0 bestätigt werden

Enter debugging flags of mISDN core. For no debug, just enter 0. 

[0..n | 0xn]: 0 

Enter debugging flags of cards. For no debug, just enter 0. 

[0..n | 0xn]: 0 

Enter dsp debugging flags of driver. For no debug, just enter 0. 

[0..n | 0xn]: 0

Die nächste Abfrage nach dem Pfad, in dem die Module liegen, kann man getrost ignorieren. Der Standardpfad existiert zwar nicht, diese Angabe scheint aber keinen Einfluss die Funktionstüchtigkeit des Scripts zu haben.

Where do you like to load the modules from, enter 0 for default, 1 for

‚/usr/local/lcr/modules/‘ or the full path. 

[0 | 1 | <path>]: 0

Zuletzt muss der Pfad für das Init-Script angegeben werden. Bei Debian liegen diese Scripts im Ordner „/etc/init.d“

Finally tell me where to write the mISDN rc file.
Enter the name ‚mISDN‘ for current directory. 

You may want to say ‚/usr/local/lcr/mISDN‘ or ‚/etc/rc.d/mISDN‘

: /etc/init.d/mISDN

File ‚/etc/init.d/mISDN‘ is written to the current directory.

Leider verisht genrc das Script nicht mit den korrekten Berechtigungen. Dies beheben wir mit

 chmod 755 /etc/init.d/mISDN

Nun können wir mISDN zum ersten Mal starten

/etc/init.d/mISDN start

Um zu prüfen, ob mISDN einwandfrei arbeitet, sollte zuerst das Systemprotokoll überprüft werden:

dmesg

Die letzten Zeilen sollten so oder so ähnlich aussehen (abhängig von der verbauten Hardware):

[515542.579479] Modular ISDN core version 1.1.21
[515542.579479] NET: Registered protocol family 27
[515542.589732] DSP modul 2.0
[515542.589744] mISDN_dsp: DSP clocks every 64 samples. This equals 2 jiffies.
[515542.605173] mISDN_hfcpci: found adapter CCD/Billion/Asuscom 2BD0 at 0000:04:00.0
[515542.605188] mISDN: HFC-PCI driver 2.0
[515542.605218] HFC-PCI: defined at mem 0xf89c2c00 fifo 0xf7ba8000(0x37ba8000) IRQ 20 HZ 250
[515542.605720] HFC 1 cards installed
[515542.607492] mISDN_hfcpci: found adapter CCD/Billion/Asuscom 2BD0 at 0000:04:01.0
[515542.607492] mISDN: HFC-PCI driver 2.0
[515542.607492] HFC-PCI: defined at mem 0xf8b84800 fifo 0xf7b60000(0x37b60000) IRQ 21 HZ 250
[515542.607492] HFC 2 cards installed 

Zusätzlich können wir das Tool misdn_info verwenden, um die Funktionstüchtigkeit von mISDN zu überprüfen:

misdn_info

Dies Ausgabe sollte dann in etwas so aussehen:

Found 2 ports
  Port  0 'hfc-pci.1':       TE/NT-mode BRI S/T (for phone lines & phones)
                              2 B-channels: 1-2
                                B-protocols: RAW HDLC X75slp L2:DSP L2:DSPHDLC
  --------
  Port  1 'hfc-pci.2':       TE/NT-mode BRI S/T (for phone lines & phones)
                              2 B-channels: 1-2
                                B-protocols: RAW HDLC X75slp L2:DSP L2:DSPHDLC

Als nächstes brauchen wir ein Startscript für LCR selbst. Dieses ist leider nicht in den Quellen enthalten und muss manuell angelegt werden. Folgendes Script hat sich bei meiner Installation bewährt:

Download LCR Startscript

Um das Script zu installieren, sind folgende Schritte notwendig:

cd /etc/init.d
wget  https://www.gsurf.de/fileadmin/content/downloads/lcr
chmod 755 /etc/init.d/lcr

Funktionstest

Wir können jetzt LCR zum ersten Mal starten:

/etc/init.d/lcr start

Um den Status von LCR zu überwachen, ruft man das mitgelieferte Tool lcradmin wie folgt auf:

lcradmin state

Vorausgesetzt, an der richtigen Karte ist über ein gekreuztes ISDN-Kabel (nicht normales Netzwerkkabel!!!) ein NTBA angeschlossen (der auch Netzspannungsmäßig angeschlossen ist), dann sollte bei einem am NTBA angeschlossenen Telefon beim Abnehmen des Hörers in etwa folgender Text zu hören sein:

„There is no extension created for your MSN number.“

Dieser Fehler kommt dadurch zustande, dass wir die LCR Konfiguration noch nicht unseren Bedürfnissen angepasst haben und kann vorerst ignoriert werden.

 

Abschließen der Installation

Damit nun sowohl mISDN als auch lcr zukünftig bei jedem Systemstart automatisch gestartet werden sind die nachfolgenden Schritte erforderlich:

mISDN:

update-rc.d mISDN defaults 18 22

update-rc.d: warning: /etc/init.d/mISDN missing LSB information

update-rc.d: see http://wiki.debian.org/LSBInitScripts

Adding system startup for /etc/init.d/mISDN …

/etc/rc0.d/K22mISDN -> ../init.d/mISDN

/etc/rc1.d/K22mISDN -> ../init.d/mISDN

/etc/rc6.d/K22mISDN -> ../init.d/mISDN

/etc/rc2.d/S18mISDN -> ../init.d/mISDN

/etc/rc3.d/S18mISDN -> ../init.d/mISDN

/etc/rc4.d/S18mISDN -> ../init.d/mISDN

/etc/rc5.d/S18mISDN -> ../init.d/mISDN

LCR:

update-rc.d lcr defaults

Adding system startup for /etc/init.d/lcr ... 

/etc/rc0.d/K20lcr -> ../init.d/lcr 

/etc/rc1.d/K20lcr -> ../init.d/lcr 

/etc/rc6.d/K20lcr -> ../init.d/lcr 

/etc/rc2.d/S20lcr -> ../init.d/lcr 

/etc/rc3.d/S20lcr -> ../init.d/lcr 

/etc/rc4.d/S20lcr -> ../init.d/lcr 

/etc/rc5.d/S20lcr -> ../init.d/lcr

 

Um nun abschließend zu testen, ob auch nach einem Neustart des Rechners alles ohne manuellen Eingriff startet:

reboot

Nach Start des Rechners sollte beim Abnehmen des Hörers wiederum in etwa folgender Text zu hören sein:

„There is no extension created for your MSN number.“

Herzlichen Glückwunsch: mISDN und lcr wurden erfolgreich installiert!

Anbindung an Asterisk

Damit Asterisk über LCR mit der Außenwelt kommunizieren kann, muss zuerst die Konfiguration des LCR angepasst werden. LCR wird mit Hilfe von mehreren .conf File konfiguriert, die sich m Ordner „/usr/local/lcr“ befinden. Die wichtigsten Einstellungen werden in den Dateien „interfaces.conf“ und „routing.conf“ getätigt. In der Datei „interfaces.conf“ werden die einzelnen logischen Schnittstellen bzw. Portgruppen vom LCR konfiguriert. In diesem Beispiel verfügen wir über die beiden Ports 0 und 1. Ein Port wird hierbei jeweils durch eine PCI ISDN Kartne mit hfc-s Chipsatz abgebildet. Wir wollen Port 0 für die Anbindung an das Netz unseres Telefonanbieters nutzen. An Port 1 wollen wir ISDN Endgeräte anschließen. Dafür müssen wir ihn für den NT Modus konfigurieren. Um zu verhindern, dass LCR die führenden Nullen von Rufnummern abschneidet, fügen wir zusätzlich zwei screen-in Einträge hinzu. Eine Minimalkonfiguration, die diese Voraussetzungen erfüllt könnte dann so aussehen:

interfaces.conf

[misdnextern]
portnum 0
screen-in national % 0%
screen-in international % 00%

[misdnintern]
portnum 1
nt

Damit LCR Anrufe über chan_lcr zu Asterisk routet, müssen hierfür erst entsprechende Regeln in der Datei routing.conf hinzugefügt werden. In diesem Beispiel routen wir alle Anrufe, die auf einer Schnittstelle eingehen, direkt zu Asterisk bzw. zu chan_lcr weiter. LCR wird nur als Schnittstelle zu Asterisk genutzt. Der Context, in dem die Anrufe in Asterisk landen ist – sofern nicht anders angegeben – gleich dem Namen der jeweiligen Schnittstelle. In diesem Fall werden Anrufe, die auf der internen Schnittstelle eingehen, im Contect misdnintern ausgeführt. Anrufe, die von extern kommen, laden entsprechend im Context misdnextern. Im Beispiel routen wir alle Anrufe, die von der internen Schnittstelle kommen auf die Extension 0. Hierbei handelt es sich um ein Workaround um ein Overlap Dialing zu realisieren. Ohne Overlap Dialing könnte an einem Endgerät die Telefonnummer nicht schrittweise eingegeben werden. Asterisk würde in diesem Fall nach Eingabe der ersten Ziffer anfangen zu wählen. Unter Berücksichtigung dieser Voraussetzungen sieht die entsprechende Minimalkonfiguration so aus:

routing.conf

[main]
remote=asterisk interface=misdnintern : remote application=asterisk exten=0
remote=asterisk interface=misdnextern : remote application=asterisk
default : efi

Schlussendlich muss nun noch Asterisk selbst konfiguriert werden. Damit Asterisk Anrufe vom LCR empfamgen und an diesen weitergeben kann, sind entsprechende Anpassungen an der Datei extensions.conf notwendig. So könnten die entsprechenden Einträge aussehen:

extensions.conf

 [misdnintern]

;Simuliertes overlap dialing
;----------------------------------------------
exten => 0,1,WaitExten(3)
exten => t,1,WaitExten(3)
;----------------------------------------------

;Wenn Extension vorhanden, weiter nach default
exten => _X.,1,Dial(LCR/misdnextern/${EXTEN})

[misdnextern]
exten => _X.,1,Dial(SIP/2000)

Wie man sieht, werden die Anrufe, die intern auf der Extension 0 ankommen (siehe routing.conf) noch mit einer richtigen Extension versehen. Alle eingehenden Anrufe werden in diesem Beispiel an den SIP Teilnehmer 2000 weitergeleitet.

5.00 avg. rating (95% score) - 1 vote

3 Gedanken zu “Installation von mISDN V2 und LCR (Linux Call Router)

  1. really nice tutorial.
    i am running wheezy and i am trying to install through git.
    misdn and misdnuser installs correctly, but lcr fails and gives me the following error:
    chan_lcr.c: At top level:
    chan_lcr.c:3318:2: warning: initialization makes pointer from integer without a cast [enabled by default]
    chan_lcr.c:3318:2: warning: (near initialization for ‚lcr_tech.capabilities‘) [enabled by default]
    chan_lcr.c:3320:15: error: ‚lcr_request‘ undeclared here (not in a function)
    chan_lcr.c:3331:2: warning: initialization from incompatible pointer type [enabled by default]
    chan_lcr.c:3331:2: warning: (near initialization for ‚lcr_tech.call‘) [enabled by default]
    chan_lcr.c: In function ‚load_module‘:
    chan_lcr.c:3520:24: warning: assignment makes pointer from integer without a cast [enabled by default]
    make[2]: *** [chan_lcr.po] Error 1
    make[2]: Leaving directory `/usr/src/lcr‘
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory `/usr/src/lcr‘
    make: *** [all] Error 2

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Spamschutz * Time limit is exhausted. Please reload the CAPTCHA.