Programmierung > Delphi/Lazarus > FRITZ!Box

Internet Protokoll Adressen

Manchen interessiert es, mit welcher IP Adresse er ins Internet geht oder welche IP Adresse die Fritzbox im lokalen Netzwerk besitzt. Manchmal möchte man die IP Adresse ändern, weil nur eine bestimmte Anzahl Downloads erlaubt sind.

Boxinfo

Eigenschaften

Es stehen folgende Eigenschaften zur Verfügung:

property IPExtern: String;
property IPIntern: String;
property Reconnect: String;

OUT IPExtern: Gibt die externe IPAdresse der Fritzbox als IPv4 an.

OUT IPIntern: Gibt die interne IPAdresse der Fritzbox als IPv4 an.

OUT Reconnect: Verbindet die Fritzbox neu und gibt die neue externe IPAdresse als IPv4 zurück.

Anwendung

Die IP Adressen können sofort nach Erstellung der Klasse ohne Anmeldung abgefragt werden. Das Neuverbinden kann man mit einem Buttonklick auslösen.

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  ...
  {
  *  Fritzbox-Klasse erstellen.
  }
  FFritzbox := TFritzBox.create;
  lblConnIpExternValue.Caption := fFritzbox.IPExtern;
  lblConnIpInternValue.Caption := fFritzbox.IPIntern;
  ...
end;
 
procedure TfrmMain.sbnConnReconnectClick(Sender: TObject);
begin
  lblConnIpExternValue.Caption := fFritzbox.Reconnect;
end;

Informationen

Die interne IP Adresse kann per Winsock aus dem Hostnamen ermittelt werden.

Für die externe IP Adresse und das Neuverbinden benötigt man SOAP-Requests. Dies funktioniert so: Auf der Fritzbox sind verschiedene XML-Dateien abgelegt. In diesen Dateien sind die Funktionen der Fritzbox hierachisch dargestellt. Man beginnt beispielsweise mit der Standarddatei http://fritz.box:49000/igddesc.xml. Darin sind die Eigenschaften der Fritzbox sowie eine Serviceliste mit Verzeichnis- und Dateiangaben enthalten. Unter anderem findet sich dort die WAN IP Connection mit der Beschreibungsdatei /upnp/control/WANIPConn1/igdconnSCPD.xml. Folgend der hier interessierende Teil dieser Datei:

<?xml version="1.0"?>
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
  <specVersion>
    <major>1</major>
    <minor>0</minor>
  </specVersion>
  <actionList>
    ...
    <action>
      <name>ForceTermination</name>
    </action>
    ...
    <action>
      <name>GetExternalIPAddress</name>
      <argumentList>
        <argument>
          <name>NewExternalIPAddress>/name>
          <direction>out</direction>
          <relatedStateVariable>ExternalIPAddress</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
  </actionList>
  <serviceStateTable>
    ...
    <stateVariable sendEvents="yes" >
      <name>ExternalIPAddress</name>
      <dataType>string</dataType>
    </stateVariable>
    ...
  </serviceStateTable>
</scpd>

In der actionList ist die Action GetExternalIPAddress mit dem Ausgabeargument NewExternalIPAddress. Die dazugehörige Variable heißt ExternalIPAddress und ist nach der serviceStateTable vom Typ String. Damit erhält man die externe IP. Mit der Action ForceTermination lässt sich die Verbindung beenden, so dass sich die Fritzbox neu verbindet.

Daraus lassen sich SOAP-Requests konstruieren und abrufen. Für die externe IP:

POST /upnp/control/WANIPConn1 HTTP/1.1
Host: fritz.box:49000
Accept: */*
Connection: Close
Content-Type: text/xml
Content-Length: 270
 
SoapAction: urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress
 
<?xml version="1.0"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
               xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" />
</s:Body>
</s:Envelope>

mit dieser möglichen Antwort:

HTTP/1.1 200 OK
DATE: Sun, 30 Oct 2011 18:17:35 GMT
SERVER: fr_an UPnP/1.0 AVM FRITZ!Box Fon WLAN 7320 (UI) 100.04.89
CONNECTION: close
CONTENT-LENGTH: 361
CONTENT-TYPE: text/xml; charset="utf-8"
EXT:
 
<?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:GetExternalIPAddressResponse
            xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewExternalIPAddress>84.183.31.xxx</NewExternalIPAddress>
</u:GetExternalIPAddressResponse>
</s:Body> </s:Envelope>

Und für die Neuverbindung:

POST /upnp/control/WANIPConn1 HTTP/1.1
Host: fritz.box:49000
Accept: */*
Connection: Close
Content-Type: text/xml
Content-Length: 266
 
SoapAction: urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination
 
<?xml version="1.0"?>
<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>

mit der möglichen Antwort:

HTTP/1.1 200 OK
  DATE: Mon, 31 Oct 2011 15:10:12 GMT
  SERVER: fr_an UPnP/1.0 AVM FRITZ!Box Fon WLAN 7320 (UI) 100.04.89
  CONNECTION: close
  CONTENT-LENGTH: 293
  CONTENT-TYPE: text/xml; charset="utf-8"
  EXT:

  <?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:ForceTerminationResponse
              xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
              </u:ForceTerminationResponse>
  </s:Body> </s:Envelope>
          

Hier scheint das Firmware-Update ab FRITZ!OS 5.50 keine Änderungen gebracht zu haben.

 

Links

Wikipedia: Universal Plug and Play
AVM Wiki: UPnP
AVM Wiki: Igddesc.xml
AVM Wiki: IgdconnSCPD.xml
AVM Schnittstellen und Entwicklungen