Login
Register
Forum
Kontakt
Bitmania
2012-11-08 19:38
by bitman
Daten der Fritzbox per SOAP in PHP oder Python abfragen
Gestern habe ich den halben Nachmittag im Keller verbracht um meiner instabilen DSL-verbindung auf die Spur zu kommen. Es lag wohl an der TAE.

Um den Heilungserfolg besser beurteilen zu können habe ich heute mal etwas gecoded.

Mit gehts darum auf meiner Heimnetz-Startseite direkt den Status der DSL Verbindung angezeigt zu bekommen.
Ohne mich in die Fritzbox-GUI einloggen zu müssen, habe ich nun so eine schicke kleine Anzeige, wo ich sehen kann wie es gerade um die Anbindung steht.

  
Hier sieht man den Status und die Verbindungsdauer.

Der entscheidende Teil des PHP-Codes dazu ist recht übersichtlich. Falls jemand mal sowas braucht:

$client = new SoapClient(
null,
array(
'location' => "http://192.168.0.1:49000/upnp/control/WANCommonIFC1",
'uri' => "urn:schemas-upnp-org:service:WANIPConnection:1",
'soapaction' => "urn:schemas-upnp-org:service:WANIPConnection:1#GetStatusInfo",
'noroot' => True
)
);
$status = $client->GetStatusInfo();
$router_wan_status = $status['NewConnectionStatus'];
$router_wan_error = $status['NewLastConnectionError'];
$router_wan_uptime = $status['NewUptime'];

Man kann auf diese Weise noch viele andere Werte abfragen.

Ich hab dann gleich mal weitergecodet und in das Python-Script erweitert, welches alle 5 Minuten einige Statistikwerte einsammelt.
Diese zieht sich nun per Python-SOAP die Counter NewTotalBytesSent und NewTotalBytesReceived von der Fritzbox und legt sie in der RRD-Datenbank ab.
Als Ergebnis habe ich eine schöne Grafik zum Traffic über das DSL Interface der Fritzbox:




Der Python Code zum SOAP Teil:

#!/usr/bin/python
from SOAPpy import SOAPProxy

interface = SOAPProxy(proxy='http://192.168.0.1:49000/upnp/control/WANCommonIFC1',
namespace ='urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1',
soapaction='urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetAddonInfos',
noroot=True).GetExternalIPAddress()
interface = dict((key, getattr(interface, key)) for key in interface._keys())
for key in interface:
print str(key) +"\t: "+ interface[key]

liefert dann z.B. folgende Werte:

NewVoipDNSServer1       : 0.0.0.0
NewDNSServer2 : 195.50.140.248
NewDNSServer1 : 195.50.140.248
NewVoipDNSServer2 : 0.0.0.0
NewIdleDisconnectTime : 0
NewByteSendRate : 2105
NewAutoDisconnectTime : 0
NewTotalBytesSent : 168039301
NewByteReceiveRate : 1403
NewPacketReceiveRate : 8
NewRoutedBridgedModeBoth: 0
NewTotalBytesReceived : 1943118818
NewPacketSendRate : 7
NewUpnpControlEnabled : 0

15 Comments

krille 2012-11-08 15:49 ^ 141

Posts: 3
Registered: 2012-11-08
Sehr schöne Sache mit der RRD-Übergabe.

Kann man auch den Traffic der einzelnen Clients dem RRDTool übergeben?

bitman 2012-11-08 16:33 ^ 142

Moderator
Posts: 109
Pages: 99
Registered: 2010-07-09
nee, ich denke das geht nicht da sich die Box ja jeden Client merken und einen neuen Counter aufsetzen müßte.
Ich würde das auf den Clients selber abfragen.
(Bei meinem Heimserver z.B. mache ich das so)

Welche Counter die Fritzbox liefern kann sieht man so:

$ for x in igddesc.xml igdconnSCPD.xml igdicfgSCPD.xml igddslSCPD.xml ; do wget http://fritz.box:49000/$x; done

krille 2012-11-08 16:51 ^ 143

Posts: 3
Registered: 2012-11-08
hmmm ....
Also bliebe nur, diesen Whireshark-format Mitschnitt zu puffern und auszuwerten - das ist frustrierend :-/

Mal mit der upnp-Ausgabe experimentiert?


bitman 2012-11-08 17:25 ^ 144

Moderator
Posts: 109
Pages: 99
Registered: 2010-07-09
die Methode mit Wireshark kenne ich gar nicht.

Ich hab nur einen Client den es zu monitoren lohnt das ist der Heimserver und auf dem läuft ein Linux, da frage ich die Counter einfach per 'ifconfig' ab.

krille 2012-11-08 19:38 ^ 145

Posts: 3
Registered: 2012-11-08
Schau Dir das mal an:
http://fritz.box/html/capture.html

da verpetzt die Box alles.

alex 2014-07-05 18:06 ^ 323

Posts: 1
Guest
Hey bitman,

ich bin schon ewig auf der suche nach der möglichkeit den fritzbox traffic in ein rrd plot zu legen, habe es aber bisher nicht hingekommen.
Gibt es irgendwo das ganze von dir zum download?

bitman 2014-07-05 18:28 ^ 324

Moderator
Posts: 109
Pages: 99
Registered: 2010-07-09
Hi Alex,

also bei mir läuft das ja schon seit fast zwei Jahren.
Oben sind Code-Beispiele in PHP und in Python.
Fehlt dir der Teil wie man es in eine RRD-Datenbank schiebt?

Gruß
bitman

bitman 2014-09-19 18:11 ^ 336

Moderator
Posts: 109
Pages: 99
Registered: 2010-07-09

Ich hab heute die 7390 auf Fritz!OS 6.20 upgegradet und schon gehen meine Scripte nicht mehr.
Die Pfade haben sich etwas geändert

Hier sind Codebeispiele die mit Fritz!OS 6.20 funktionieren:

Python Code
ip_own = SOAPProxy(proxy='http://192.168.0.1:49000/igdupnp/control/WANIPConn1',
namespace='urn:schemas-upnp-org:service:WANIPConnection:1',
soapaction='urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress',
noroot=True).GetExternalIPAddress()
print ip_own


PHP Code:
$client = new SoapClient(null,array(
"location" => "http://192.168.0.1:49000/igdupnp/control/WANIPConn1",
"uri" => "urn:schemas-upnp-org:service:WANIPConnection:1",
"soapaction" => "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress",
"noroot" => True
));
$status = $client->GetExternalIPAddress();
//echo "<pre>";print_r($status);echo "</pre>";
$router_wan_ip = $status;

helmar 2015-07-07 08:27 ^ 344

Posts: 1
Registered: 2015-07-07
Hallo,

kann man das komplette PHP Skript bekommen?

bitman 2015-07-11 08:35 ^ 348

Moderator
Posts: 109
Pages: 99
Registered: 2010-07-09
bei mir ist das in einer sehr großen Landing-Page eingebettet.
Nach dem Teil der Fritzbox Abfrage kommen eigentlich nur noch ein paar Variablen-Zuweisungen und dann die Anzeige der Werte


// Fritz!OS 6.20
$client = new SoapClient(null,array(
'location' => "http://192.168.0.1:49000/igdupnp/control/WANIPConn1",
'uri' => "urn:schemas-upnp-org:service:WANIPConnection:1",
'soapaction' => "urn:schemas-upnp-org:service:WANIPConnection:1#GetStatusInfo",
'noroot' => True
));
$status = $client->GetStatusInfo();
//echo "<pre>";print_r($status);echo "</pre>";
$router_wan_status = $status['NewConnectionStatus'];
$router_wan_error = $status['NewLastConnectionError'];
$router_wan_uptime = $status['NewUptime'];
$router_wan_connect_time = date('Y-m-d H:i:s', time()-$router_wan_uptime );

echo "<table border=0 BGCOLOR=#CECECE WIDTH='100%'>";
echo "<tr>";
echo "<td colspan=2>DSL Status";
echo "</tr>";
if($router_wan_status=='Connected' && $router_wan_error=='ERROR_NONE'){
echo "<tr>";
echo "<td colspan=2 BGCOLOR=#E3E3E3><font size=2 face=Arial,Helvetica color=#848484>".$router_wan_connect_time."</font>";
echo "</tr>";
echo "<tr>";
echo "<td colspan=2 BGCOLOR=#E3E3E3><font size=2 face=Arial,Helvetica color=#848484>".sec2string($router_wan_uptime)."</font>";
echo "</tr>";
echo "<tr>";
echo "<td colspan=2 BGCOLOR=#B2FFA9>$router_wan_status";
echo "</tr>";
}else{
echo "<tr>";
echo "<td colspan=2 BGCOLOR=#FFAAA9>$router_wan_status";
echo "</tr>";
echo "<tr>";
echo "<td colspan=2 BGCOLOR=#FFAAA9>$router_wan_error";
echo "</tr>";
}
echo "</table>";


das ergibt dann dieses Bildchen:




omtom 2015-07-16 17:42 ^ 351

Posts: 2
Guest
hallo,

und wie starte ich das ganze?
speicher ich den code als php-datei?

gruß
tom

bitman 2015-07-16 19:18 ^ 354

Moderator
Posts: 109
Pages: 99
Registered: 2010-07-09
Okay, ich hab das ganze mal von meinem anderen Code auf der Seite separiert und hier für euch vorbereitet.

Wenn ihr diesen Code nehmt, in ein File z.B. test.php kopiert und dem Webserver mit PHP bereitlegt dann kommt so eine Tabelle mit den Informationen wie auf dem Bild dabei heraus:







<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Test</title>
<meta http-equiv="cache-control" content="no-cache">
</head>

<body bgcolor="#ffff84" text="#000000" link="#0000FF" vlink="#000080" alink="#FF0000" >


<?php

function sec2string($seconds) {
$days=(int)($seconds/86400);
$hours = (int)(($seconds-($days*86400))/3600);
$mins = (int)(($seconds-$days*86400-$hours*3600)/60);
$secs = (int)($seconds - ($days*86400)-($hours*3600)-($mins*60));
return sprintf("%d %02d:%02d:%02d ", $days, $hours, $mins, $secs);
}


// Fritz!OS 6.20
$client = new SoapClient(null,array( 'location' => "http://192.168.0.1:49000/igdupnp/control/WANIPConn1",
'uri' => "urn:schemas-upnp-org:service:WANIPConnection:1",
'soapaction' => "urn:schemas-upnp-org:service:WANIPConnection:1#GetStatusInfo",
'noroot' => True
));
$status = $client->GetStatusInfo();
$router_wan_status = $status['NewConnectionStatus'];
$router_wan_error = $status['NewLastConnectionError'];
$router_wan_uptime = $status['NewUptime'];
$router_wan_connect_time = date('Y-m-d H:i:s', time()-$router_wan_uptime );
$status = $client->GetExternalIPAddress();
$router_wan_ip = $status;


echo "<table border=0 BGCOLOR=#CECECE WIDTH='30%'>";
echo "<tr>";
echo "<td colspan=2>DSL Status";
echo "</tr>";
if($router_wan_status=='Connected' && $router_wan_error=='ERROR_NONE'){
echo "<tr>";
echo "<td BGCOLOR=#E3E3E3>ConnectTime";
echo "<td BGCOLOR=#E3E3E3>".$router_wan_connect_time;
echo "</tr>";
echo "<tr>";
echo "<td BGCOLOR=#E3E3E3>ConnectionDuration";
echo "<td BGCOLOR=#E3E3E3>".sec2string($router_wan_uptime);
echo "</tr>";
echo "<tr>";
echo "<td BGCOLOR=#B2FFA9>Status";
echo "<td BGCOLOR=#B2FFA9>$router_wan_status";
echo "</tr>";
}else{
echo "<tr>";
echo "<td colspan=2 BGCOLOR=#FFAAA9>$router_wan_status";
echo "</tr>";
echo "<tr>";
echo "<td colspan=2 BGCOLOR=#FFAAA9>$router_wan_error";
echo "</tr>";
}
echo "<tr>";
echo "<td BGCOLOR=#E3E3E3>WAN IP";
echo "<td BGCOLOR=#E3E3E3>".$router_wan_ip;
echo "</tr>";
echo "</table>";

?>
</body>

omtom 2015-07-16 23:22 ^ 355

Posts: 2
Guest
Hallo,

ich muss also auf meinen Rechner z.B. einen Apache-Webserver installieren (oder wamp). Sehe ich das richtig? - es ist schon lange her, als ich das letzte Mal damit gearbeitet habe.

Gruß
T.

bitman 2015-07-17 19:18 ^ 356

Moderator
Posts: 109
Pages: 99
Registered: 2010-07-09
ja genau, du benötigst dazu z.B. einen Apache Webserver mit dem PHP Modul
bitman 2015-07-25 08:04 ^ 357

Moderator
Posts: 109
Pages: 99
Registered: 2010-07-09
Ich habe grade mal meine Fritz!Box 7390 auf FRITZ!OS 06.30 upgegradet und das Script funktioniert damit auch einwandfrei. Bei vorhergehenden Upgrades gab es Fritz!Box-seitig Änderungen aber diesmal lief alles glatt.