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:
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:
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.
>> update-rc.d: warning: /etc/init.d/mISDN missing LSB information
>> update-rc.d: see http://wiki.debian.org/LSBInitScripts
Der Teil wäre sehr interessant gewesen 😉
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
thank you for the tutorial.. am working on this project of mine hping it to work in my house..sort of.thanks