Seit isdn-11 ist das Teles-Modul zweiteilig; der
"untere" Teil teles.o
ist für die Karte selbst
zuständig. Damit erspart man sich das Herumprobieren in
Config.c
(siehe DOKU)
Möchte man nun mehrere Karten damit betreiben, sollte
in modules.isdn
in etwa folgendes stehen:
-o Tel0 teles.o name=$(cardname Tel0) mem=0xD8000 irq=15 ipl=1
-o Tel1 teles.o name=$(cardname Tel1) mem=0xC8000 irq=14 ipl=2
In isdn.conf
kann man sich dann auf die
Kartnennamen "Tel0" und "Tel1" beziehen.
Was man hierzu wissen muß, in der Dokumentation zu
Linux-ISDN aber nicht so richtig rueberkommt: Das Modul
alaw
wandelt nicht "alaw" (vom ISDN) in linear
codiertes PCM um, wie man vielleicht annehmen möchte.
Es erzeugt signed 8-bit, logarithmisch codierte Werte.
Zur Wandlung von/zu normalem, linearem PCM sind in jedem
Fall tosnd
/toalaw
zu verwenden.
Verwirrend an der ganzen Sache ist, das man die logarithmisch codierten Files zwar einwandfrei abspielen kann, selbstaufgenommenes wegen falscher Codierung jedoch ziemlich unverständlich klingt.
Also: WAV-Files nach signed binary, dann toalaw
drueberlaufen lassen. Diese kann man dann, bei
zugeschaltetem alaw
-Modul, abspielen lassen.
Umgekehrt: Aufgenommene Nachrichten mit tosnd
umwandeln, dann abspielen. (
Johannes Deisenhofer
)
Hier eine Beispiel-Konfiguration, auch von Johannes Deisenhofer :
Folgende Features haben wir eingebaut:
Bei jedem Anruf auf der angegebenen Leitung wird das Anrufbeanworter-Skript gestartet. Dies geschieht sofort, nach der eingestellten Wartezeit (im Beispiel 30 Sekunden) werden dann Daten geliefert. Wir haben das benutzt, um im Anrufbeantworter-Skript eine Nachricht an alle Rechner im LAN zu schicken, mit der Nummer und dem Namen des Anrufers. Auf diese Weise kriegen wir bei jedem Anruf aus dem ISDN einen Popup mit dem Namen des Anrufers... Außerdem loggt das Skript die Anrufe in eine Datei, benennt die Dateien nach der Telefonnummer des Anrufers, schickt eine Mail, etc. Bei uns landen die Anrufe alle in einem Verzeichniss, auf das der HTTP- Daemon Zugriff hat. So kann man sich die Nachrichten komfortabel mit einem HTML-Browser anschauen und anhören.
Das ganze läuft hier unter Version 1.2.9-8 (oder so),
allerdings war dafür ein Patch im master
-Programm erforderlich.
Sonst hat sich der Anrufbeantworter nach dem ersten Anruf
verabschiedet. Meines Wissens ist der Fehler in neueren Versionen
bereits behoben, Matthias Urlichs hat hier auch mal den
entsprechenden Patch gepostet. (Wo iss denn der? hm)
Um hiermit starten zu können, sollte man in
/var/spool
das Verzeichnis fone/
, und
darin die Verzeichnisse ansage/
und
in/
anlegen. In ansage/
kommt eine
Datei, bei uns VOICE
, die die Filenamen der Ansage
enthält. Dann braucht man noch ein Skript work
,
kann man erst mal weglassen. Beschreibung und Beispiel
unten.
Hier der Auszug aus der ISDN-Konfigurationsdatei
# Anrufbeantworter an der Telefonleitung
# Nach 30 Sekunden abheben... auf MSN 59376
R phone * * * root DRi.30 /usr/local/isdn/bin/catfone_v
P phone * * * RXi :vB 8090A3 EFFF9F :lr .9376 :iL
MP phone * * * - alaw
ML phone * * * - transalaw alaw
Ab hier das Shell-Script bin/catfone_v
#!/bin/sh
# Anrufbeantworter-Skript der MvWG Ulm, Johannes Deisenhofer
# sicher nicht perfekt, aber so als Anregung...
# Dieses Skript wird mit folgenden Parametern aufgerufen
# 1) Name des Directorys mit Ansagen, relativ zu /var/spool/fone oder absolut
# 2) Name des Directorys fuer die aufgenommenen Nachrichten
# 3) Name des Scriptes zur Nachbearbeitung der Nachrichten
# Zuerst mal den Pfad zu unseren Utilities anfuegen
PATH=.:/usr/local/isdn/bin:$PATH
# Pfad eines File mit uns bekannten Telephonnummern im
# Format 'Nummer Name <LF>'
PHONENUMBERS=/usr/local/isdn/bin/phonenumbers.txt
set -e
cd /var/spool/fone
pid=$$
# Evtl. Defaultwerte fuer Parameter einsetzen
if test -n "$1" ; then ansage="$1" ; else ansage=ansage ; fi
if test -n "$2" ; then in="$2" ; else in=in ; fi
if test -n "$3" ; then work="$3" ; else work=work ; fi
# Hier wird die Telefonnummer des Anrufers ausgewertet,
# der dazu passende Name aus der Telefonnummerndatei
# geholt, und dann mit dem (selbstgeschriebenen) Utility
# SEND eine Nachricht an die lokalen Rechner geschickt
# Da dieses Skript immer sofort nach dem Anruf gestartet
# wird (aber verzoegert der B-Kanal aufgebaut wird,
# kriegt man bei jedem Anruf ein Popup mit dem Namen des
# Anrufers
if test -n "$PHONE"
then
PHONE="0`echo $PHONE | cut -b 2-99`"
MESSAGE="`egrep $PHONE $PHONENUMBERS|cut -f 2-`"
if test -n "$MESSAGE"
then
MESSAGE="$PHONE ($MESSAGE)"
else
MESSAGE=$PHONE
fi
# send urmel RING "$MESSAGE"
# send case RING "$MESSAGE"
# send struppi RING "$MESSAGE"
else
PHONE="Analog"
fi
# Anruf loggen, mit Datum und Telefonnummer
((date; echo "Anruf auf Voiceleitung, $PHONE") >>/usr/local/isdn/calllog)
# Ansage abspielen: Im angegebenen Verzeichnis
# muss eine Datei VOICE liegen, die die abzuspielenden
# Files auflistet.
# Aufnahme der Ansagen: Zuerst nach signed byte wandeln,
# dann mit toalaw behandeln. Alternativ kann man auch
# einfach selbst den Anrufbeantworter besprechen und die
# Datei dann kopieren
if test -d $ansage ; then
(
cd $ansage
if test -s "VOICE" ; then
files=$(cat VOICE)
else
file=1
files=""
while test -f $file ; do
files="$files $file"
file=$(expr $file + 1)
done
fi
cat $files
)
# Anmerkung :
# Hier steht im Original ein '&', dies fuehrt dazu, das
# waehrend der Ansage bereits aufgenommen wird.
# Laesst man es weg, wird nur der Anfang und das Ende
# der eigenen Ansage aufgenommen, der Rest geht in einem
# Pufferueberlauf unter
fi
# Hier folgt die Aufnahme:
# Zuerst wird ein noch nicht belegter Filename gesucht,
# dazu wird die Endung des Files hochgezaehlt
if test -d $in ; then
file=1
thefile=$in/$PHONE.$file
while test -f $thefile.aiff ; do
file=$(expr $file + 1)
thefile=$in/$PHONE.$file
done
# Umwandlung nach signed 8 Bit
/usr/local/isdn/bin/tosnd 2 > $thefile
# Mail verschicken
if test -s $thefile ; then
echo "Anruf von $MESSAGE: $thefile" | mail -s "Anruf von $MESSAGE" crew
else
rm -f $thefile
exit 0
fi
else
exit 1
fi
# Hiermit wird das work-script angestossen, das
# (nach Beendigung des Anrufes, deswegen Extra-Skript )
# die Konvertierung vornimmt
( $work $thefile >/tmp/outanr 2>&1 ) &
exit 0
Hier folgt noch das Skript
/var/spool/fone/work
: Verwendet das
Sound-Utility SOX
, um ein aiff-File zu erzeugen
(Man muß schließlich auf die Macs Rücksicht nehmen..)
Wer das Fileformat ändert, muss dies auch im
catfone
-Skript tun.
#/bin/sh
/usr/local/bin/sox -t .ub -r 8000 $1 $1.aiff
rm $1
chmod go+r $1.aiff
So, das wars bereits, ich hoffe, ich habe beim Kommentieren nicht zu viele Fehler eingebaut.
Gibt es 3rd Party Tools, z.B. um Statistiken über die angefallenen
Gebuehren zu erstellen ?
Gebührenerfassung unter EuroISDN funktioniert zumindest
mit isdn-1.2.9-8
noch etwas rudimentär. Die Kosten
für eine Verbindung werden erst beim Aktivieren der
nächsten Verbindung zur gleichen Gegenstelle
ausgegeben. Ansonsten hilft ein Skript, das die
COST
-Zeilen aus dem syslog filtert. Folgendes
Skript chlink
verwende ich beispielsweise auf
seneca (Euro-ISDN, daher die "8890"), um etwas
Überblick zu behalten:
#!/bin/sh
# Aufruf: chlink <partner>
# als <partner> ist der Name aus der cf-Datei anzugeben
ISDNLOG=/var/log/isdnlog
CF=/usr/local/isdn/cf
# Nummer aus cf holen
NUMBER=`sed -n 's/^D .* '$1' .*=\([0-9]*\)-\([0-9]*\)\//\1\2/p' $CF`
# damit die entsprechenden Zeilen aus isdnlog ziehen
grep "UP $1\|DOWN $1\|COST $1\|ISDN In .* 8890 .*$NUMBER" $ISDNLOG |\
cut -c1-49,96-180
Da gäbe es z.B. die Möglichkeit, den LOCAL7-Output des syslog in eine Named Pipe zu schicken, aus der ein Skript liest und abhängig von "UP" oder "DOWN" entsprechende Aktionen startet. Man könnte beispielsweise Routen setzen oder löschen, ein X-Fähnchen aufziehen etc.
Ab einer der 30er-Versionen kann mit der RP-Zeile beim UP oder DOWN ein Programm gestartet werden.
Next Chapter, Previous Chapter
Table of contents of this chapter, General table of contents
Top of the document, Beginning of this Chapter