Fritz!Box UPNP

Natürlich arbeite ich auch in meinem Home-Office mit Skype for Business. Allerdings ist ein DSL-Anschluss natürlich nicht mit einem Firmenanschluss zu vergleichen. Zum einen ist die Bandbreite niedriger und damit auch die Latenzzeit höher. Aber natürlich gibt es noch andere Dienste wie. z.B. ein NAS, welches sich mit OneDrive synchronisiert und Familienmitglieder, die "mitsurfen". Da wäre es schon mal interessant zu sehen, welche Auslastung im Moment die WAN-Leitung hat.

Fritz!Box Traffic

Die Anforderung hatten wohl schon mehrere Personen und Sebastian Weber hat eine kleine Windows Applikation als auch ein Gadget für den Desktop zur Anzeige der aktuellen Auslastung.

Die Anzeige wird ca. alle 1,5 Sekunden aktualisiert und gibt einen netten Überblick über den aktuellen Durchsatz.

Inside

Nun will ich vielleicht nicht immer ein Tray-Programm auf meinem Desktop laufen lassen. Wie wäre eine LED oder andere Anzeige, die diese Daten ermittelt und visualisiert? Also habe ich geschaut, was die App im Hintergrund gemacht und war nicht wirklich erstaunt, dass Sie die gleichen Wege nutzt, die ich auf PRTG:Fritzbox und PS SOAP beschrieben habe. Technisch wird ein HTTP POST auf den Port 49000 der Fritz!Box gesendet, die dann die Daten preis gibt.

Das ganze erfolgt unverschlüsselt und ohne Authentifizierung, wie ein e Auswertung zeigt. (Ich habe den Request mit dem "100 Continue") zusammengefasst. Zuerst der "Post" an die Box mit der XML-Struktur:

POST /igdupnp/control/WANCommonIFC1 HTTP/1.1
SOAPACTION: urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetAdd-onInfos
Content-Type: text/xml; charset="utf-8" User-Agent: AVM UPnP/1.0 Client 1.0
Host: fritz.box:49000
Content-Length: 287

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body><u:GetAdd-onInfos xmlns:u="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"></u:GetAdd-onInfos>
</s:Body>
</s:Envelope>

Die Antwort ist dann ein 200 OK mit einer XML-Struktur, die ich zur Lesbarkeit eingerückt habe:

HTTP/1.1 200 OK
DATE: Thu, 22 Dec 2016 15:45:39 GMT
SERVER: FRITZ!Box Fon WLAN 7390 UPnP/1.0 AVM FRITZ!Box Fon WLAN 7390 84.06.51
CONNECTION: keep-alive
CONTENT-LENGTH: 1004
CONTENT-TYPE: text/xml; charset="utf-8"
EXT:

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:GetAdd-onInfosResponse xmlns:u="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1">
      <NewByteSendRate>54031</NewByteSendRate>
      <NewByteReceiveRate>2019</NewByteReceiveRate>
      <NewPacketSendRate>0</NewPacketSendRate>
      <NewPacketReceiveRate>0</NewPacketReceiveRate>
      <NewTotalBytesSent>4587250342</NewTotalBytesSent>
      <NewTotalBytesReceived>6135333710</NewTotalBytesReceived>
      <NewAutoDisconnectTime>0</NewAutoDisconnectTime>
      <NewIdleDisconnectTime>1</NewIdleDisconnectTime>
      <NewDNSServer1>217.237.150.115</NewDNSServer1>
      <NewDNSServer2>217.237.151.205</NewDNSServer2>
      <NewVoipDNSServer1>217.237.150.115</NewVoipDNSServer1>
      <NewVoipDNSServer2>217.237.151.205</NewVoipDNSServer2>
      <NewUpnpControlEnabled>0</NewUpnpControlEnabled>
      <NewRoutedBridgedModeBoth>1</NewRoutedBridgedModeBoth>
    </u:GetAdd-onInfosResponse>
  </s:Body>
</s:Envelope>

Test in PowerShell

So ein einfacher HTTP-Post kann ich mit PowerShell quasi in Minuten zusammenbauen:

$requestxml = ' <?xml version="1.0"?> 
   <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" 
    s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
      <s:Body>
         <u:GetAdd-onInfos xmlns:u="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"></u:GetAdd-onInfos> 
      </s:Body> 
   </s:Envelope> '
$headers = @{}
$headers.add('SOAPACTION','urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetAdd-onInfos')
$headers.add('User-Agent','AVM UPnP/1.0 Client 1.0')
$headers.add('Content-Type','text/xml; charset=utf-8')
([System.Text.Encoding]::UTF8.GetBytes($requestxml))

Invoke-RestMethod `
   -Method POST `
   -Uri 'http://fritz.box:49000/igdupnp/control/WANCommonIFC1' `
   -Body $requestxml `
   -Headers $headers

Damit ist es natürlich sehr einfach, diese Daten auch in ein Monitoring zu übernehmen. Für die Überwachung mit PRTG habe ich it schon länger einen "besseren Sensor geschrieben, der viel mehr Daten erfasst:

Fritz-Status mit ESP8266

Interessanter finde ich aber den Status einfach mit einem IoT-Device zu lesen und anzuzeigen. Die Fritz!Box hat ja kein Display o.ä. die den aktuellen Durchsatz anzeigt. Ich habe mir daher überlegt, ob ich nicht mit einem ESP8266 im WLAN einfach die UPNP-Funktion der Fritz!Box nutze um dann die Daten abzufragen und zu visualisieren.

Das könnte eine RGB-LED sein aber viel interessanter fänd ich die Anzeige des aktuellen Durchsatzes auf einem kleinen Display. Entsprechende Displays mit I2C-Anschluss, die man direkt betreiben kann, gibt es schon für kleines Geld. Damit hätte ich dann zumindest im Bereich des WLANs eine akkurate Anzeige der aktuellen Auslastung.

Wie so oft hat man erst mal eine Idee und leistet ein paar Vorabreiten. Da sie hier noch keinen Code finden ist einfach der Tatsache geschuldet, dass ich noch nicht fertig bin

ESP8266 mit Display für andere Dinge

Wenn ich nun schon mal einen ESP8266 mit Display verbaut habe, kann man damit natürlich auch viele andere Dinge tun. Der ESP könnte auch andere Webseite "abfragen" und die Latenzzeit melden. Mit einer festen IP-Adresse könnte eine Software auch Meldungen an den ESP8266 senden. Allerdings muss man hier schon genau die Kosten und das "Styling" im Blick behalten. Manchmal ist ein abgelegtes Smartphone mit Display nicht mehr viel teurer und sowohl vom Styling als auch von der Bildqualität natürlich jeder Bastellösung überlegen.

Weitere Links