« Posts tagged FRITZ!Box

Allnet ALL7950 VoIP Telefon an Fritz!Box betreiben

Oftmals findet man in der Bucht relativ günstig gebrauchte kabelgebundene VoIP Telefone. Die meisten davon waren in irgendwelchen Firmen im Einsatz. Dazu zählt auch das Allnet ALL7950 VoIP Telefon, das ich für einen einstelligen Betrag ersteigert habe.

Allnet ALL7950 VoIP Telefon

Das gute an vielen dieser VoIP Telefone ist, dass sie an der Fritz!Box betrieben werden können, darum hier eine Erklärung wie man das Allnet ALL7950 an der Fritz!Box in Betrieb nimmt:

Zu erst stecken wir Strom- und Lankabel an und warten bis das Telefon sich eine IP via DHCP geholt hat. Die aktuellste Firmware ist 2.09.31 vom 07.12.05. Die Firmware-Links beim Hersteller sind leider alle down, es gibt nur noch ganz wenige Quellen im Netz (nicht von mir).

Kurz einige Links:
Anleitung: klick
Downloadseite des Herstellers: klick
Aktuelle Firmware: klick

Prüfen der Firmwareversion und IP:
“Menu” drücken und mit den Pfeiltasten durchs Menu bewegen bis man bei Firmwareversion bzw. IP ankommt.

Webinterface
http://<TelefonIP>:9999
Passwort+Username sind von Werk aus leer (einfach Enter drücken).

PW+Username zurücksetzen ohne Webinterfacezugriff
Keine Ahnung was davon richtig ist:
255*000 via Tastenfeld eingeben (klick)
Stecke den Strom aus, wieder ein, und tippe sobald als möglich 255*000 und 3 x OK (klick)

Firmware Upgrade unter Linux:
TFTP Client/Server im Telefon muss aktiviert sein
sudo apt-get install tftp
tftp <TelefonIP>

binary
put ALL7950-020931.azf

… Telefon startet neu …
Fertig, Firmwareversion im Menü prüfen!

Firmware Upgrade unter Windows:
Analog wie Windows, für Tools siehe klick.

Auf Fabrikeinstellungen zurücksetzen
Via Webinterface möglich.

An der Fritz!Box anmelden:
1. Telefonie -> Telefoniegeräte -> Neues Gerät einrichten
2. Telefon (mit und ohne Anrufbeantworter)
3. LAN/WLAN (IP-Telefon)
4. Notieren (Passwort beliebig vergeben!):

Registrar fritz.box
Benutzername <User>
Passwort <Passwort>

5. Nummern auswählen über die Gespräche geführt werden
6. Alle Anrufe annehmen
7. Einstellungen in der Weboberfläche des Telefons:

SIP User Settings:
Displayed Name: Name des Telefons (frei wählbar)
SIP Username -> <User>
Authentication Name -> <User>
Authentication Password -> <Passwort>
SIP Settings:
SIP Server Domain Name/IP Address -> fritz.box
Authentifizierung Time Out -> 300
Session Timer -> 300
Session Refresher -> UAC
Session Timer Method -> Update
STUN & UPnP Settings:
Always send keepalive packet -> enable
KeepAlive Time -> 30

8. Fertig -> Telefon sollte seine interne Rufnummer (ohne **) im Display in der zweiten Zeile anzeigen.

Viel Spaß damit!

Edit: Hab einige neue Einstellungen hinzugefügt, da ich einige kleinere Probleme hatte (Verbindungabbrüche u.a.)

Schneller Reconnect der FRITZ!Box in Python

Python Logo

Wer hätte nicht gerne eine Möglichkeit mal eben schnell die FRITZ!Box per Shellskript zu einem Reconnect zu überreden? Ganz am Anfang (Jahr 2000 oder so?) gab es ja nur so eine “dubiose” Binary für Windows, welche per UPNP ulra schnell die FRITZ!Box reconnecten konnte.(2 Sekunden ca.)

Heute machen wir das ein bisschen schöner(nicht nur für Linux!) in Python (Version 2.x):

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2011  Geekparadise.de
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact: http://geekparadise.de/contact/
# Usage: ./reconnect.py
# Version: 1.0
# Only for Python 2.x!

import re
import pycurl
import StringIO
import sys

def post_data(data):
        encoded_data = ["Content-Type: text/xml", \
        "charset: utf-8", "SoapAction: urn:schemas-upnp-org:service:WANIPConnection:1#"+data]
        encoded_data2=("""<?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:"""+data+"""s xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" />
        </s:Body>
        </s:Envelope>""")
        try:
                b = StringIO.StringIO()
                curl = pycurl.Curl()
                curl.setopt(pycurl.POSTFIELDS, encoded_data2)
                curl.setopt(pycurl.HTTPHEADER,encoded_data)
                curl.setopt(pycurl.TIMEOUT,10)
                curl.setopt(pycurl.CONNECTTIMEOUT,10)
                curl.setopt(pycurl.URL, "http://fritz.box:49000/upnp/control/WANIPConn1")
                curl.setopt(pycurl.WRITEFUNCTION, b.write)
                curl.perform()
                return b.getvalue()
        except:
                print "Error: connection problems."
                exit(-1)

# Query actual IP and show it
ip = re.split(r"<NewExternalIPAddress>",post_data("GetExternalIPAddress"))
if len(ip) > 1:
        ip = re.split(r"</NewExternalIPAddress>",ip[1])
else:
        print "Error: IP query failed."
        exit(-1)
print "Actual IP: "+ip[0]

# start reconnect
sys.stdout.write("Reconnect...")
sys.stdout.flush()
post_data("ForceTermination")
print "done."

# Query actual IP
ip2 = re.split(r"<NewExternalIPAddress>",post_data("GetExternalIPAddress"))
if len(ip2) > 1:
        ip2 = re.split(r"</NewExternalIPAddress>",ip2[1])
else:
        print "Error: IP query failed."
        exit(-1)

# Check if IP has changed: True -> show new IP; False -> show error.
if ip[0] != ip2[0]:
        print "New IP: "+ip2[0]
        exit(0)
else:
        print "Error: IP did not change."
        exit(-1)

Für Distributionen mit Python 3 als Standard sollte man die erste Zeile in

#!/usr/bin/python2

ändern.

Das ganze in reconnect.py (oder wie ihr es nennen wollt..) packen und mit chmod +x reconnect.py ausführbar machen.

Weiterhin muss der UPNP Kram in der Fritz!Box aktiviert sein.(Bei mir ist das irgendwo bei “Netzwerkeinstellungen” und dort muss ” Statusinformationen über UPnP übertragen (empfohlen)” und “Änderungen der Sicherheitseinstellungen über UPnP gestatten” aktiviert sein.)

Übrigens: Der reconnect selbst geht extrem schnell (~1-2 Sekunden) nur die Abfrage der neuen IP braucht einige Sekunden, in der Weboberfläche ist sie viel schneller sichtbar.

Getestet hab ich das auf einer FRITZ!Box SL Wlan, ob das bei neueren Modellen auch noch geht, weiß ich nicht.

Die Idee stammt übrigens nicht von mir, ursprl. kommt sie glaube ich aus einem Reconnect Binary für Windows,
blog.Jbbr.net hat dann eine Curlvariante für Linux dazu geschrieben. Details zur Fritz!Box UPNP Geschichte hab ich dann bei OpenShots gefunden. Danke dafür!

Falls ihr sagt “Wow, WTF ist eine FRITZ!Box?”, FRITZ!Box ist ein DSL-Router der Firma AVM. Falls ihr auch einen schnellen Reconnect wollt: Kauft euch eine FRITZ!Box, AVM freut sich ;)

Update(18.03.2012):
Aufgrund einer Nachfrage hier noch die “verbesserte” Version, ich weiß gar nicht mehr genau was ich geändert habe, jedenfalls versucht diese Version 3 Mal die IP zu wechseln. Zusätzlich habe ich ein paar Kleinigkeiten geändert, weil es bei der älteren manchmal etwas Probleme gab .. wie auch immer, jedenfalls klappt diese Version ganz gut, ich nutze sie schon länger…
Noch eine Änderung gab es: Es wird nun checkip.dyndns.org genutzt um die eigene IP abzufragen, weil das bisherige da eher unzuverlässig war.

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2012  Geekparadise.de
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact: http://geekparadise.de/contact/
# Usage: ./reconnect.py
# Version: 1.1
# Only for Python 2.x!

import re
import pycurl  
import StringIO 
import sys
import time

def getIP():
        b = StringIO.StringIO()
        curl = pycurl.Curl()
        curl.setopt(pycurl.TIMEOUT,10)
        curl.setopt(pycurl.CONNECTTIMEOUT,10)
        curl.setopt(pycurl.URL, "http://checkip.dyndns.org")
        curl.setopt(pycurl.WRITEFUNCTION, b.write)
        curl.perform()
        ip = re.search(r'\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b',b.getvalue())
        if ip:
                return ip.group(0)
        else:
                return false	


def post_data(data):
        encoded_data = ["Content-Type: text/xml", \
        "charset: utf-8", "SoapAction: urn:schemas-upnp-org:service:WANIPConnection:1#"+data]
        encoded_data2=("""<?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:"""+data+"""s xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" />
        </s:Body>
        </s:Envelope>""")
        try:
                b = StringIO.StringIO()
                curl = pycurl.Curl()
                curl.setopt(pycurl.POSTFIELDS, encoded_data2)
                curl.setopt(pycurl.HTTPHEADER,encoded_data)
                curl.setopt(pycurl.TIMEOUT,10)
                curl.setopt(pycurl.CONNECTTIMEOUT,10)
                curl.setopt(pycurl.URL, "http://fritz.box:49000/upnp/control/WANIPConn1")
                curl.setopt(pycurl.WRITEFUNCTION, b.write)
                curl.perform()
                return b.getvalue()
        except:
                print "Error: connection problems."
                exit(-1)
                
def reconnect():
        # Query actual IP and show it
        ip = re.split(r"<NewExternalIPAddress>",post_data("GetExternalIPAddress"))
        if len(ip) > 1:
                ip = re.split(r"</NewExternalIPAddress>",ip[1])
        else:
                print "Error: IP query failed."
                exit(-1)
        print "Actual IP: "+ip[0]
        # Start reconnect
        sys.stdout.write("Reconnect...")
        sys.stdout.flush()
        post_data("ForceTermination")
        print "done."
        # Query actual IP
        ip2 = getIP()
        if ip2 == False:
                print "Error: IP query failed."
                exit(-1)
        if ip[0] != ip2:
                print "New IP: "+ip2
                return True
        else:
                return False
        
counter = 0
bool = reconnect()
while not bool and counter < 3:
        print "Error: IP did not change."
        time.sleep(2)
        print "Trying again...."
        bool = reconnect()
        counter = counter + 1 

if counter >= 3:
        print "Error: 3 failed attempts...abborting."
        exit(-1)        
exit(0)