Callback mit VOIP Accounts, Fritzbox 7270 und dtmfbox rc3, Schritt für Schritt
Callback ist eine Funktion, die ich schon lange in der FritzBox vermisse. Umso mehr habe ich mich gefreut, beim google'n die DTMFBox zu finden. Diese ist wirklich ein Super Software Werkzeug um die Callback Funktionalität in die FritzBox zu integrieren.
Wie immer bei Software gibt es aber kleine Stolpersteine, die entsprechend der zu Grunde liegenden Hard- und Software gemeistert werden müssen.
Da ich die Callback Funktion mit einer FritzBox 7072 und zwei VOIP Provider Zugängen bei mir einrichten konnte, möchte ich eine Schritt für Schritt Anleitung hier veröffentlichen.
Ein Problem besteht darin, dass in die Rufnummer in Hotels oder im Ausland oft nicht korrekt übertragen wird und daher kein Callback zu Stande kommt.
Wunsch:
- Callback zum Handy
- Callback-Nummer ändern per DTMF Befehle
- Callback-Nummer ändern per Internet-Zugang zum USB Stick
Zuerst muss in der FritzBox der Telnet Zugang eingeschaltet werden.
Per Telefon:
#96*7* Telnet an
#96*8* Telnet aus
Es ist zu beachten, dass damit schon der Originalzustand der Firmware der FritzBox verändert wird und AVM keinen Support mehr leistet.
Für die folgende Anleitung kann ich natürlich keine Gewähr bieten und jeder handelt auf seine eigene Verantwortung.
Nach den Änderungen soll folgendes möglich sein.
Anruf mit dem Handy auf acc1 ( Carpo-Lidl Rufnummer(MSN)). Rückruf zum Handy auch wenn die Handynummer im Ausland nicht richtig übertragen wurde.
- Pin eingeben und mit '#' abschließen. Telefonnummer wählen und mit '#' abschließen. Telefonieren.
- '*' eingeben, Pin eingeben und mit '#' abschließen. Neue Rückrufnummer eingeben und mit '#' abschließen. Rückrufnummer für Callback Regel 3 wird geändert.
- Anruf von irgendeinem Telefon auf acc1 ( Carpo-Lidl Rufnummer(MSN)). Rückruf , aber nur möglich, wenn die Nummer richtig übertragen wurde.
- Pin eingeben und mit '#' abschließen. Telefonnummer wählen und mit '#' abschließen. Telefonieren.
- '*' eingeben, Pin eingeben und mit '#' abschließen. Neue Rückrufnummer eingeben und mit '#' abschließen. Rückrufnummer für Callback Regel 3 wird geändert.
- Anruf von irgendeinem Telefon auf acc2 ( 1und1 Rufnummer(MSN)).
Rückruf über acc1 (Carpo-Lidl Rufnummer (MSN)) zur gespeicherten Rückrufnummer, die unabhängig von dem benutzten (anrufenden ) Telefon ist.
- Pin eingeben und mit '#' abschließen. Telefonnummer wählen und mit '#' abschließen. Telefonieren.
- '*' eingeben, Pin eingeben und mit '#' abschließen. Neue Rückrufnummer eingeben und mit '#' abschließen. Rückrufnummer für Callback Regel 3 wird geändert.
- Ändern der Rückrufnummer per Internet Zugriff auf den USB Stick. Dazu muss der Zugriff in der Fritxbox ermöglicht werden ( Erweiterte Einstellungen - USB - Geräte - USB-Speicher ). Passwort-Einrichtung notwendig. Danach kann man auf den USB-Stick vom Internet zugreifen. Es wird die aktuelle IP benötigt. Diese kann man per eine der Callback Methoden erfahren, die oben beschrieben sind.
Danach einfach die Datei 'callback.cfg' ersetzen oder ändern.
- Callback Nummer anwählen ( siehe oben ). Rückruf abwarten.
- '*' eingeben
- '*' eingeben
- Aktuelle IP wird zweimal angesagt.
Folgendes in die Adresszeile des Browsers eingeben: 'ftp://ftpuser:AKTUELLES_PASSWORT@AKTUELLE_IP' z.B 'ftp://ftpuser:[email protected]'.
System-Voraussetzungen:
- FRITZ!Box Fon WLAN 7270 (UI) Firmware-Version 54.04.67
- USB Stick am FrtzBox USB-Anschluss
- DTMFBox-0.5.0-rc3 USB Version
Zugänge ( können natürlich auch andere sein; aber mit diesen klappt es bei mir:
1&1 Doppel-FLAT 16000
Carpo-Lidl ( Mobilfunk 9 Cent/Min , günstige Tarife ins Ausland )
Telnet-Anwendung in Windows XP starten:
Code:
„Start-Button – Ausführen – Eingeben: 'telnet 192.168.178.1' – OK“
Telnet-Fenster sollte sich öffnen. Falls in der FritzBox ein Password angelegt wurde, muss das jetzt eingegeben werden.
Installation der DTMFBox:
Mit der Fritzbox 7270 funktioniert das Entpacken leider nicht korrekt, daher musste ich die Installation von bodega leicht ändern.
Bitte beachten, den Platzhalter „
USB_STICK_NAME“ mit dem tatsächlichen Namen des USB-Sticks zu ersetzten ( Kann man im Windows Explorer ablesen. z.B: UT-165USB2FlashStorage-00 ).
Code:
cd /var/media/ftp/*
wget http://fritz.v3v.de/busybox/busybox
chmod +x busybox
wget http://fritz.v3v.de/dtmfbox/dtmfbox-usb/dtmfbox-0.5.0-rc3.tar.gz
./busybox tar xvz -f dtmfbox-0.5.0-rc3.tar.gz
rm busybox
cd dtmfbox-0.5.0-rc3
./rc.dtmfbox install usb /var/media/ftp/USB_STICK_NAME/dtmfbox-0.5.0-rc3
./rc.dtmfbox start_httpd
Danach steht einem das WebInterface der dtmfbox zur Verfügung.
http://fritz.box:6767
Einstellungen:
Ich habe folgende Einstellungen vorgenommen.
Alle Eingaben werde ich als Text-Editor Anzeigen einstellen. Kann natürlich auch über die Eingabemasken erfolgen. Das Resultat sollte dann aber dem Angezeigten entsprechen. Telefonnummern müssen natürlich angepasst werden.
Basiseinstellungen - VOIP - Deaktiviert
Code:
[voip]
voip=0 // <b>VoIP</b> [OPTION:1|aktiviert,0|deaktiviert] [ONCHANGE:set_group('DIV_VOIP_ACTIVE', 'voip_voip', '1')]
// [HTML:<div ID='DIV_VOIP_ACTIVE'>]
voip_registrar=1 // Registrar-Modus [OPTION:1|aktiviert,0|deaktiviert] [ONCHANGE:set_group('DIV_VOIP_REGISTRAR_MODE', 'voip_voip_registrar', '1')]
// [HTML:<div ID='DIV_VOIP_REGISTRAR_MODE'>]
voip_max_clients=4 // Registrar-Modus: Max. Clients [OPTION:0|0,1|1,2|2,3|3,4|4,5|5,6|6,7|7,8|8,9|9,10|10]
voip_realm=fritz.box // Registrar-Modus: Authentication-Realm [WIDTH:250px]
// [HTML:</div><script>set_group('DIV_VOIP_REGISTRAR_MODE', 'voip_voip_registrar', '1')</script>]
voip_udp_port=5061 // SIP Port [WIDTH:50px]
voip_rtp_start=4000 // RTP/RTCP Start-Port [WIDTH:50px]
voip_rtp_max=4 // Max. Anzahl an RTP/RTCP Ports [OPTION:0|0,1|1,2|2,3|3,4|4,5|5,6|6,7|7,8|8,9|9,10|10,11|11,12|12,13|13,14|14,15|15,16|16,17|17,18|18,19|19,20|20]
voip_register_interval=3600 // Registrierungs-Intervall (in sec) [WIDTH:50px]
voip_keep_alive=180 // Keep-Alive alle X sec senden (0=aus) [WIDTH:50px]
voip_use_vad=0 // VAD (silence detection) [OPTION:1|aktiviert,0|deaktiviert]
voip_ip_addr= // IP-Adresse des Interfaces (optional) [WIDTH:250px]
voip_stun= // STUN-Server [WIDTH:250px]
voip_stun_port=3478 // STUN-Port [WIDTH:50px]
voip_ice=1 // ICE [OPTION:1|aktiviert,0|deaktiviert]
voip_nameserver= // Nameserver (max. 4, Komma-getrennt) [WIDTH:250px]
voip_codecs=g711 // Codecs (g711, speex, gsm, Komma-getrennt) [WIDTH:250px]
voip_allow_unknown=0 // Ereignis auslösen, bei unbekannten Accounts? (nicht ändern!) [HIDE:1]
// [HTML:</div><script>set_group('DIV_VOIP_ACTIVE', 'voip_voip', '1')</script>]
Basiseinstellungen - CAPI - keine Änderung zum Originalzustand
Code:
[capi]
capi_controller=1,4,3,5 // Listen CAPI-Controller. Komma getrennt
capi_int_prefix= // Landesvorwahl (z.B. 0049) [WIDTH:50px]
capi_nat_prefix= // Ortsvorwahl (z.B. 203) [WIDTH:50px]
capi_ulaw=0 // Alaw=0, Ulaw=1 (nicht ändern!) [HIDE:1]
capi_allow_unknown=0 // Ereignis auslösen, bei unbekannten Accounts? [HIDE:1]
Basiseinstellungen - ACC1 und ACC2
Ich habe insgesamt 5 VOIP Rufnummern in der FritzBox eingetragen. 4 von 1und1 , eine von Carpo-Lidl. Eine von 1und1 und die Carpo-Lidl ist keinem Telefoniegerät zugewiesen.
Code:
[acc1]
active=1 // <b>Account</b> [OPTION:1|aktiviert,0|deaktiviert] [ONCHANGE:set_group('DIV_ACC1_ACTIVE', 'acc1_active', '1')]
// [HTML:<div ID='DIV_ACC1_ACTIVE'>]
name=Carpo Callback // Name [WIDTH:250px]
number=4#47416632 // Rufnummer [WIDTH:250px]
type=capi // Account-Typ [OPTION:capi|capi,voip|voip] [ONCHANGE:set_group('DIV_ACC1_TYPE_CAPI', 'acc1_type', 'capi'); set_group('DIV_ACC1_TYPE_VOIP', 'acc1_type', 'voip')]
// [HTML:<div ID='DIV_ACC1_TYPE_CAPI'><br><script>show_title('CAPI')</script>]
capi_controller_out=5 // Standardcontroller (ausgehende Verbindung): [OPTION:1|1,2|2,3|3,4|4,5|5]
// [HTML:</div><script>set_group('DIV_ACC1_TYPE_CAPI', 'acc1_type', 'capi')</script><div ID='DIV_ACC1_TYPE_VOIP'><br><script>show_title('VoIP')</script>]
voip_registrar= // Registrar-Server [WIDTH:250px]
voip_realm= // Registrar-Realm (oder *) [WIDTH:250px]
voip_user= // Username [WIDTH:250px]
voip_pass= // Passwort [WIDTH:250px] [TYPE:password]
voip_do_not_register=0 // Registrieren [OPTION:0|ja,1|nein]
voip_proxy= // (Optional) Proxy [WIDTH:250px]
voip_id= // (Optional) ID [WIDTH:250px]
voip_contact= // (Optional) Contact [WIDTH:250px]
// [HTML:</div><script>set_group('DIV_ACC1_TYPE_VOIP', 'acc1_type', 'voip')</script><br><script>show_title('Registrar-Login')</script>]
registrar_active=0 // Registrar-Login [OPTION:1|aktiviert,0|deaktiviert] [ONCHANGE:set_group('DIV_ACC1_REGISTRAR', 'acc1_registrar_active', '1')]
// [HTML:<div ID='DIV_ACC1_REGISTRAR'>]
registrar_user= // Username [WIDTH:250px]
registrar_pass= // Passwort [WIDTH:250px] [TYPE:password]
// [HTML:</div><br><script>set_group('DIV_ACC1_REGISTRAR', 'acc1_registrar_active', '1');show_title('Internes Menü')</script>]
menu_entry=menu:main // Einstiegsmenü [WIDTH:250px]
menu_keycode=*610 // Interne Kurzwahl [WIDTH:50px]
// [HTML:</div><script>set_group('DIV_ACC1_ACTIVE', 'acc1_active', '1')</script>]
[acc2]
active=1 // <b>Account<b> [OPTION:1|aktiviert,0|deaktiviert] [ONCHANGE:set_group('DIV_ACC2_ACTIVE', 'acc2_active', '1')]
// [HTML:<div ID='DIV_ACC2_ACTIVE'>]
name=1und1 Raus und Callback Raus // Name [WIDTH:250px]
number=3#4703781 // Rufnummer [WIDTH:250px]
type=capi // Account-Typ [OPTION:capi|capi,voip|voip] [ONCHANGE:set_group('DIV_ACC2_TYPE_CAPI', 'acc2_type', 'capi'); set_group('DIV_ACC2_TYPE_VOIP', 'acc2_type', 'voip')]
// [HTML:<div ID='DIV_ACC2_TYPE_CAPI'><br><script>show_title('CAPI')</script>]
capi_controller_out=5 // Standardcontroller (ausgehende Verbindung): [OPTION:1|1,2|2,3|3,4|4,5|5]
// [HTML:</div><script>set_group('DIV_ACC2_TYPE_CAPI', 'acc2_type', 'capi')</script><div ID='DIV_ACC2_TYPE_VOIP'><br><script>show_title('VoIP')</script>]
voip_registrar= // Registrar-Server [WIDTH:250px]
voip_realm= // Registrar-Realm (oder *) [WIDTH:250px]
voip_user= // Username [WIDTH:250px]
voip_pass= // Passwort [WIDTH:250px] [TYPE:password]
voip_do_not_register=0 // Registrieren [OPTION:0|ja,1|nein]
voip_proxy= // (Optional) Proxy [WIDTH:250px]
voip_id= // (Optional) ID [WIDTH:250px]
voip_contact= // (Optional) Contact [WIDTH:250px]
// [HTML:</div><script>set_group('DIV_ACC2_TYPE_VOIP', 'acc2_type', 'voip')</script><br><script>show_title('Registrar-Login')</script>]
registrar_active=0 // Registrar-Login [OPTION:1|aktiviert,0|deaktiviert] [ONCHANGE:set_group('DIV_ACC2_REGISTRAR', 'acc2_registrar_active', '1')]
// [HTML:<div ID='DIV_ACC2_REGISTRAR'>]
registrar_user= // Username [WIDTH:250px]
registrar_pass= // Passwort [WIDTH:250px] [TYPE:password]
// [HTML:</div><br><script>set_group('DIV_ACC2_REGISTRAR', 'acc2_registrar_active', '1');show_title('Internes Menü')</script>]
menu_entry=menu:main // Einstiegsmenü [WIDTH:250px]
menu_keycode=*611 // Interne Kurzwahl [WIDTH:50px]
// [HTML:</div><script>set_group('DIV_ACC2_ACTIVE', 'acc2_active', '1')</script>]
SCIPT Änderungen und Ergänzungen
Um die Rückrufnummer per DTMF zu ändern habe ich das script 'funcs_re.sh' erstellt.
Code:
#!/var/tmp/sh
# Get a line from a (*.cfg file)
# $1=file.cfg
# $2=Line
#
# returns: $CFG_VALUE
#
get_cfg_linecontent() {
FILE="$1"
LINE_NUM="$2"
CFG_VALUE=""
let cnt=1
if [ ! -f "$FILE" ]; then
return 0
fi
while read line;
do
if [ $cnt -eq $LINE_NUM ];
then
CFG_VALUE="`echo "$line"`";
return 0;
else
let cnt=cnt+1
fi
done < "$FILE"
}
# Set a line in a *.cfg file
# $1=file.cfg
# $2=Line to change
# $3=Value (=Value)
#
set_cfg_linecontent() {
FILE="$1"
CHANGE_LINE="$2"
VALUE="$3"
let cnt=0
let create=0
let weiter=0
# Falls die Datei nicht existiert, erstellen
if [ ! -f "$FILE" ]; then
let create=1
echo "" > "$FILE"
if [ ! $CHANGE_LINE -eq 0 ] && [ ! $CHANGE_LINE -eq 1 ]; then
let weiter=1
while [ $weiter -eq 1 ]; do
let create=create+1
echo "" >> "$FILE"
if [ $create -eq $CHANGE_LINE ]; then
let weiter=0
fi
done
fi
fi
let weiter=1
while read line;
do
let cnt=cnt+1
if [ $cnt -eq $CHANGE_LINE ];
then
echo "$VALUE"
let weiter=0
else
echo "$line"
fi
done < "$FILE" > "$FILE.new"
if [ -f "$FILE.new" ]; then
rm "$FILE"
mv "$FILE.new" "$FILE"
fi
while [ $weiter -eq 1 ]; do
let cnt=cnt+1
if [ $cnt -eq $CHANGE_LINE ]; then
let weiter=0
echo "$VALUE" >> "$FILE"
else
echo "" >> "$FILE"
fi
done
}
Zusatzlich die Anregung von bodega aufgegriffen und das script 'change_callback.sh' erstellt.
Code:
#!/var/tmp/sh
. /var/dtmfbox/script.cfg
. /var/dtmfbox/script/funcs_re.sh
# Wie lautet die neue Nummer
LcEingabe="$1"
SRC_ID="$2"
echo "LcEingabe: ($LcEingabe)"
set_cfg_linecontent "/var/dtmfbox/callback.cfg" "1" "$LcEingabe"
echo "Callback1 geändert!"
$DTMFBOX $SRC_ID -speak "Nummer erfolgreich geaendert. Bitte auflegen."
Anpassung des Script 'action_cbct.sh'
Durch die Anpassungen in diesem Script wird geregelt, daß bei einem Anruf auf acc2, die Rückrufnummer ausgelesen wird aus der Datei 'callback.cfg' und acc1 für den Rückruf genutzt wird.
Im Script bitte in der Zeile 'CALLBACK_CALLING_ACC="4741XXXX"' die Rufnummer '4741XXXX' durch die Rufnummer(MSN) der acc1 ersetzen.
Code:
#!/var/tmp/sh
. /var/dtmfbox/script.cfg
. /var/dtmfbox/script/funcs.sh
. /var/dtmfbox/script/funcs_re.sh
check_callback() {
let cnt=1
let ok=1
while [ "$ok" = "1" ];
do
eval CALLBACK="\$CALLBACK${cnt}"
if [ "$CALLBACK" = "" ]; then break; fi
SPLIT=`echo $CALLBACK | sed 's/\// /g'`
let i=0;
for SPLIT_VAL in $SPLIT;
do
if [ "$i" = "0" ]; then CALLBACK_TRIGGER_NO="$SPLIT_VAL"; fi
if [ "$i" = "1" ]; then CALLBACK_CALLING_NO="$SPLIT_VAL"; fi
if [ "$i" = "2" ]; then CALLBACK_TRIGGER_ACC="$SPLIT_VAL"; fi
if [ "$i" = "3" ]; then CALLBACK_CALLING_ACC="$SPLIT_VAL"; fi
if [ "$i" = "4" ]; then CALLBACK_CALLING_CTRL="$SPLIT_VAL"; fi
let i=i+1;
done
if [ "$CALLBACK_CALLING_NO" = "" ]; then CALLBACK_CALLING_NO="$DST_NO"; fi
if [ "$CALLBACK_CALLING_ACC" = "" ]; then CALLBACK_CALLING_ACC="$ACC_ID"; fi
if [ "$CALLBACK_TRIGGER_ACC" = "" ]; then CALLBACK_TRIGGER_ACC="$ACC_ID"; fi
VALID_CB=`echo $DST_NO | sed s/$CALLBACK_TRIGGER_NO/OK/g`
if [ "$VALID_CB" = "OK" ];
then
if [ "$CALLBACK_TRIGGER_ACC" = "$ACC_ID" ] || [ "$CALLBACK_TRIGGER_ACC" = "$SRC_NO" ]; then
# regex: replace number
CALLBACK_CALLING_NO=`echo $DST_NO | sed "s/$CALLBACK_TRIGGER_NO/$CALLBACK_CALLING_NO/g"`
if [ "$ACC_ID" = "2" ]; then
get_cfg_linecontent "/var/dtmfbox/callback.cfg" "1"
if [ "$CFG_VALUE" != "" ];
then
CALLBACK_CALLING_NO="$CFG_VALUE"
fi
fi
# get number from dtmfbox.cfg and remove X#... from capi-voip accounts
get_cfg_value "/var/dtmfbox/dtmfbox.cfg" "acc$CALLBACK_CALLING_ACC" "number"
if [ ! -z "$CFG_VALUE" ]; then
CALLBACK_CALLING_ACC_TMP=`echo $CFG_VALUE | sed -e 's/.*#//g'`
get_cfg_value "/var/dtmfbox/dtmfbox.cfg" "acc$CALLBACK_CALLING_ACC" "type"
if [ ! -z "$CFG_VALUE" ]; then
CFG_VALUE=`echo $CFG_VALUE | sed -e 's/[^a-z]//g'`
fi
if [ "$CFG_VALUE" = "capi" ] && [ "$CALLBACK_CALLING_CTRL" = "" ]; then
get_cfg_value "/var/dtmfbox/dtmfbox.cfg" "acc$CALLBACK_CALLING_ACC" "capi_controller_out"
if [ ! -z "$CFG_VALUE" ]; then
CFG_VALUE=`echo $CFG_VALUE | sed -e 's/[^0-9]//g'`
fi
CALLBACK_CALLING_CTRL="$CFG_VALUE"
fi
CALLBACK_CALLING_ACC="$CALLBACK_CALLING_ACC_TMP"
fi
if [ "$ACC_ID" = "2" ]; then
CALLBACK_CALLING_ACC="4741XXXX"
fi
echo "CbCt-Script: valid callback - $CALLBACK_CALLING_ACC -> $CALLBACK_CALLING_NO (Ctrl: $CALLBACK_CALLING_CTRL)"
# Another script already active?
if [ -f "$ACTION_CONTROL" ]; then
echo "CbCt-Script: Another script already got the call! Aborting..."
VALID_CB=""
exit 1
fi
echo "CB" > "$ACTION_CONTROL"
return 1
else
VALID_CB=""
fi
else
VALID_CB=""
fi
let cnt=cnt+1
done
}
check_callthrough() {
let cnt=1
let ok=1
while [ "$ok" = "1" ];
do
eval CALLTHROUGH="\$CALLTHROUGH${cnt}"
if [ "$CALLTHROUGH" = "" ]; then break; fi
SPLIT=`echo $CALLTHROUGH | sed 's/\// /g'`
let i=0;
for SPLIT_VAL in $SPLIT;
do
if [ "$i" = "0" ]; then CALLTHROUGH_TRIGGER_NO="$SPLIT_VAL"; fi
if [ "$i" = "1" ]; then CALLTHROUGH_TRIGGER_ACC="$SPLIT_VAL"; fi
let i=i+1;
done
if [ "$CALLTHROUGH_TRIGGER_ACC" = "" ]; then CALLTHROUGH_TRIGGER_ACC="$ACC_ID"; fi
VALID_CT=`echo $DST_NO | sed s/$CALLTHROUGH_TRIGGER_NO/OK/g`
if [ "$VALID_CT" = "OK" ];
then
if [ "$CALLTHROUGH_TRIGGER_ACC" = "$ACC_ID" ] || [ "$CALLTHROUGH_TRIGGER_ACC" = "$SRC_NO" ]; then
echo "CbCt-Script: valid callthrough - $CALLTHROUGH_TRIGGER_ACC -> $CALLTHROUGH_TRIGGER_NO"
# Another script already active?
if [ -f "$ACTION_CONTROL" ]; then
echo "CbCt-Script: Another script already got the call! Aborting..."
VALID_CT=""
exit 1
fi
echo "CT" > "$ACTION_CONTROL"
$DTMFBOX $SRC_ID -hook up
$DTMFBOX $SRC_ID -goto "menu:callthrough_pin"
return 1
else
VALID_CT=""
fi
else
VALID_CT=""
fi
let cnt=cnt+1
done
}
if [ "$EVENT" = "CONNECT" ] && [ "$DIRECTION" = "INCOMING" ];
then
# remove address from number (voip only)
if [ "$TYPE" = "VOIP" ];
then
DST_NO=`echo $DST_NO | sed 's/\(.*\)@.*/\1/g'`
fi
#############################################
# Callback
#############################################
check_callback
if [ "$VALID_CB" = "OK" ];
then
exit 1
fi
#############################################
# Callthrough
#############################################
check_callthrough
if [ "$VALID_CT" = "OK" ];
then
$DTMFBOX $SRC_ID -hook up
$DTMFBOX $SRC_ID -goto "menu:callthrough_pin"
exit 1
fi
fi
if [ "$EVENT" = "DISCONNECT" ];
then
if [ -f "$ACTION_CONTROL" ];
then
CBCT_TYPE=`cat "$ACTION_CONTROL"`
# callback on disconnect
if [ "$CBCT_TYPE" = "CB" ];
then
rm "$ACTION_CONTROL"
check_callback
if [ "$VALID_CB" = "OK" ];
then
sleep 3
echo "CbCt-Script: Callback $CALLBACK_CALLING_ACC -> $CALLBACK_CALLING_NO"
CON_ID=`$DTMFBOX -call "$CALLBACK_CALLING_ACC" "$CALLBACK_CALLING_NO" "$CALLBACK_CALLING_CTRL"`
$DTMFBOX $CON_ID -goto "menu:callthrough_pin"
exit 1;
fi
fi
fi
fi
Anpassung des Script 'callthrough.sh'
Das war notwendig um Leerstellen von Rückgaben der Funktion 'get_cfg_value' zu entfernen.
Code:
#!/var/tmp/sh
. /var/dtmfbox/script.cfg
. /var/dtmfbox/script/funcs.sh
MODE="$1"
SRC_ID="$2"
DST_ID="$3"
OWN_ACC_ID="$4"
TRG_ACC_ID="$5"
############################################
# DTMF=* (return to previous menu)
############################################
if [ "$MODE" = "*" ];
then
# goto to previous menu
if [ "$DST_ID" != "-1" ]; then
$DTMFBOX $DST_ID -hook down
$DTMFBOX $SRC_ID -goto "menu:callthrough_number($TRG_ACC_ID)"
else
$DTMFBOX $SRC_ID -goto "menu:callthrough_account"
fi
fi
############################################
# DTMF!=* (dial number)
############################################
if [ "$MODE" != "*" ];
then
# reset number?
RESET_NO=`echo "$MODE" | sed -e 's/.*\*.*/RESET_NO/g'`
if [ "$RESET_NO" = "RESET_NO" ];
then
if [ "$DST_ID" != "-1" ]; then $DTMFBOX $DST_ID -hook down; fi
$DTMFBOX $SRC_ID -speak "Abbruch."
sleep 1
$DTMFBOX $SRC_ID -goto "menu:callthrough_number($TRG_ACC_ID)"
exit 1
fi
# make call!
NO=`echo "$MODE" | sed -e 's/#//g'`
if [ "$DST_ID" != "-1" ]; then $DTMFBOX $DST_ID -hook down; fi
if [ "$NO" != "" ];
then
# get number from dtmfbox.cfg and remove X#... from capi-voip accounts
get_cfg_value "/var/dtmfbox/dtmfbox.cfg" "acc$TRG_ACC_ID" "number"
if [ ! -z "$CFG_VALUE" ]; then
CALLBACK_CALLING_ACC_TMP=`echo $CFG_VALUE | sed 's/.*#//g'`
get_cfg_value "/var/dtmfbox/dtmfbox.cfg" "acc$TRG_ACC_ID" "type"
# Nur die Zeichen 'a bis z' zulassen - Leerstellen rausfiltern
if [ ! -z "$CFG_VALUE" ]; then
CFG_VALUE=`echo $CFG_VALUE | sed -e 's/[^a-z]//g'`
fi
if [ "$CFG_VALUE" = "capi" ] && [ "$CALLBACK_CALLING_CTRL" = "" ]; then
get_cfg_value "/var/dtmfbox/dtmfbox.cfg" "acc$TRG_ACC_ID" "capi_controller_out"
# Nur die Zahlen '0 bis 9' zulassen - Leerstellen rausfiltern
if [ ! -z "$CFG_VALUE" ]; then
CFG_VALUE=`echo $CFG_VALUE | sed -e 's/[^0-9]//g'`
fi
CALLBACK_CALLING_CTRL="$CFG_VALUE"
fi
TRG_ACC_ID="$CALLBACK_CALLING_ACC_TMP"
echo "Callthrough-Script: $TRG_ACC_ID -> $NO (Ctrl: $CALLBACK_CALLING_CTRL)"
fi
# make call
$DTMFBOX $SRC_ID -call "$TRG_ACC_ID" "$NO" "$CALLBACK_CALLING_CTRL"
else
$DTMFBOX $SRC_ID -speak "Bitte Nummer eingeben."
fi
fi
Anpassung des Script 'misc_fb.sh'
War notwenig, weil mehr als die IP angesagt wurde und verwirrte.
Code:
#!/var/tmp/sh
. /var/dtmfbox/script.cfg
MODE="$1"
SRC_ID="$2"
TEXT=""
#########################
## 1 - IP-Adresse
#########################
if [ "$MODE" = "IP" ];
then
# TEXT="Ihre Ei,Pi Adresse lautet: `showdsldstat | grep '0: ip' | sed -r 's/.*ip.(.*)\/.*mtu.*/\1/g' | sed 's/\./-/g'`"
TEXT="Ihre Ei,Pi Adresse lautet: `showdsldstat | grep '0: ip'| sed -e 's/.*ip//g' | sed -e 's/peer.*//g' | sed -e 's/\./||_:_:/g'` .Wiederholung `showdsldstat | grep '0: ip'| sed -e 's/.*ip//g' | sed -e 's/peer.*//g' | sed -e 's/\./||_:_:/g'` .Jetzt bitte auflegen"
fi
# | sed -e 's/[^0-9.]/./g'
#########################
## 2 - Letzter Reboot
#########################
if [ "$MODE" = "LAST_REBOOT" ];
then
IS_MIN=`uptime | sed -r 's/.*up (.*) min.*$/OK/g'`
IS_DAY=`uptime | sed -r 's/.*up (.*) day.*$/OK/g'`
if [ "$IS_MIN" = "OK" ] && [ "$IS_DAY" != "OK" ];
then
NO=`uptime | sed -r 's/.*up (.*) min.*$/\1/g'`
FRMT=" Minuten "
else
if [ "$IS_DAY" = "OK" ];
then
NO=`uptime | sed -r 's/.*up (.*) day.*$/\1/g'`
if [ "$NO" = "1" ]; then FRMT=" einem Tag "; NO=""; else FRMT=" Tagen "; fi
else
NO=`uptime | sed -r 's/.*up (.*):.*:.*/\1/g'`
NO2=`uptime | sed -r 's/.*up .*:(.*),.*:.*/\1/g'`
NO=`echo "$NO" | sed -r 's/0(.)/\1/g'`
NO2=`echo "$NO2" | sed -r 's/0(.)/\1/g'`
if [ "$NO" = "1" ]; then FRMT=" einer Stunde "; NO=""; else FRMT=" Stunden "; fi
if [ "$NO2" = "1" ]; then FRMT2=" einer Minute "; NO2=""; else FRMT2=" Minuten "; fi
NO="$NO $FRMT und $NO2 $FRMT2"
FRMT=""; FRMT2=""
fi
fi
TEXT="Vor $NO $FRMT war der letzte Ribuht."
fi
#########################
## 3 - Uhrzeit
#########################
if [ "$MODE" = "CURRENT_TIME" ];
then
TEXT="Es ist: `date +\"%H Uhr %M .\"`."
fi
#########################
## OUTPUT
#########################
if [ "$TEXT" != "" ]; then
$DTMFBOX $SRC_ID -speak "$TEXT"
fi
Menü-Einstellungen
Danach sind noch einige Anpassungen im Menü Bereich notwendig. Alle Eingaben werde ich als Text-Editor Anzeigen einstellen. Kann natürlich auch über die Eingabemasken erfolgen. Das Resultat sollte dann aber dem Angezeigten entsprechen. Telefonnummern und Pins müssen natürlich angepasst werden.
Menü hinzugefügt 'menu:callthrough_eins'
Code:
[menu:callthrough_eins]
say=Bitte die zu waehlende Nummer eingeben. Account 1 und 1.
*=script:callthrough
#=script:callthrough
Menü hinzugefügt 'menu:menu:change_callback'
PIN '1234' individuell anpassen
Code:
[menu:change_callback]
say=Durchwahl Nummer aendern. Wie lautet die Pin. Stern Ei,Pi Adresse
1234#=menu:dtmf_commands
*=script:misc_fb("IP")
Menü geändert 'menu:callthrough_pin'
Pin '1234' anpassen nach Wunsch
Code:
[menu:callthrough_pin]
say=Durchwahl. Hallo . Wie lautet die Pin.
1234#=menu:callthrough_eins(2)
*=menu:change_callback
Menü geändert 'menu:callthrough_account'
Code:
[menu:callthrough_account]
say=Waehle 2 fuer 1 und 1. 1 fuer Caarpo. 0 fuer Intern.
0#=menu:callthrough_number(0)
1#=menu:callthrough_number(1)
2#=menu:callthrough_carpo(1)
3#=menu:callthrough_eins(2)
4#=menu:callthrough_number(1)
5#=menu:callthrough_number(1)
6#=menu:callthrough_number(1)
7#=menu:callthrough_number(1)
8#=menu:callthrough_number(1)
9#=menu:callthrough_number(1)
10#=menu:callthrough_number(1)
*=menu:main
Menü geändert 'menu:dtmf_commands'
Code:
[menu:dtmf_commands]
say=DTMF Befehle. Bitte neue Nummer eingeben.
#=script:change_callback
*=menu:main
Menüscipt hinzugefügt 'script:change_callback'
Funktioniert nur im Text-Editor Modus
Code:
[script:change_callback]
cmd=/var/dtmfbox/script/change_callback.sh(/var/dtmfbox/script/change_callback.sh, "%dtmf%", "%src_id%")
Im Bereich 'Scripteinstellungen' ändern:
Bereich 'Start' : dtmfbox automatisch starten 'ja'
Bereich 'Callback' im Text-Editor.
Handynummer in der ersten Callback-Regel 'CALLBACK1' entsprechen anpassen
In der Callback-Regel 2 'CALLBACK2' musste ich die Reguläre Expression anpassen, weil von Carpo-Lidl die Anrufnummer immer in dem Format Land/Stadt/Nummer übergeben wurde ohne die zwei '00' in der Ländervorwahl. Das könnte bei anderen Providern anders sein.
Mit Carpo-Lidl: 'CALLBACK2="\(.*\)/
00\1/1/1/5"'
Ev. bei anderen Providern: 'CALLBACK2="\(.*\)/\1/1/1/5"'
Code:
# [SECTION:Callback]
# [HTML:<script>function assist_cb(obj) { trigger_no=prompt('Bitte Trigger-Nummer eingeben, auf die der Callback reagieren soll.\n\nHinweis: Es können Regular Expressions verwendet werden, wie z.B.: \\(.*12345\\)'); if(trigger_no == null || trigger_no.length == 0) return; callback_no=prompt('Bitte Rückruf-Nummer eingeben.\n\nHinweis: Falls die Trigger-Nummer als Regular-Expression angegeben wurde, können hier Replace-Platzhalter angegeben werden, wie z.B.: \\1', ""); if(callback_no == null || callback_no.length == 0) return; trigger_acc=prompt('Bitte Trigger-Account 1 bis 10 eingeben (optional).\n\nHinweis: Die Angabe der Account-Rufnummer ist ebenfalls möglich.', ""); if(trigger_acc == null) trigger_acc = ''; callback_acc=prompt('Bitte Callback-Account 1 bis 10 eingeben (optional).\n\nHinweis: Die Angabe der Account-Rufnummer ist ebenfalls möglich.', ""); if(callback_acc == null) callback_acc = ''; obj.value = trigger_no + '/' + callback_no + '/' + trigger_acc + '/' + callback_acc; obj.onchange() }</script>]
CALLBACK1="\(.*1986999\)/015201986999/1/1/5" # 1. Callback Regel [WIDTH:150px] [HTML: <input type='button' value='Assistent' onclick="javascript:assist_cb(document.getElementById('Callback_CALLBACK1'))">]
CALLBACK2="\(.*\)/00\1/1/1/5" # 2. Callback Regel [WIDTH:150px] [HTML: <input type='button' value='Assistent' onclick="javascript:assist_cb(document.getElementById('Callback_CALLBACK2'))">]
CALLBACK3="\(.*\)/\1/2/1/5" # 3. Callback Regel [WIDTH:150px] [HTML: <input type='button' value='Assistent' onclick="javascript:assist_cb(document.getElementById('Callback_CALLBACK3'))">]
# CALLBACKX="" # X. Callback Regel [WIDTH:150px] [HTML: <input type='button' value='Assistent' onclick="javascript:assist_cb(document.getElementById('Callback_CALLBACKX'))">]
Viel Erfolg !!
Bei mir funktioniert alles einwandfrei