Entwickler-Ecke

Internet / Netzwerk - Daten vom Router auf bestimmten Port empfangen


Stefan-W - So 28.05.06 17:30
Titel: Daten vom Router auf bestimmten Port empfangen
Hi,

ich will ein Anrufmonitor für unsere Fritzbox programmieren, da ich mit den meisten die es so gibt nicht ganz so zufrieden bin.
Allerdings hab ich keine Idee wie ich die Daten von einem bestimmten Port (1012) empfangen kann und dann weiterverarbeiten kann.

Die FritzBox liefert die Daten in der Form:

Ausgehende Anrufe: datum;CALL;ConnectionID;Nebenstelle;GenutzteNummer;AngerufeneNummer;
Eingehende Anrufe: datum;RING;ConnectionID;Anrufer-Nr;Angerufene-Nummer;
Zustandegekommene Verbindung: datum;CONNECT;ConnectionID;Nebenstelle;Nummer;
Ende der Verbindung: datum;DISCONNECT;ConnectionID;dauerInSekunden;

hat vielleicht einer von euch eine Idee nach was ich suchen kann bzw in welche richtung ich arbeiten muss?

Danke schon mal im Vorraus

Tschau Stefan


mkinzler - So 28.05.06 17:33

Meinst du einen Socket?


Stefan-W - So 28.05.06 17:39

hmm... kann ich nicht sagen ich weis nur das auf dem Port die Daten irgendwie auf meinen Rechner gelangen und ein Programm das ganze dann anzeigt.

ich hab da n Java Code allerdings ist das für mich nicht verständlich. Aber ich seh mal nach ob ich mit Socket vllt weng näher komme


Stefan-W - So 28.05.06 20:41

Also die Socket sind auf jedenfall die richtige Richtung! Allerdings fehlt mir die ServerSocket-Komponente die wohl standart mäßig bei Delphi bei ist...

kann mir da jemand helfen oder andere empfehlen... ich hab auch Indy allerdings weis ich da nicht was ich nehmen soll bzw wie ich das dann verwende


mkinzler - So 28.05.06 20:45

TidTCPClient bzw. TidUDPClient.

Alternativ zu INDY gibt es auch noch ICS und Synapse


Stefan-W - So 28.05.06 20:48

war ein Client nicht zum senden? ich wollt doch empfangen :?:


mkinzler - So 28.05.06 21:15

Stimmt :oops;


Fighter#1 - So 28.05.06 21:20

Wer, oder was sendet denn die Daten, was ist das für ein Programm, oder sendet ein Server oder ein Client?
Gib ein bisschen mehr info und wir können besser helfen
:-)
MfG Fighter#1
Ach ja: Client kann genauso empfangen ...


Stefan-W - Mo 29.05.06 07:21

Also: Wenn ein Anruf Rausgeht, oder Reinkommt bzw die verbindung wieder getrennt wird sendet unser Router (Fritz.box) auf dem Port 1012 die Daten, die wollte ich abfangen und verarbeiten


Delete - Mo 29.05.06 07:45

Der Port allein wird dir nicht weterhelfen! Du mußt auch wissen was für ein Protokoll verwendet wird. Das sollte aber aus deinem Java-Code in irgendeiner Weise ersichtlich sein. Es werden sich doch wohl ein paar Kommentare darin finden lassen.

Gruß Frank


Stefan-W - Di 30.05.06 09:39

so wiet ich das ersehen kann wir da mit TCP gearbeitet


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
#!/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
# 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="$ENV{HOME}/doc/addressbook";
my $EXTPRO="/usr/bin/X11/xmessage";
#-------- 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];
                }
                my @args = ($EXTPRO, "Anruf: ", $nr);
                system(@args); 
        }
}


Das hier ist der Code der wohl auf der Fritzbox läuft, so richtig geht das nicht hervor. das könnte natürlich auch zum empfangen sein. KA


Stefan-W - Mi 31.05.06 09:08

Hi, ich hab nun die Lösung für mein Problem gefunden. 8)

ich hab gestern abend noch ca 3 Stunden versucht das mit Indy & Co auf die Reihe zu bringen (leider ohne Erfolg)
danach hab ich bei Google nach den StandartKomponenten gesucht (TClientSocket und TServerSocket)
und den Beitrag in der DP gefunden, wo gesagt wurde, dass die dabei sind (wusst ich schon, hatte sie aber trotzdem nicht) weiter unten stand dann, dass die nur nicht Installiert sind (standartmässig) aber wirklich mitgeliefer sind
nun hab ich sie installiert und jetzt klapts auf Anhieb.

Also nochmal danke für eure Mühe (haben ja doch einige hier gepostet)

Tschau Stefan :D


xSTrEaMi - Mi 20.06.07 17:38

Hi,

könntest du evtl. die Lösung posten wie du die Anrufe über TClientSocket und TServerSocket abrufst.
Hab momentan das gleiche Problem.

Danke


Narses - Mi 20.06.07 17:57

Moin!

user profile iconxSTrEaMi hat folgendes geschrieben:
könntest du evtl. die Lösung posten wie du die Anrufe über TClientSocket und TServerSocket abrufst.
Hab momentan das gleiche Problem.

Also wenn ich mir das Perl-Script so ansehe, dann würde ich sagen, probier das mal so: ;)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
uses
  ..., ScktComp;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ClientSocket1: TClientSocket;
    procedure FormCreate(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
//...

procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientSocket1.Host := '192.168.0.100'// IP-Adresse oder Hostname der FB
  ClientSocket1.Port := 1012// Port
  ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add(Socket.ReceiveText);
end;

cu
Narses


xSTrEaMi - Mi 20.06.07 18:20

Danke.

Was sich jetzt als Problem darstellt ist der Call-Monitor. Weil wie aktiviere ich ihn ohne
das ein Telefon an der FritzBox hängt. Bei uns läuft das noch über eine 2te Funktelefonanlage
und ich kann hier auch nicht einfach ein Telefon drannhängen... :(

Kennt jemand von euch den FBEditor? Darüber müsste man ja eigentlich die Config-Files direkt
ändern können. Leider bekommt man des Teil nur ausm ip-phone-forum und die haben irgenwelche Probleme
beim anmelden....


Narses - Mi 20.06.07 18:24

Moin!

user profile iconxSTrEaMi hat folgendes geschrieben:
Danke.

Bitte. ;)

user profile iconxSTrEaMi hat folgendes geschrieben:
Was sich jetzt als Problem darstellt ist der Call-Monitor.
...

Wenn ich das richtig sehe, dann ist damit deine Frage bzgl. dieses Threads geklärt. Bitte erstelle ein neues Topic (dürfte in die Sparte "Off Topic" fallen) für das Problem mit der FritzBox-Software (Forumsregel: nur eine Frage pro Topic, sonst gibt das Chaos!). Danke. ;)

cu
Narses


Stefan-W - Mi 27.06.07 18:26

Sorry bin erst aus dem Urlab zurück gekommen... aber hat sich ja geklärt :-)