Fritz!Box

Wechseln zu: Navigation, Suche

Die Fritz!Box-Router aus dem Hause AVM basieren auf einem abgespeckten Linux und bieten sich deshalb für Spielereien aller Art an.

Anrufmonitor

Moderne Fritz!Boxen bieten auf dem TCP-Port 1012 einen Anrufmonitor. Dieser benachrichtigt live über ankommende und ausgehende Anrufe, die über die Fritz!Box getätigt werden. Außerdem werden Verbindungsstatusänderungen mitgeteilt.

Vorbereitungen

Der Anrufmonitor muss vor der Nutzung aktiviert werden, indem #96*5* angerufen wird (deaktivieren mit #96*4*)[1].

Falls der telnet-Dienst noch nicht aktiviert wurde, wählt man #96*7* (deaktivieren mit #96*8*)[2].


Ein erster Test per telnet

user@rechner:~$ telnet fritz.box 1012
Trying 192.168.178.1...
Connected to fritz.box.
Escape character is '^]'.

Die Verbindung steht. Sobald Anrufe getätigt werden, entstehen Meldungen folgender Art:

<Datum> <Zeit>;CALL;<?>;<Anschluss>;<Quellrufnummer>;<Zielrufnummer>;<SIP + Nummer>;
<Datum> <Zeit>:59;CONNECT;0;<Anschluss>;<Zielrufnummer>;
<Datum> <Zeit>:29;DISCONNECT;0;<Anschluss>;

Eingehende Anrufe verlaufen nach folgendem Schema:

<Datum> <Zeit>;RING;<Anschluss>;<Quellrufnummer>;<Zielrufnummer>;<SIP + Nummer>;
<Datum> <Zeit>;CONNECT;<?>;<Anschluss>;<Quellrufnummer>;
<Datum> <Zeit>;DISCONNECT;<Anschluss>;<Gesprächlänge in Sek.>;

(Die Tags sollen den Platzhaltercharakter verdeutlichen und kommen nicht in den Messages vor; einige Felder sind nur geraten, alles ohne Gewähr.)


Perl-Script: read_calls.pl v0.2.1

Das folgende Perl-Script von Lars G. Sander und der Telefonbucherweiterung (optionale Nutzung) von Ulrich Dangel baut eine Verbindung zum Port 1012 der Fritz!Box auf und führt bei entsprechender Message (definiert in "if ($_ =~ /RING/){") ein benutzerdefiniertes Script aus.

#!/usr/bin/perl -w
#
# read_calls.pl
# 
# Synopsis:
# Script is run as a service daemon. It connects to the Fritz!Box Fon Ata
# (port 1012) and receives the calling string (number of the party calling 
# in). This number is passed on to another program. I.e. this could be an 
# Jabber client or a "look who called list".
# 
# Requirements:
# - must be able to reach tcp port 1012 on your FB
# - activate call monitor on FB by dialing #96*5*
# - required perl package
#
# Licence: GPL2
#
# History:
# ver. 0.1 - 20060401 - Lars G. Sander, Zuerich
# First public release.
# ver. 0.2 - 20060510 - Ulrich Dangel <fritzbox@spamt.net>
# Added telefon book support
# ver. 0.2.1 - 20100807 - Basti
# Added SIP resolution for personal use
# To Do:
# - beefed up security?
# - proxy functionality
# - additionally monitor calls OUT
use IO::Socket;
use strict;
 
# your fritz box (ip or hostname)
my $FRITZBOX="fritz.box";
my $TELEFONBUCH="/path/to/phonebook";
my $EXTPRO="/path/to/script.sh";
#-------- NO USER SERVICABLE PARTS BELOW -------#
 
 
sub read_book {
    my %book = ();
    open(IN, "<", $TELEFONBUCH) || return ();
    while(<IN>){
        chomp;
        my @elements = split(":",$_);
        $book{$elements[0]}=$elements[1];
    }
    close(IN);
    return %book;
}
 
 
my %book = &read_book;
 
my $sock = new IO::Socket::INET (
        PeerAddr => $FRITZBOX,
        PeerPort => '1012',
        Proto => 'tcp'
        );
        die "Could not create socket: $!\n" unless $sock;
 
while(<$sock>) {
        if ($_ =~ /RING/){
                my @C = split(/;/);
                my $nr="";
                if (exists($book{$C[3]})) {
                    $nr=$book{$C[3]};
                } else {
                    $nr=$C[3];
                }
                # SIP resolution added by me
                my $sip="";
                if ($C[5] =~ /SIP0/){
                    $sip="Nummer 0: ";
                } elsif ($C[5] =~ /SIP1/){
                    $sip="Nummer 1: ";
                } elsif ($C[5] =~ /SIP2/){
                    $sip="Nummer 2: ";
                }
                ###
                my @args = ($EXTPRO, "$sipAnruf von $nr");
                system(@args); 
        }
}

Aktuell wird nur bei eingehenden Anrufen reagiert (RING). Wahlweise könnte auch bei ausgehenden Anrufen, zustande gekommenen oder geschlossenen Verbindungen Aktionen ausgeführt werden.


Das folgende Bash-Script könnte z.B. aufgerufen werden, welches per XOSD eine entsprechende Meldung im On-Screen Display-Stil für 7 Sekunden anzeigt (bei Bedarf auch direkt ins Perl-Script integrierbar).

#!/bin/bash
 
export DISPLAY=:0.0
echo "$1" | osd_cat --align=center --pos=bottom --outline=1 --outlinecolour="#FFFFFF" --font="-adobe-helvetica-bold-r-normal--34-240-100-100-p-182-iso8859-1" --delay=7 --color="#000000" &


Mit screen lässt sich der Anrufmonitor-Daemon in den Hintergrund verschieben. (Das echo in der letzten Zeile soll sicherstellen, dass sich hinter dem letzten screen-Aufruf tatsächlich ein Zeilenumbruch befindet.)

screen -S sitzung1
screen -d sitzung1
screen -S sitzung1 -X stuff $'perl /path/to/read_calls.pl\n'
echo


Letztendlich könnte nun noch das implementierte Telefonbuch benutzt werden, indem man unter dem oben konfigurierten Pfad eine Datei mit folgendem Inhaltsschema ablegt:

<Rufnummer1>:<Name1>
<Rufnummer2>:<Name2>
<Rufnummer3>:<Name3>

(Die Tags sollen den Platzhaltercharakter verdeutlichen und gehören nicht in die Datei.)


Weiterführende Links

  • Freetz-Mod freie, individuelle (selbst zusammenstell- und kompilierbar) Firmware-Modifikation für Fritz!Boxen
  • Inoffizielles Wiki mit allerlei Ideen, Scripten und Informationen rund um die Router-Serie