Laden...

UPNP Soap Zugriff auf Fritz.Box Online-Monitor

Erstellt von inflames2k vor 6 Jahren Letzter Beitrag vor 6 Jahren 4.893 Views
inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 6 Jahren
UPNP Soap Zugriff auf Fritz.Box Online-Monitor

Hallo,

derzeit versuche ich auf den Online-Monitor der Fritz.Box mit Hilfe der TR64 API zuzugreifen. Andere Soap-Anfragen an die Fritz.Box funktionieren tatellos.

Für den Zugriff habe ich händisch einen Soap-Client-Proxy generiert:


[WebServiceBinding("urn:dslforum-org:service:WANCommonInterfaceConfig:1", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
internal class WANCommonInterfaceService : SoapHttpClientProtocol
{
        [SoapDocumentMethod("urn:dslforum-org:service:WANCommonInterfaceConfig:1#X_AVM-DE_GetOnlineMonitor", RequestNamespace = "urn:dslforum-org:service:WANCommonInterfaceConfig:1", ResponseNamespace = "urn:dslforum-org:service:WANCommonInterfaceConfig:1")]
        public void GetOnlineMonitor([XmlElement("NewSyncGroupIndex", Namespace = "")]UInt32 syncGroupIndex,
                            [XmlElement("NewSyncGroupMode", Namespace = "")]out string syncGroupMode,
                            [XmlElement("NewSyncGroupName", Namespace = "")]out string syncGroupName,
                            [XmlElement("NewTotalNumberSyncGroups", Namespace = "")]out UInt32 totalNumberSyncGroups,
                            [XmlElement("Newds_current_bps", Namespace = "")]out string ds_current_bps,
                            [XmlElement("Newmax_ds", Namespace = "")]out UInt32 max_ds,
                            [XmlElement("Newmax_us", Namespace = "")]out UInt32 max_us,
                            [XmlElement("Newmc_current_bps", Namespace = "")]out string mc_current_bps,
                            [XmlElement("Newprio_default_bps", Namespace = "")]out string prio_default_bps,
                            [XmlElement("Newprio_high_bps", Namespace = "")]out string prio_high_bps,
                            [XmlElement("Newprio_low_bps", Namespace = "")]out string prio_low_bps,
                            [XmlElement("Newprio_realtime_bps", Namespace = "")]out string prio_realtime_bps,
                            [XmlElement("Newus_current_bps", Namespace = "")]out string us_current_bps
                            )

        {

            // NewTotalNumberSyncGroups
            object[] results = this.Invoke("X_AVM-GetOnlineMonitor", new object[] { syncGroupIndex });
            syncGroupMode = (string)results[0];
            syncGroupName = (string)results[1];
            totalNumberSyncGroups = (UInt32)results[2];
            ds_current_bps = (string)results[3];
            max_ds = (UInt32)results[4];
            max_us = (UInt32)results[5];
            mc_current_bps = (string)results[6];
            prio_default_bps = (string)results[7];
            prio_high_bps = (string)results[8];
            prio_low_bps = (string)results[9];
            prio_realtime_bps = (string)results[10];
            us_current_bps = (string)results[11];
        }
}

Die Abfrage läuft jedoch in folgende Exception:> Fehlermeldung:

System.ArgumentException: 'X_AVM-GetOnlineMonitor' ist kein gültiger Webdienst-Methodenname.

Ich vermute, dass es am Bindestrich liegt, gibt es hier eine Möglichkeit den Aufruf dennoch durch zu bringen ohne manuell den Request abzusetzen?

EDIT:
Als Anmerkung dazu noch, die anderen Schnittstellen habe ich genau so umgesetzt. Da die Methodennamen dort aber sauber sind gibt es da keine Probleme.

Frage für mich ist vorallem, kann man die Validierung des Soap-Methodennamens unterbinden?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 6 Jahren

Hallo,

ich glaube ich habe die Lösung gefunden (nachdem ich einen Service mit ähnlichem Aufbau erstellt habe). Das werde ich heute Abend direkt mal testen.

Meine Vermutung ist, dass eine Anpassung des Invoke und des SoapDocumentMethod-Attributes ausreichend sein sollten.

Folgende Anpassung denke ich wird am SoapDocumentMethod-Attribut notwendig sein:


[SoapDocumentMethod("urn:dslforum-org:service:WANCommonInterfaceConfig:1#X_AVM-DE_GetOnlineMonitor", RequestNamespace = "urn:dslforum-org:service:WANCommonInterfaceConfig:1", RequestElementName = "X_AVM-DE_GetOnlineMonitor", ResponseNamespace = "urn:dslforum-org:service:WANCommonInterfaceConfig:1",  ResponseElementName = "X_AVM-DE_GetOnlineMonitorResponse")]

Der Aufruf der Methode erfolgt anschließend via:


object[] results = this.Invoke("DE_GetOnlineMonitor", new object[] { syncGroupIndex ]);

Ich werde euch heute Abend oder morgen dann über das Ergebnis informieren.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

16.834 Beiträge seit 2008
vor 6 Jahren

Darf man einfach mal fragen, was das wird; interessehalber?
Ich hab vor Ewigkeiten mal versucht via Json API an die ganzen FB Elemente zu kommen, die aber leider aktuell noch rudimentär implementiert sind.

Für diese TR064 war mir dann der Nutzen nicht hoch genug (und mein Leben zu kurz).

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 6 Jahren

Im Grunde bin ich aktuell dabei, ein Tool zu bauen, das Grundlegende Informationen der Fritze visualisiert und auch einen Reconnect und Reboot erlaubt (also keine vollständigen Konfigurationsänderungen).

Dafür bin ich erst einmal dabei die entsprechenden benötigten Schnittstellen zu implementieren. Wie in dem Beispiel eben die Soap-Schnittstelle zum WANCommonInterfaceConfig-Service.

Im ersten Schritt wird das damit also Grundsätzlich erst einmal nur eine Bibliothek, die den Zugriff auf die von der Fritze bereitgestellten Methoden kapselt.

Parallel habe ich auch ein Tool begonnen, das mir auf Basis der Informationen die UPnP-Geräte bereitstellen direkt Klassen zu generieren. Das fängt leider derartige Fälle, wie den hier beschriebenen noch nicht ab. - Aber, das kann ich ja nachbessern.

Bezüglich der Variante dies als von SoapHttpClientProtocol abgeleitete Klasse zu implementieren werde ich mich aber in naher Zukunft wieder verabschieden denke ich. Denn die Anwendung die oben beschrieben ist, möchte ich zusätzlich via Xamarin als Android-App erstellen. - Ist einfach handlicher, als den Rechner einzuschalten. Das erfordert aber eine .NET Standard-Implementierung. Soweit ich gesehen habe, ist der Namespace System.Web.Services davon kein Bestandteil.

Die Bibliothek kann ich gerne nach Fertigstellung hier im Forum bereitstellen. Und zu TR064 kann ich nur sagen, dass es ja quasi einfach nur eine Erweiterung des UPnP Standard ist. Leider sind aber auch nicht alle verfügbaren SOAP-Actions dokumentiert.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

16.834 Beiträge seit 2008
vor 6 Jahren

Meine Idee war damals eine .NET Standard Komponente zu bauen, die ich dann in verschiedenen Anwendungen nutzen kann; quasi ein API-SDK für die FritzBox.
Hab da ein paar Ideen mit Smart Home zusammen; aber das TR064 macht das alles andere als komortabel und zukunftsorientiert.

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 6 Jahren

Hallo,

das die Zugriffe mit TR064 nicht komfortabel sind da stimme ich voll und ganz zu. Leider ist das aber auch die einzige offizielle Schnittstelle um an die Daten der Fritz.Box zu kommen.

Ich bin ja grundsätzlich schon froh, dass es auf UPnP aufbaut und somit den Nachrichtenaustausch per SOAP erlaubt. Das ist mir immernoch lieber, als irgend eine TCP Schnittstelle, mit einem Protokoll für das man erst einmal Studieren muss, zu verwenden.

Was auch weniger schön ist, ist die Tatsache das nicht jede Fritze auch jeden Service besitzt.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 6 Jahren

So ich habe nun die oben besprochene Änderung am Methodenaufruf ergänzt. Einziges was noch nicht ganz stimmte war der Invoke-Aufruf.

Dieser muss wie folgt lauten:


this.Invoke("GetOnlineMonitor", new object[] { syncGroupIndex });

Dann funktioniert auch der Zugriff auf die Methode.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 6 Jahren

Ich würde da jetzt gerne eine .NET Standard-Bibliothek bauen für den Zugriff. - Gibt es vernünftige SOAP-Implementierungen für .NET STandard, oder fahre ich besser, wenn ich die Requests per HttpClient / WebClient abfeuere?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

16.834 Beiträge seit 2008
vor 6 Jahren

Gibt nichts in der Richtung (auch nicht geplant), aber es gibt SoapCore auf GitHub und NuGet, das man hier als Basis nutzen könnte.

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 6 Jahren

Das schaue ich mir mal an. - Danke dafür.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |