BigBastis Blog

VB.NET: FitzBox IP erneuern ueber uPnP

Introduction

user

Sebastian Gross

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.NET

VB.NET: FitzBox IP erneuern ueber uPnP

Posted on .

Die FritzBox ist als Router weit verbreitet und bietet einen Haufen an Konfigurationsmöglichkeiten an. Eins der nützlichsten Features ist uPnP (Universal Plug and Play). Diese Schnittstelle bietet uns eine sehr bequeme Möglichkeit mit dem Gerät zu kommunizieren ohne dass man einen Benutzernamen oder ein Kennwort benötigt!

Wer öfter mal im Internet unterwegs ist, kennst sicherlich mehrere gute Gründe seine IP zu wechseln. Und das ist sehr einfach, denn alles was dafür nötig ist, ist eine erneute Einwahl ins Internet.

Dies kann man sehr einfach über die Benutzeroberfläche der FritzBox machen oder einfach „oldschool“-mäßig das Netzwerkkabel aus der FritzBox ziehen und wieder einstecken. (Letzteres erfordert ebenfalls keinen Benutzernamen und Passwort)

Doch wenn man des öfteren auf diese Funktionalität angewiesen ist, ist es doch relativ nervig und umständlich. Deswegen werden wir hier ein einfaches kleines Programm entwickeln, dass für uns den Router zu einer Neueinwahl ins Internet „zwingt“.

Wie oben bereits erwöhnt heißt die Technologie dafür UPnP (Universal Plug and Play). Über diese Technologie lassen sich sehr viele Befehle an die Fritzbox senden, vorausgesetzt, man befindet sich in dem selben Netzwerk.

Von Statusabfragen über Auslastungen und Übertragung, lassen sich sogar Telefonnummern anwählen und Anrufe steuern, im Prinzip kann man alle Funktionen darüber ansteuern. Hier gibts eine nette Übersicht mit vielen Beispielen.

Wie werden die Anfragen eigentlich an die Fritzbox übertragen? Das geschieht sehr einfach über einen POST Aufruf, denn auf der Fritzbox (und auch auf den meisten anderen Routern) läuft ein kleiner Webserver denn man ganz einfach über den Browser erreicht, wenn man die adresse „fritz.box“ in die Adresszeile tippt.

Dort ist die Fritzbox genauso aufgebaut wie eine gewöhnliche Webseite. Und diese nimmt auch POST und GET aufrufe entgegen. Genau hier setzen wir an und werden unsere Befehle rüber schicken.

        Dim client As New TcpClient

        client.Connect("fritz.box", 49000)

        Dim stream As NetworkStream = client.GetStream
        Dim bytes As Byte() = New Byte((My.Resources.msg.Length)) {}

        bytes = Encoding.ASCII.GetBytes(My.Resources.msg)

        stream.Write(bytes, 0, bytes.Length)
        bytes = New Byte(1024) {}

        Dim str As String = String.Empty

        Dim count As Integer = stream.Read(bytes, 0, bytes.Length)

        str = Encoding.ASCII.GetString(bytes, 0, count)

        stream.Close()
        client.Close()

Der Code ist sehr simpel, wir erstellen uns einen WebClient und verbinden uns mit der FritzBox. Nach der Verbindung senden wir ein POST Request raus und lesen anschließend die Antwort wieder aus.

Mit dem obigen Code senden wir folgenden Befehl an die Fritzbox:

POST /upnp/control/WANIPConn1 HTTP/1.1
HOST: fritz.box:49000
SOAPACTION: "urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination"
CONTENT-TYPE: text/xml ; charset="utf-8"
Content-Length: 293

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

Wie man sieht ist der Befehl ein gewöhnlicher POST Aufruf inkl. Header. Dieser übergibt einen Befehl urn:schemas-„upnp-org:service:WANIPConnection:1#ForceTermination“, der der Fritzbox sagt die Verbindung ins Internet neu aufzubauen.

Man muss hierbei sehr aufpassen, besonders die Content-Length Angabe muss genaustens passen, da sonst ein Fehler als Antwort eintrudelt.

Wie immer gibts auch eine kleine Demoanwendung.

Bild 1: Das Demo Programm in action

Download hier: Download [VS 2008 Projekt]

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.

Comments
user

Author bigbasti87

Posted at 19:10 17. Februar 2010.

Bloggd: VB.NET: FitzBox IP erneuern über uPnP – http://blog.bigbasti.com/vb-net-fitzbox-… #fritzbox #ipreset #vb #net

user

Author Tabby

Posted at 13:55 4. September 2010.

Hey
Ich bekomme immer einen Fehler bei „My.Resources.msg“.
Wo finde ich msg?

user

Author admin

Posted at 18:54 4. September 2010.

Hallo Tabby,
würde dir ja wirklich gerne helfen, nur sagt mir deine „Fehlerbeschreibung“ absolut garnix.
Lies dir mal folgenden Beitrag durch und dann kannst du es gerne nochmal versuchen http://blog.bigbasti.com/problemberichte-richtig-machen/
MfG, Basti

user

Author Tabby

Posted at 10:10 5. September 2010.

Hey
Hier erst einmal ein Bild von dem Fehler: http://img521.imageshack.us/f/fritzboxerror.png/
Ich habe Windows 7 Home Permium (64 Bit) und Intel Core 2 Duo CPU T6600 @ 2.20 GHz
Lg Tabby

user

Author admin

Posted at 17:57 5. September 2010.

Hallo Tabby,
nun ist alles klar 🙂 Du musst unter deinen Ressourcen die Ressource „msg“ anlegen, damit du dann auf diese über My.Resources.msg zugreifen kannst.
Ressourcen kannst du unter dem Menüpunkt Projekt->[PROJEKTNAME]-Eigenschaften -> Ressourcen anlegen. (Schaus dir einfach in dem Demoprojekt an) Du kannst natürlich auch alternativ das was in der Ressource steht auch ein eine Stringvariable packen, ist vielleicht etwas weniger Aufwand, Dafür aber nicht so schön in der Wartung. Wie gesagt, schaus dir in dem Demoprojekt an unter den oben genannten Menüpfad.
Mfg, Basti

user

Author Hans

Posted at 08:04 14. Dezember 2011.

Danke für die Mühe und das Beispiel…. sehr nützlich!

user

Author Julian

Posted at 13:52 22. August 2012.

Hi
kannst du mir verraten wie du an den Befehl in der textbox gekommen bist? Haste das mit wireshark ausgelesen ?

Ich will nämlich mit dieser Methode einen Neustart des routers erreichen (kein reconecct!)

MfG Julian

Kommentar verfassen

View Comments (7) ...
Navigation