+ Antworten
Seite 1 von 34 1 2 3 11 ... LetzteLetzte
Ergebnis 1 bis 10 von 339
  1. #1
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    8,280

    Standard FritzBox mit SOAP auslesen und steuern

    Nachdem ich mich auch regelmäßig ärgere wenn eins der FritzBox Scripte nach einen FW-Update nicht mehr läuft, habe ich versucht einen Weg zu finden, welcher 'vielleicht' etwas weniger anfällig für Firmware , Weboberfläche, Lua-Script Änderungen seitens des Herstellers ist.

    Kurzer Rückblick:
    Auf die Idee bin ich durch Paresy's Script gekommen :http://www.ip-symcon.de/forum/thread...tzBox-auslesen

    Hier wird ein SOAP-Request zur Box gesendet und die Rückmeldung ausgewertet.

    Inzwischen geht das ganze recht komfortable.
    Einfache Abfrage
    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://fritz.box:49000/igdupnp/control/WANCommonIFC1",
            
    'uri'        => "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1",
            
    'noroot'     => True
        
    )
    );
    $status $client->GetAddonInfos(); 
    So erhält hat man ein assoziertes Array (hier $status) welches u.a. "NewByteSendRate" & "NewByteReceiveRate" enthält.

    Es gibt auch Dienste (das ist im Beispiel unter 'uri' zu finden) welche eine Authentifizierung benötigen.
    Hier ergänzt man das übergebende Array des SoapClient um die Felder 'login' = Benutzername und 'password' = passwort.

    Nun steht es jedem natürlich frei alle Werte für seine Box manuell in x Scripte regelmässig abzufragen.
    Dabei gibt es aber zwei Probleme, das ermitteln der möglichen Dienste und Funktionen (oben z.B. GetAddonInfos() ) und dass es auf den zig Modellen der Fritten nicht jeden Dienst geben muss.

    Test-Script
    Für das ermitteln der vorhandenen Dienste und Funktionen habe ich ein Testscript geschrieben, welche das Alles automatisch ermittelt, ausließt und in IPS als Struktur abbildet.

    Warnung
    Einsatz auf eigene Gefahr.
    Das Script ist rein zum Auslesen /Prüfen aller Dienste gedacht.
    Es sollte niemals automatisch zyklisch ausgeführt werden, da es einfach zu viel Last auf die FritzBox bringt und locker 1-3 Minuten Laufzeit hat.
    Es erhebt keinen Anspruch darauf Fehlerfrei zu sein. Wenn also eure Box anfängt zu fliegen, reden oder einfach die Werkseinstellungen lädt (und ja das geht wirklich über SOAP !) macht mich dafür nicht verantwortlich.

    Bevor der Code folgt, noch ein paar Infos wie Ihr eure Dienste selbst ermitteln könnt, bzw. wie es auch das Script macht:
    1. Es werden die XML Dateien mit xxxxxdesc.xml geladen und nach den Diensten (SCPD, URI und Location) durchsucht
    2. Die dazugehörige SCPD-Datei wird geladen und nach allen Funktionen für diesen Dienst durchsucht.
    3. Die Abschnitte der Funktionen enthalten Informationen darüber welche Daten als Parameter übergeben werden müssen (direction=in) oder welche Daten als Ergebnis zurück geliefert werden (direction=out).
    4. Das Testscript nimmt nur Funktionen ohne Parameter (also alles was mindesten ein out-Parameter und keinen in-Parameter hat) und führt einen SOAPRequest durch. Das Ergebnis wird angezeigt und im Baum abgebildet.


    Um also jetzt zu Fuss einen SOAPRequest zusammen zu bauen, müßt Ihr euch die Dateien von Punkt 1 und 2 ansehen (im Browser als http://<fritz-ip>:49000/<datei> aufrufen) und dann anhand der Parameter der 2.Datei 'raten' welche Funktion ihr haben wollt.

    Im zweiten Post folgen dann noch ein paar Beispiele für direkte Abfragen und ein paar Funktionen, welche euch das Leben etwas einfach machen sollten (um nicht alles statisch im PHP-Code zu codieren).

    Im dritten Post gibt es dann noch Beispiele wie man Daten per SOAP schreibt (z.B. Nachtschaltung, Reboot auslösen). Aber das wird erst die Tage etwas, leide gerade etwas unter Zeitmangel....

    Diese beiden Post werde ich gerne immer mal wieder mit Beispielen ergänzen und auch versuchen etwa in Schuss zu halten. Dazu wären natürlich Rückmeldungen von Euch nötig (mit Angabe der Typenbezeichnung und Firmware Eurer Box) welche Abfragen funktionieren.

    PHP-Code:
    <?
    set_time_limit
    (240);
    $fbroot ='http://fritz.box:49000';
    $fb_user='asdf@asdf.asdf';
    $fb_password='secret';

    $descXMLs = array(
    "tr64desc.xml",
    "igddesc.xml",
    //"MediaServerDevDesc.xml", //gibt es bei mir nicht
    //"onlinestoredesc.xml", //gibt es bei mir nicht
    //"fboxdesc.xml", //gibt es bei mir nicht
    "usbdesc.xml"
    );

    // ab hier nichts ändern
    foreach ($descXMLs as $descXML)
    {
        
    $xml = @simplexml_load_file($fbroot.'/'.$descXML);
        if (
    $xml === false)
        {
           echo 
    "Not found:".$descXML.PHP_EOL;
            continue;
        }
        
    $xml->registerXPathNamespace('fritzbox'$xml->getNameSpaces(false)[""]);
        
    $xmlservices $xml->xpath('//fritzbox:service');
        foreach (
    $xmlservices as $service)
        {
            
    $serviceIdent=str_replace(array(".",":","-","_"),array("","","",""),(string)$service->serviceId);
            if (!
    ctype_alnum($serviceIdent))
            {
                echo 
    "ERROR: Konnte Dienst nicht hinzufügen. Name kann nicht als Ident verwendet werden:".(string)$service->serviceId.PHP_EOL;
                continue;
            }
            
    $services[$serviceIdent]['descXML'] = $descXML;
            
    $services[$serviceIdent]['uri'] = (string)$service->serviceType;
            
    $services[$serviceIdent]['location'] =$fbroot.(string)$service->controlURL;
            
    $services[$serviceIdent]['SCPDURL'] =trim((string)$service->SCPDURL,"/");
        }
    }
    $parent IPS_GetParent($_IPS['SELF']);
    foreach (
    $services as $serviceIdent=>$data)
    {
        
    $StateVariables = array();
        
    $service_id = @IPS_GetObjectIDByIdent($serviceIdent,$parent);
        if (
    $service_id===false)
        {
           
    $service_id IPS_CreateCategory();
           
    IPS_SetIdent($service_id$serviceIdent);
           
    IPS_SetParent($service_id$parent);
           
    IPS_SetName($service_id,$data['SCPDURL']);
           
    IPS_SetInfo($service_id,$data['uri']);
        }
        
    $xmlDesc = @simplexml_load_file($fbroot.'/'.$data['SCPDURL']);
        if (
    $xmlDesc === false)
        {
           echo 
    "Not found:".$data['SCPDURL'].PHP_EOL;
            continue;
        }
        
    $xmlDesc->registerXPathNamespace('fritzbox'$xmlDesc->getNameSpaces(false)[""]);
        
    $xmlActionList $xmlDesc->xpath("//fritzbox:action[fritzbox:argumentList/fritzbox:argument/fritzbox:direction ='out']");
        
    $xmlStateVariable $xmlDesc->xpath('//fritzbox:stateVariable');
        foreach (
    $xmlStateVariable as $StateVariable)
        {
            
    $StateVariables[(string)$StateVariable->name] = (string)$StateVariable->dataType;
        }
        foreach (
    $xmlActionList as $ActionList)
        {

            foreach (
    $ActionList->argumentList->argument as $Argument)
            {
                if ((string)
    $Argument->direction == "in") continue 2;
              
    $relatedStateVariable[(string)$Argument->name]=(string)$Argument->relatedStateVariable;
            }
            
    $client = new SoapClient(null,
                array(
                    
    'location'   => $data["location"],
                    
    'uri'        => $data["uri"],
                    
    'noroot'     => True,
                    
    'login'      => $fb_user,
                    
    'password'   => $fb_password,
                    
    'trace'=>TRUE,
                    
    'exceptions'=>false
                
    )
            );
            
    $status $client->{(string)$ActionList->name}();
            if (
    is_soap_fault($status))
            {
               echo 
    "--------------ERROR START----------------".PHP_EOL;
                echo 
    " descXML: ".$data['descXML'].PHP_EOL;
                echo 
    " SCPDURL: ".$data['SCPDURL'].PHP_EOL;
                echo 
    " Location: ".$data["location"].PHP_EOL;
                echo 
    " URI: ".$data["uri"].PHP_EOL;
                echo 
    " Action: ".(string)$ActionList->name.PHP_EOL;
               echo 
    "--------------ERROR END------------------".PHP_EOL.PHP_EOL;;
                continue;
            } else {
                echo 
    " descXML: ".$data['descXML'].PHP_EOL;
                echo 
    " SCPDURL: ".$data['SCPDURL'].PHP_EOL;
                echo 
    " Location: ".$data["location"].PHP_EOL;
                echo 
    " URI: ".$data["uri"].PHP_EOL;
                echo 
    " Action: ".(string)$ActionList->name.PHP_EOL;
                
    print_r($status);
                echo 
    PHP_EOL.PHP_EOL;
            }
            
    $actionIdent=str_replace(array(".",":","-","_"),array("","","",""),(string)$ActionList->name);
            if (!
    ctype_alnum($actionIdent))
            {
                echo 
    "ERROR: Konnte Action nicht hinzufügen. Name kann nicht als Ident verwendet werden:".(string)$ActionList->name.PHP_EOL;
                continue;
            }
            
    $action_id = @ IPS_GetObjectIDByIdent($actionIdent,$service_id);
            if (
    $action_id===false)
            {
               
    $action_id IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
               
    IPS_SetIdent($action_id$actionIdent);
               
    IPS_SetParent($action_id$service_id);
               
    IPS_SetName($action_id,(string)$ActionList->name);
            }
            if    (
    count($ActionList->argumentList->argument) == 1)
            {
                
    UpdateIPSvar($action_id,(string)$ActionList->argumentList->argument->relatedStateVariable,$status,$StateVariables[(string)$ActionList->argumentList->argument->relatedStateVariable]);
            }
            else
            {
                foreach (
    $status as $key=>$value)
                {
                    
    UpdateIPSvar($action_id,$relatedStateVariable[$key],$value,$StateVariables[$relatedStateVariable[$key]]);
                }
            }
        }
    }

    function 
    UpdateIPSvar($parent,$ident,$value,$type)
    {
        
    $ident=str_replace(array(".",":","-","_"),array("","","",""),$ident);
        if (!
    ctype_alnum($ident))
        {
            echo 
    "ERROR: Konnte Variable nicht hinzufügen. Name kann nicht als Ident verwendet werden:".$ident.PHP_EOL;
            return;
        }
        switch (
    $type)
        {
            case 
    "i1":
            case 
    "i2":
            case 
    "i4":
            case 
    "ui1":
            case 
    "ui2":
            case 
    "ui4":
                
    $ips_type=1;
                break;
            case 
    "boolean":
                
    $ips_type=0;
                break;
            case 
    "uuid":
            case 
    "dateTime":
            case 
    "string":
                
    $ips_type=3;
                break;
            default:
                echo 
    "Unbekannt:".$type.PHP_EOL;
                return;
                break;
        }
        
    $var_id = @IPS_GetObjectIDByIdent($ident,$parent);
        if (
    $var_id === false)
        {
            
    $var_id IPS_CreateVariable($ips_type);
            
    IPS_SetName($var_id,$ident);
            
    IPS_SetIdent($var_id,$ident);
            
    IPS_SetParent($var_id,$parent);
        }
        switch (
    $ips_type)
        {
            case 
    0:
               if (
    GetValueBoolean($var_id) <> (bool)$value)
               {
                  
    SetValueBoolean($var_id,(bool)$value);
               }
                break;
            case 
    1:
                if (
    GetValueInteger($var_id) <> (int)$value)
                {
                   
    SetValueInteger($var_id,(int)$value);
                }
                break;
            case 
    2:
                if (
    GetValueFloat($var_id) <> round((float)$value,2))
                {
                   
    SetValueFloat($var_id,round((float)$value,2));
                }
                break;
            case 
    3:
                if (
    GetValueString($var_id) <> $value)
                {
                   
    SetValueString($var_id,$value);
                }
                break;
        }
    }
    ?>
    Ihr erhaltet einen Ausgabe die in für jede Aktion folgendes enthält:
    Code:
     SCPDURL: deviceinfoSCPD.xml
     Location: http://fritz.box:49000/upnp/control/deviceinfo
     URI: urn:dslforum-org:service:DeviceInfo:1
     Action: GetInfo
    Array
    (
        [NewManufacturerName] => AVM
        [NewManufacturerOUI] => 00040E
        [NewModelName] => FRITZ!Box 6360 Cable (kdg)
        [NewDescription] => FRITZ!Box 6360 Cable (kdg) 85.06.05
        [NewProductClass] => FRITZ!Box
    .....
    Die ersten 4 Zeilen zeigen welcher Dienst mit welcher Funktion aufgerufen wurde.
    Ab der 5. Zeile kommen die von der Box gemeldeten Werte.

    Sollte die Abfrage fehlgeschlagen sein sieht das so aus:
    Code:
    --------------ERROR START----------------
     SCPDURL: deviceconfigSCPD.xml
     Location: http://fritz.box:49000/upnp/control/deviceconfig
     URI: urn:dslforum-org:service:DeviceConfig:1
     Action: ConfigurationFinished
    --------------ERROR END------------------
    Außerdem können erfolgreichen Abfragen aus dem Objektbaum rekonstruiert werden.
    Dazu jetzt mal ein Bild

    Name:  SOAP_Fritz_Hilfsscript.png
Hits: 27439
Größe:  68.8 KB

    Michael
    Geändert von Nall-chan (11.10.14 um 11:25 Uhr)
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  2. #2
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    8,280

    Standard Beispiele um Werte abzufragen

    Kleines Helferlein
    Hier mal ein Script welches 4 Hilfsfunktionen enthält um Abfragen nicht ganz Statisch im Script zu haben.
    Die XML-Dateien liegen immer im 'root' also http://<fritz-ip>/igddesc.xml und sollten Updatefest sein (der Inhalt vermutlich nicht )

    Erklärungen im Quellcode
    PHP-Code:
    <?
    $fbroot 
    ='http://fritz.box:49000'//Adresse + Port (immer 49000)
    $desc "igddesc.xml"//Hier sind die Infos über die Dienste enthalten
    $SCPD "igdicfgSCPD.xml";  // Hier sind die Infos über die Funktionen und Parameter/Variablen enthalten, sowie die Definition der Variablen Typen.
    $action="GetAddonInfos";  //Diese Funktion soll ausgeführt werden

    // FB_getServiceData holt alle benötigten Daten aus der $desc XML
    $service FB_getServiceData($fbroot,$desc,$SCPD,$action);
    //$service =
    /*array(3) {
      ["uri"]=>
      string(55) "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"
      ["location"]=>
      string(52) "http://fritz.box:49000/igdupnp/control/WANCommonIFC1"
      ["SCPDURL"]=>
      string(15) "igdicfgSCPD.xml"
    }
    */
    // FB_getStateVars holt die Definition der Variablen aus der SCPD XML für die gewählte Aktion
    // Wen die die Typen kennt/manuell die IPS-Variablen befüllt, braucht Ihr diese Funktion nicht ausführen.
    $StateVars FB_getStateVars ($fbroot,$service,$action);
    /*
    $StateVars = (Beispiel)
    array(14) {
      ["NewByteSendRate"]=>
      string(3) "ui4"
      ["NewByteReceiveRate"]=>
      string(3) "ui4"
      ["NewPacketSendRate"]=>
      string(3) "ui4"
      ["NewPacketReceiveRate"]=>
      string(3) "ui4"
      ["NewTotalBytesSent"]=>
      string(3) "ui4"
      ["NewTotalBytesReceived"]=>
      string(3) "ui4"
      ["NewAutoDisconnectTime"]=>
      string(3) "ui4"
      ["NewIdleDisconnectTime"]=>
      string(3) "ui4"
      ["NewDNSServer1"]=>
      string(6) "string"
      ["NewDNSServer2"]=>
      string(6) "string"
      ["NewVoipDNSServer1"]=>
      string(6) "string"
      ["NewVoipDNSServer2"]=>
      string(6) "string"
      ["NewUpnpControlEnabled"]=>
      string(7) "boolean"
      ["NewRoutedBridgedModeBoth"]=>
      string(7) "boolean"
    }
    */

    // FB_SoapAction($service,$action,$user = false,$pass = false) führt den SOAP Request aus. Variablen wie oben beschrieben. $service könnt ihr auch manuell befüllen, dann wird FB_getServiceData auch nicht benötigt.
    $result =  FB_SoapAction($service,$action);
    /*
    $result = (Beispiel)
    array(14) {
      ["NewByteSendRate"]=>
      string(5) "14380"
      ["NewByteReceiveRate"]=>
      string(6) "900533"
      ["NewPacketSendRate"]=>
      string(3) "209"
      ["NewPacketReceiveRate"]=>
      string(3) "605"
      ["NewTotalBytesSent"]=>
      string(8) "27991885"
      ["NewTotalBytesReceived"]=>
      string(10) "1116689220"
      ["NewAutoDisconnectTime"]=>
      string(1) "0"
      ["NewIdleDisconnectTime"]=>
      string(1) "0"
      ["NewDNSServer1"]=>
      string(14) "111.111.111"
      ["NewDNSServer2"]=>
      string(14) "111.111.111"
      ["NewVoipDNSServer1"]=>
      string(14) "111.111.111"
      ["NewVoipDNSServer2"]=>
      string(14) "111.111.111"
      ["NewUpnpControlEnabled"]=>
      string(1) "0"
      ["NewRoutedBridgedModeBoth"]=>
      string(1) "0"
    }
    */

    // UpdateIPSvar($parent,$ident,$value,$type) ist eine 'typische' Hilfsfunktion, welche eine Variable erstellt wenn sie nicht vorhanden ist und sie mit den aktuellen Daten (bei Änderung) befüllt.
    // $parent = IPS_ID welche der Parent der Variable ist /wird
    // $ident = IDENT der Variable zum wiederfinden (wird beim anlegen auch als Name genutzt; Name kann jederzeit geändert werden im Objektbaum)
    // $value = Neuer Wert der Variable
    // $type = String welcher den Type der Variable im FritzBox-Format enthält. Oder als int den Typ in IPS-Format (0 = bool, 1 = int, 2 = float, 3 = string)
    UpdateIPSvar(IPS_GetParent($_IPS['SELF']),'KByteSendRate',$result['NewByteSendRate']/1024,2);
    UpdateIPSvar(IPS_GetParent($_IPS['SELF']),'KByteReceiveRate',$result['NewByteReceiveRate']/1024,2);


    function 
    FB_getServiceData($fbroot,$desc,$SCPD,$action)
    {
        
    $xml = @simplexml_load_file($fbroot.'/'.$desc);
        if (
    $xml === false)
        {
           echo 
    "Not found:".$descXML.PHP_EOL;
            return 
    false;
        }
        
    $xml->registerXPathNamespace('fb'$xml->getNameSpaces(false)[""]);
        
    $xmlservice $xml->xpath("//fb:service[fb:SCPDURL='/".$SCPD."']");
        
    $service['uri'] = (string)$xmlservice[0]->serviceType;
        
    $service['location'] =$fbroot.(string)$xmlservice[0]->controlURL;
        
    $service['SCPDURL'] =trim((string)$xmlservice[0]->SCPDURL,"/");
        return 
    $service;
    }

    function 
    FB_getStateVars ($fbroot,$service,$action)
    {
        
    $xmlDesc = @simplexml_load_file($fbroot.'/'.$service['SCPDURL']);
        if (
    $xmlDesc === false)
        {
           echo 
    "Not found:".$service['SCPDURL'].PHP_EOL;
            return 
    false;
        }
        
    $xmlDesc->registerXPathNamespace('fritzbox'$xmlDesc->getNameSpaces(false)[""]);
        
    $xmlArgumentList $xmlDesc->xpath("//fritzbox:actionList/fritzbox:action[fritzbox:name='".$action."']/fritzbox:argumentList/fritzbox:argument");
        
    $StateVariables=false;
        foreach (
    $xmlArgumentList as $xmlArgument)
        {
            
    $xmlStateVariable $xmlDesc->xpath("//fritzbox:stateVariable[fritzbox:name='".(string)$xmlArgument->relatedStateVariable."']");
            
    $StateVariables[(string)$xmlArgument->name] =  (string)$xmlStateVariable[0]->dataType;
        }
        return 
    $StateVariables;
    }

    function 
    FB_SoapAction($service,$action,$user false,$pass false)
    {
        
    $service['noroot'] = true;
        
    $service['trace'] = false;
        
    $service['exceptions'] = false;
        if (!(
    $user === false))
        {
            
    $service['login'] = $user;
            
    $service['password'] = $pass;
        }
        
    $client = new SoapClient(null,$service);
        
    $status $client->{$action}();
        if (
    is_soap_fault($status))
        {
           return 
    false;
        }
        return 
    $status;
    }

    function 
    UpdateIPSvar($parent,$ident,$value,$type)
    {
        
    $ident=str_replace(array("_","-"),array("",""),$ident);
        if (
    is_int($type))
        {
            
    $ips_type=$type;
        } else {
            switch (
    $type)
            {
                     case 
    "i1":
                     case 
    "i2":
                      case 
    "i4":
                case 
    "ui1":
                case 
    "ui2":
                case 
    "ui4":
                    
    $ips_type=1;
                    break;
                case 
    "boolean":
                    
    $ips_type=0;
                    break;
                case 
    "uuid":
                case 
    "dateTime":
                case 
    "string":
                    
    $ips_type=3;
                    break;
                default:
                    echo 
    "Unbekannter Datentyp:".$type.PHP_EOL;
                    return;
                    break;
            }
        }
        
    $var_id = @IPS_GetObjectIDByIdent($ident,$parent);
        if (
    $var_id === false)
        {
            
    $var_id IPS_CreateVariable($ips_type);
            
    IPS_SetName($var_id,$ident);
            
    IPS_SetIdent($var_id,$ident);
            
    IPS_SetParent($var_id,$parent);
        }
        switch (
    $ips_type)
        {
            case 
    0:
               if (
    GetValueBoolean($var_id) <> (bool)$value)
               {
                  
    SetValueBoolean($var_id,(bool)$value);
               }
                break;
            case 
    1:
                if (
    GetValueInteger($var_id) <> (int)$value)
                {
                   
    SetValueInteger($var_id,(int)$value);
                }
                break;
            case 
    2:
                if (
    GetValueFloat($var_id) <> round((float)$value,2))
                {
                   
    SetValueFloat($var_id,round((float)$value,2));
                }
                break;
            case 
    3:
                if (
    GetValueString($var_id) <> $value)
                {
                   
    SetValueString($var_id,$value);
                }
                break;
        }
    }
    ?>
    Das ganze gestrafft
    Wenn AVM dann mal in einer Firmware den Dienst umbenennt, läuft das ganze nicht mehr.
    PHP-Code:
    <?
    $service 
    = array(
      
    "uri"=>"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1",
      
    "location"=>"http://fritz.box:49000/igdupnp/control/WANCommonIFC1",
      
    "SCPDURL"=>"igdicfgSCPD.xml"
      
    );

    $action="GetAddonInfos";  //Diese Funktion soll ausgeführt werden

    $result =  FB_SoapAction($service,$action);

    UpdateIPSvar(IPS_GetParent($_IPS['SELF']),'KByteSendRate',$result['NewByteSendRate']/1024,2);
    UpdateIPSvar(IPS_GetParent($_IPS['SELF']),'KByteReceiveRate',$result['NewByteReceiveRate']/1024,2);

    function 
    FB_SoapAction($service,$action,$user false,$pass false)
    {
       
    // Siehe oben
    }

    function 
    UpdateIPSvar($parent,$ident,$value,$type)
    {
       
    // Siehe oben
    }
    ?>
    PS: Das letzte Script ist sogar etwas schneller in der Laufzeit als das von Paresy's Upload/ Download Auswertung. ca. 17ms zu ca. 30ms
    Geändert von Nall-chan (11.10.14 um 11:11 Uhr)
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  3. #3
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    8,280

    Standard Sammlung von Beispielen

    So hier mal ein Beispiel wie man Werte auch setzen kann.

    Gäste-WLAN Einschalten
    Hier wird das WLAN2 (also das Gäste-WLAN) eingeschaltet
    SCPDURL: wlanconfigSCPD.xml
    Location: http://fritz.box:49000/upnp/control/wlanconfig2
    URI: urn:dslforum-org:service:WLANConfiguration:2
    Action:SetEnable
    Parameter: bool
    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://fritz.box:49000/upnp/control/wlanconfig2",
            
    'uri'        => "urn:dslforum-org:service:WLANConfiguration:2",
            
    'noroot'     => True,
            
    'login'      => "asdf@asdf.asdf",
            
    'password'   => 'blabla'
        
    )
    );

    $client->SetEnable(new SoapParam(true,'NewEnable')); 
    Leider gibt es für die Spezielle Funktion des Gast-WLAN keinen Befehl um z.B. das Timeout zu setzen. Es wird also immer der 'alte' Wert übernommen.
    (Lesen dieser Werte geht aber mit $result = $client->{"X_AVM-DE_GetWLANExtInfo"}(); )
    Außerdem kann es sein dass euer Gäste WLAN nicht unter
    Location: http://fritz.box:49000/upnp/control/wlanconfig2
    URI: urn:dslforum-org:service:WLANConfiguration:2
    sonder unter
    Location: http://fritz.box:49000/upnp/control/wlanconfig3
    URI: urn:dslforum-org:service:WLANConfiguration:3
    zu finden ist.
    z.B. Wenn eure Box Dual-WLAN hat, also das 2,5Ghz & 5Ghz Band gleichzeitig unterstützt (Meine nicht ) wie hier bei Broving und seiner 7390.


    DSL Reconnect
    SCPDURL: igdconnSCPD.xml
    Location: http://fritz.box:49000/igdupnp/control/WANIPConn1
    URI: urn:schemas-upnp-org:service:WANIPConnection:1
    Action: ForceTermination
    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://fritz.box:49000/igdupnp/control/WANIPConn1",
            
    'uri'        => "urn:schemas-upnp-org:service:WANIPConnection:1",
            
    'noroot'     => True,
            
    'login'      => "asdf@asdf.asdf",
            
    'password'   => 'blabla'
        
    )
    );

    $client->ForceTermination(); 


    Bandbreite der WAN-Verbindung
    SCPDURL: igdicfgSCPD.xml
    Location: http://fritz.box:49000/igdupnp/control/WANCommonIFC1
    URI: urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1
    Action: GetCommonLinkProperties
    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://fritz.box:49000/igdupnp/control/WANCommonIFC1",
            
    'uri'        => "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1",
            
    'noroot'     => True
        
    )
    );
    $result $client->GetCommonLinkProperties();
    /*
    array(4) {
      ["NewWANAccessType"]=>
      string(3) "DSL"
      ["NewLayer1UpstreamMaxBitRate"]=>
      string(7) "6360000"
      ["NewLayer1DownstreamMaxBitRate"]=>
      string(9) "106000000"
      ["NewPhysicalLinkStatus"]=>
      string(2) "Up"
    }
    */ 


    WAN-Verbindungsstatus
    SCPDURL: wanipconnSCPD.xml
    Location: http://fritz.box:49000/upnp/control/wanipconnection1
    URI: urn:dslforum-org:service:WANIPConnection:1
    Action: GetStatusInfo (Kurzfassung)
    Action: GetInfo (Langfassung)
    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://fritz.box:49000/igdupnp/control/WANIPConn1",
            
    'uri'        => "urn:schemas-upnp-org:service:WANIPConnection:1",
            
    'noroot'     => True
        
    )
    );
    $status $client->GetStatusInfo();
    /*
    array(3) {
      ["NewConnectionStatus"]=>
      string(9) "Connected"
      ["NewLastConnectionError"]=>
      string(10) "ERROR_NONE"
      ["NewUptime"]=>
      string(4) "5533"
    }
    */ 


    Reboot / Factory Reset
    SCPDURL: deviceconfigSCPD.xml
    Location: http://fritz.box:49000/upnp/control/deviceconfig
    URI: urn:dslforum-org:serviceeviceConfig:1
    Action: FactoryReset
    Action: Reboot
    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://fritz.box:49000/upnp/control/deviceconfig",
            
    'uri'        => "urn:dslforum-org:service:DeviceConfig:1",
            
    'noroot'     => True,
            
    'login'      => "asdf@asdf.asdf",
            
    'password'   => 'blabla'
        
    )
    );
    $client->Reboot(); 


    Anrufliste als XML-File
    Besonders schön, da die Anmeldung über SOAP erfolgt, wird gleich eine SID mit zurückgegeben
    SCPDURL: x_contactSCPD.xml
    Location: http://fritz.box:49000/upnp/control/x_contact
    URI: urn:dslforum-org:service:X_AVM-DE_OnTel:1
    Action: GetCallList
    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://fritz.box:49000/upnp/control/x_contact",
            
    'uri'        => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
            
    'noroot'     => True,
            
    'login'      => "asdf@asdf.as",
            
    'password'   => 'blabla'
        
    )
    );
    $result $client->GetCallList();
    /*
    String()
    http://<Fritz-IP>:49000/calllist.lua?sid=fbb2d4418ad49efd
    */
    $xml = @simplexml_load_file($result);
    /*
    Auschnitt:
     ["Call"]=>
      array(400) {
        [0]=>
        object(SimpleXMLElement)#8 (12) {
          ["Id"]=>
          string(4) "5808"
          ["Type"]=>
          string(1) "1"
          ["Caller"]=>
          string(11) "04545454545"
          ["Called"]=>
          string(16) "SIP: 04545454591"
          ["Name"]=>
          string(5) "Jonas"
          ["Numbertype"]=>
          string(3) "sip"
          ["Device"]=>
          string(5) "Micha"
          ["Port"]=>
          string(2) "13"
          ["Date"]=>
          string(14) "07.10.14 16:47"
          ["Duration"]=>
          string(4) "0:03"
    */ 


    Telefonbücher als XML-File
    Besonders schön, da die Anmeldung über SOAP erfolgt, wird gleich eine SID mit zurückgegeben
    SCPDURL: x_contactSCPD.xml
    Location: http://fritz.box:49000/upnp/control/x_contact
    URI: urn:dslforum-org:service:X_AVM-DE_OnTel:1
    Action: GetPhonebook
    Parameter: NewPhonebookID => Nummer des Telefonbuches
    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://fritz.box:49000/upnp/control/x_contact",
            
    'uri'        => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
            
    'noroot'     => True,
            
    'login'      => "213",
            
    'password'   => "123"
        
    )
    );
    $result $client->GetPhonebook(new SoapParam(0,"NewPhonebookID"));
    $xml = @simplexml_load_file($result['NewPhonebookURL']);
    var_dump($xml);
    /*
     ["phonebook"]=>
      object(SimpleXMLElement)#4 (4) {
        ["@attributes"]=>
        array(2) {
          ["owner"]=>
          string(1) "0"
          ["name"]=>
          string(11) "Telefonbuch"
        }
        ["timestamp"]=>
        string(2) "68"
        ["comment"]=>
        object(SimpleXMLElement)#5 (0) {
        }
        ["contact"]=>
        array(97) {
          [0]=>
          object(SimpleXMLElement)#6 (4) {
            ["category"]=>
            string(1) "0"
            ["person"]=>
            object(SimpleXMLElement)#103 (1) {
              ["realName"]=>
              string(8) "AB Fenja"
            }
            ["uniqueid"]=>
            string(2) "68"
            ["telephony"]=>
            object(SimpleXMLElement)#104 (3) {
              ["services"]=>
              object(SimpleXMLElement)#105 (0) {
              }
              ["comment"]=>
              array(3) {
                [0]=>
                object(SimpleXMLElement)#106 (0) {
                }
                [1]=>
                object(SimpleXMLElement)#107 (0) {
                }
                [2]=>
                object(SimpleXMLElement)#108 (0) {
                }
              }
              ["number"]=>
              array(2) {
                [0]=>
                string(5) "**601"
                [1]=>
                string(5) "**606"
              }
            }
          }
    .......
    */ 


    Anrufbeantworter ein/aus

    SCPDURL: x_tamSCPD.xml
    Location: http://fritz.box:49000/upnp/control/x_tam
    URI: urn:dslforum-org:service:X_AVM-DE_TAM:1
    Action: SetEnable
    Parameter 1: NewIndex => Nummer des Anrufbeantworters (0 - 9)
    Parameter 2: NewEnable => "0" oder "false" für AUS, "1" für EIN (true funktioniert nicht)


    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
              
    'location'         => "http://fritz.box:49000/upnp/control/x_tam",
              
    'uri'                 => "urn:dslforum-org:service:X_AVM-DE_TAM:1",
              
    'noroot'           => True,
              
    'login'              => "user",
              
    'password'      => "pass"
        
    )
    );

    //AB aus
    $client->SetEnable(new SoapParam(0'NewIndex'),
                           new 
    SoapParam(0'NewEnable')
                           );

    //AB ein
    $client->SetEnable(new SoapParam(0'NewIndex'),
                           new 
    SoapParam(1'NewEnable')
                           ); 



    Liste vom Anrufbeantworter

    SCPDURL: x_tamSCPD.xml
    Location: http://fritz.box:49000/upnp/control/x_tam
    URI: urn:dslforum-org:service:X_AVM-DE_TAM:1
    Action: GetMessageList
    Parameter: NewIndex => Nummer des Anrufbeantworters (0 - 9)


    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://fritz.box:49000/upnp/control/x_tam",
            
    'uri'        => "urn:dslforum-org:service:X_AVM-DE_TAM:1",
         
    'noroot'     => True,
           
    'login'      => "user",
            
    'password'   => "pass"
        
    )
    );

    // Gibt die Url mit SID aus
    $result $client->GetMessageList(new SoapParam(0'NewIndex'));
    print_r($result);

    /*
    http://192.168.178.1:49000/tamcalllist.lua?sid=71120ab0f78ba64d&tamindex=0
    */

    $xml = @simplexml_load_file($result);
    print_r($xml);

    /*
    [Message] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [Index] => 1
                        [Tam] => 0
                        [Called] => meine Nummer
                        [Date] => 09.10.14 19:43
                        [Duration] => 0:01
                        [Inbook] => 1
                        [Name] => Manfred 
                        [New] => 1
                        [Number] => meine NUmmer
                        [Path] => /download.lua?path=/var/media/ftp/ST-4GB-01/FRITZ/voicebox/rec/rec.0.001
                    )
    */

    $data = @file_get_contents($result);
    print_r($data);

    /*
    <Root>
    <!-- index:0 -->
    <!-- max:999 -->
    <!-- tam calls:2 -->
    <Message>
    <Index>1</Index>
    <Tam>0</Tam>
    <Called>meine Nummer</Called>
    <Date>09.10.14 19:43</Date>
    <Duration>0:01</Duration>
    <Inbook>1</Inbook>
    <Name>Manfred </Name>
    <New>1</New>
    <Number>meine Nummer</Number>
    <Path>/download.lua?path=/var/media/ftp/ST-4GB-01/FRITZ/voicebox/rec/rec.0.001</Path>
    </Message>
    */ 



    SID auslesen

    SCPDURL: deviceconfigSCPD.xml
    Location: http://"fritz.bix:49000"/upnp/control/deviceconfig
    URI: urn:dslforum-org:serviceeviceConfig:1
    Action: {"X_AVM-DE_CreateUrlSID"}
    Parameter: keine


    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://"fritz.bix:49000"/upnp/control/deviceconfig",
            
    'uri'           => "urn:dslforum-org:service:DeviceConfig:1",
            
    'login'       => "user",
          
    'password'  => "pass"
        
    )
    );

    $result $client->{"X_AVM-DE_CreateUrlSID"}();

    print_r($result);

    /*
    sid=71120ab0f78ba64d
    */ 



    Zeiten

    Gibt die aktuelle Zeit der Friztbox aus, sowie ob Sommerzeit oder Winterzeit und Start/Ende der Winterzeit
    SCPDURL: timeSCPD.xml
    Location: http://"fritz.box:49000"/upnp/control/time
    URI: urn:dslforum-org:service:Time:1
    Action: GetInfo
    Parameter: keine


    PHP-Code:
    $client = new SoapClient(
        
    null,
        array(
              
    'location'            => "http://"fritz.box:49000"/upnp/control/time",
             
    'uri'        => "urn:dslforum-org:service:Time:1",
          
    'noroot'          => True,
            
    'login'                 => "user",
            
    'password'      => "pass"
        
    )
    );

    $result $client->GetInfo();

    print_r($result);

    /*
    Array
    (
        [NewNTPServer1] => 0.at.pool.ntp.org
        [NewNTPServer2] =>
        [NewCurrentLocalTime] => 2014-10-10T04:04:01+02:00
        [NewLocalTimeZone] =>
        [NewLocalTimeZoneName] => CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00
        [NewDaylightSavingsUsed] => 0
        [NewDaylightSavingsStart] => 0001-01-01T00:00:00
        [NewDaylightSavingsEnd] => 0001-01-01T00:00:00
    )
    */ 


    Verbindungsgeschwindigkeit und Zwangstrennungszeit:
    PHP-Code:
    // Reconnect-Zeit ermitteln
    $client = new SoapClient(
        
    null,
        array(
                
    'location'            => "http://".$fritzbox_ip.":49000/upnp/control/time",
             
    'uri'        => "urn:dslforum-org:service:Time:1",
                
    'noroot'          => True,
                
    'login'      => $fritzbox_Username,
                
    'password'   => $fritzbox_Password
        
    )
    );

    $result $client->GetInfo();

    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://".$fritzbox_ip.":49000/igdupnp/control/WANIPConn1",
            
    'uri'        => "urn:schemas-upnp-org:service:WANIPConnection:1",
            
    'noroot'     => True
        
    )
    );
    $status $client->GetStatusInfo();

    $tag date('d.m.Y, H:i'strtotime($result['NewCurrentLocalTime']) - $status['NewUptime'])." Uhr";
    SetValue(20163 /*[Fritzbox/Zwangstrennung]*/"Verbunden seit " $tag);

    // Up-/Down-Loadrate ermitteln
    $client = new SoapClient(
        
    null,
        array(
            
    'location'   => "http://".$fritzbox_ip.":49000/igdupnp/control/WANCommonIFC1",
            
    'uri'        => "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1",
            
    'noroot'     => True
        
    )
    );
    $result $client->GetCommonLinkProperties();

    $tag round($result['NewLayer1DownstreamMaxBitRate']/10000001)." Mbit/s Down, ".round($result['NewLayer1UpstreamMaxBitRate']/10000001)." Mbit/s Up";
    SetValue(31787 /*[Fritzbox/Verbindungsgeschwindigkeit]*/  $tag); 
    Geändert von Nall-chan (11.10.14 um 11:20 Uhr)
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  4. #4
    Registriert seit
    Apr 2008
    Ort
    Swiss/Czech
    Beiträge
    1,154

    Man, man ist ja ne super Sache und was das an Arbeit gibt. Hab zwar keine Fritzbox aber die Soap-Abfrage kann man sich auch für andere Geraete abgucken. Einfach super und Klasse! Merci
    IPS Ninja - Windows 10, 64 Bit Server - IR Trans - Eaton GW - Homematic CCU2 - FHZ - HMS - AKM, JKM + EKM 868 - Div. Sonos - Allnet 3690+91 -IOS/Win10 auf Clientseite - SILEX - SEH - QNAP - APC - Siemens OZW 672 - Homematic - Aviosys - BlueIris - Mobotix T25M, S15 und M12

  5. #5
    Registriert seit
    Sep 2013
    Ort
    Niederösterreich
    Beiträge
    362

    Da kann ich mich nur anschließen.
    Funktioniert einwandfrei. Endlich eine Ende mit ständiger Skriptanpassung in Sicht :-)
    Vielen Dank dafür.
    Gruß
    Manfred
    Gruß Manfred
    IPS 4.2 | Win u. Symbox | IPSView | Wago | Homematic | IPS-868 | Philips HUE | Modbus | PV FroniusHybrid | USV (AEG/APC) | Qnap | Synology | IP Kameras | Hombot Gardena R70Li | Sony TV / AV | Sat Duo2 | Philips/Samsung TV | Sonos | Buderus | RPi | Arduino || Visu: 24", 10", 7" Tablets ....

  6. #6
    Registriert seit
    Jun 2010
    Beiträge
    41

    Standard Telefonbuch herunterladen?

    Das sieht in der Tat super aus. Ich frage mich, wie ich wohl das Telefonbuch herunterladen kann. Ein einfaches Einfügen von "GetPhonebook" führt leider nicht zum Erfolg.

    Ich bin leider nicht fit mit Soap. Wäre toll, wenn einer helfen könnte

    Viele Grüße
    Florian
    IPS 3.0 auf Shuttle X50V2 - Homematic LAN-Adapter - EM24DIN - Plugwise

  7. #7
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    8,280

    Noch unterwegs. Aber du musst die ID ( 0 für das interne Telefonbuch) als Parameter übergeben.
    Dann gibt es einen Link zurück mit SID, welche auf ein XML mit allen Kontaktdaten zeigt.
    Michael
    PS: Habe das ja extra ausführlich dokumentiert, damit ihr euch selbst helfen könnt. SOAP ist auch für mich Neuland, aber mit PHP wirklich sehr simpel.
    Geändert von Nall-chan (08.10.14 um 15:14 Uhr)
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  8. #8
    Registriert seit
    Sep 2009
    Beiträge
    960

    Standard fehler bei ident aufruf

    Ich schlage vor die folgende Prüfung

    PHP-Code:

    if(ctype_alnum $ident )) 

    in die Funktion UpdateIPSvar einzubauen um Fehler bei nicht alphanumerischen Zeichen auszuschließen :
    2 Standorte, 1 Win10 Symcon, 2 Raspi Stretch Symcon, 6 PIVCCU Stretch, IPSVIEW, 6 LAN Adapter, ALL4000, T 868, 4 EKM 868, ENOCEAN, EBUS , Chrome, AVM, PIXEL 2, 3 IPAD, 4 X Alexa

  9. #9
    Registriert seit
    Jun 2010
    Beiträge
    41

    Standard Telefonbuch herunterladen

    Hallo,

    bei mir klappt das mit dem Telefonbuch herunterladen leider noch nicht. Ich habe zunächst folgendes versucht:

    Code:
    $client = new SoapClient(
        null,
        array(
            'location'   => "http://fritz.box:49000/upnp/control/x_contact",
            'uri'        => "urn:dslforum-org:service:X_AVM-DE_OnTel:1",
            'noroot'     => True,
            'login'      => "",
            'password'   => 'xxx'
        )
    );
    $result = $client->GetPhonebook();
    echo $result;
    Ich bin nicht sicher, wie man die ID des Telefonbuchs übergeben muss. Mit

    Code:
    $result = $client->GetPhonebook(0);
    funktioniert es leider nicht.

    Was mache ich falsch?

    Viele Grüße
    Florian
    IPS 3.0 auf Shuttle X50V2 - Homematic LAN-Adapter - EM24DIN - Plugwise

  10. #10
    Registriert seit
    Sep 2013
    Ort
    Niederösterreich
    Beiträge
    362

    Out off Topic ...
    Geändert von manni (09.10.14 um 14:48 Uhr)
    Gruß Manfred
    IPS 4.2 | Win u. Symbox | IPSView | Wago | Homematic | IPS-868 | Philips HUE | Modbus | PV FroniusHybrid | USV (AEG/APC) | Qnap | Synology | IP Kameras | Hombot Gardena R70Li | Sony TV / AV | Sat Duo2 | Philips/Samsung TV | Sonos | Buderus | RPi | Arduino || Visu: 24", 10", 7" Tablets ....

Ähnliche Themen

  1. itunes Mac per script steuern und auslesen, wer kann helfen ?
    Von drapple im Forum Skripte, PHP, SQL
    Antworten: 4
    Letzter Beitrag: 17.12.12, 16:32
  2. S7-300 soll die CCU1 auslesen und steuern, ist das möglich?
    Von poppycock im Forum SPS Automatisierungstechnik
    Antworten: 4
    Letzter Beitrag: 31.12.10, 10:55
  3. Wago Variablen auslesen und steuern mit IP-Designer
    Von Ossi im Forum SPS Automatisierungstechnik
    Antworten: 13
    Letzter Beitrag: 30.12.08, 19:54
  4. Fritzbox auslesen und auswerten
    Von RWN im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 9
    Letzter Beitrag: 24.07.08, 19:23
  5. [neuling] wie elv fht auslesen und steuern
    Von pleibling im Forum Allgemeine Diskussion
    Antworten: 7
    Letzter Beitrag: 21.12.05, 11:31

Stichworte