FritzBox Wahlhilfe

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: FritzBox Wahlhilfe

Beitrag von Imhotheb »

Aus der AVM Hilfe:
The client may either use the HTTP authentication mechanisms or use the content level authentication for SOAP actions that require authorization. To access URLs with HTTP GET or HTTP POST a TR-064 URL session ID has to be retrieved first.

Vielleicht hilft das ja weiter. Ich glaube mich zu erinnern das es irgendwann schonmal einen Beitrag dazu gab und zuerst die sessionid ermittelt werden muss. Und irgendetwas von AVM in neuerer Firmware nicht mehr zur Verfügung steht.

Habe mich damit allerdings nicht wirklich beschäftigt.
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
TroaX
Beiträge: 660
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: FritzBox Wahlhilfe

Beitrag von TroaX »

ts-soft hat geschrieben:So wie ich gelesen habe, funktioniert die Wahlhilfe nicht bei IP-Telefonie (VOIP). Da inzwischen wohl fast jeder IP-Telefonie
nutzt (zwangsweise), ist der Code wohl meist nutzlos, bzw. wird es über kurz oder lang sein :cry:
Sie funktioniert nicht bei IP-Telefonen. Mit VoIP funktioniert das ganze tadellos. Der Unterschied liegt in der Adressierbarkeit der Nebenstellen/Telefone selbst. Denn ein IP-Telefon ist ein Netzwerk-Client, wohingegen DECT, ISDN oder Analog-Telefone eine feste Nebenstellen-Adressierung an der Box haben.

Meine Support-Zeiten sind da zwar etwas her und habe auch nie dafür entwickelt. Aber zumindest das weiß ich noch ;)

Ich denke für deinen speziellen Fall bleib beim PHP-Skript. Sich jetzt in die API einzuarbeiten, ist da schon etwas heavy. Falls doch Interesse und Englischkenntnisse vorhanden sind: https://avm.de/fileadmin/user_upload/Gl ... _steps.pdf

Vom TR-064 habe ich aber bisher noch nie gehört. Muss aufpassen, mich nicht davon anfixen zu lassen xD
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
gpphjs
Beiträge: 11
Registriert: 07.07.2006 13:35
Wohnort: 18374 Seeheilbad Zingst

Re: FritzBox Wahlhilfe

Beitrag von gpphjs »

Ich denke ReceiveHTTPMemory( ) bringt nichts, wie soll es weiter gehen?
Meine Box habe ich erst mal nicht mit Passwort geschützt.
Hier der Code, aber was soll man damit anfangen?

Code: Alles auswählen

; 4. Schubs - nur ein ergebnisoffener Test-Versuch nur mit FritzBox 7490 ohne Password, mit Password schaffe ich es nicht!
InitNetwork()
URL$="fritz.box"
Debug URL$
*Buffer = ReceiveHTTPMemory(URL$)
If *Buffer<>0 :ShowMemoryViewer(*Buffer,MemorySize(*Buffer)) :EndIf 
 Filename$ = "C:\.............\test1.html"
  If ReceiveHTTPFile(URL$, Filename$)
    Debug "Success"
  Else
    Debug "Failed"
  EndIf
Ich versuche es mit :

Code: Alles auswählen

ConnectionID=OpenNetworkConnection("fritz.box",Port)
SendNetworkString(ConnectionID,".......“+Chr(13)+Chr(10))
und arbeite so die Beispiele in https://avm.de/fileadmin/user_upload/Gl ... _steps.pdf
ab, aber leider ohne Erfolg. Bisher nur durch Wikipedia erfahren, dass im HTTP Protokoll jede Zeile im Header durch den Zeilenumbruch „CR+LF“ abgeschlossen werden muß. Die Leerzeile nach dem Header darf nur aus <CR><LF>, ohne eingeschlossenes Leerzeichen ,bestehen. Alles Andere ist mir kryptisch.
gpphjs
Beiträge: 11
Registriert: 07.07.2006 13:35
Wohnort: 18374 Seeheilbad Zingst

Re: FritzBox Wahlhilfe

Beitrag von gpphjs »

5. Schubs
Jetzt klappt das Beispiel „10.3 Service description request from application“ aus
https://avm.de/fileadmin/user_upload/Gl ... _steps.pdf
Ich hatte immer mit Port 80 versucht, steht ja auch so in Wikipedia bei der HTTP Beschreibung, es muss aber Port 49000 sein! Das Beispiel lädt mit „GET“ eine xml-Datei von der Fritzbox. Diese kann man auch mit dem Browser runter laden unter http://192.168.179.1:49000/tr64desc.xml aber auch unter http://192.168.178.1:49000/tr64desc.xml (meine IP der Fritzbox ist 192.168.178.1, warum das auch mit 192.168.179.1 geht ist mir rätselhaft). Die Fritzbox liefert aber auch noch andere, z.B. http://192.168.178.1:49000/deviceinfoSCPD.xml .
Ich will eigentlich nach meiner Anwendung das WLAN ausstellen, bevor der Rechner runter fährt, aber so weit bin ich noch nicht. Hier der Beispiel-Code, geht auch so mit einer Password geschützten Frizbox.

Code: Alles auswählen

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
Else
  Debug "Netzwerk wurde initialisiert"
EndIf
    CreateFile(0,"C:\.....\test.html")
buffer=AllocateMemory(50000)
Port = 49000 
ConnectionID=OpenNetworkConnection("192.168.178.1",Port)

If ConnectionID
  Debug "verbunden"
  
  SendNetworkString(ConnectionID,"GET /tr64desc.xml HTTP/1.1"+Chr(13)+Chr(10)) ;path of control URL
  SendNetworkString(ConnectionID,"HOST: 192.168.178.1:49000"+Chr(13)+Chr(10))  ;host of control URL:port of control URL
  SendNetworkString(ConnectionID,"CONNECTION: Close"+Chr(13)+Chr(10))
  SendNetworkString(ConnectionID,"USER-AGENT: AVM UPnP/1.0 Client 1.0"+Chr(13)+Chr(10))
  SendNetworkString(ConnectionID,Chr(13)+Chr(10)) ;Headerabschluß
   Repeat
   
           result = NetworkClientEvent(ConnectionID)
           Debug result
    Select result
      Case 2
       Debug "Roh-Daten wurden empfangen" 
          RequestLength.l = ReceiveNetworkData(ConnectionID, buffer, 50000)
         Debug RequestLength.l 
        
       ShowMemoryViewer(buffer,RequestLength)
       WriteString(0,PeekS(buffer, RequestLength, #PB_UTF8))
        
     Case 4
       CloseFile(0)  
       End
     EndSelect
        Delay (1000) 
   ForEver
  EndIf     
End
@gnaps das Problem mit der Wahlhilfe von der FritzBox verstehe ich nicht, sonst könnte ich ja mal probieren.
gpphjs
Beiträge: 11
Registriert: 07.07.2006 13:35
Wohnort: 18374 Seeheilbad Zingst

Re: FritzBox Wahlhilfe

Beitrag von gpphjs »

Hallo, wenn das mit Wahlhilfe gemeint ist, dann hab ich es. Der Grundstock ist von @Bender auf Seite http://www.purebasic.fr/german/viewtopi ... ox&start=0. Ich bin mit SendNetworkString und auch nicht mit HTTP weiter gekommen. Ich habe im Internet sehr viel über die sessionid gelesen, hauptsächlich in C++ (verstehe ich kaum), aber jetzt habe ich @Bender verstanden. lua ist eine Programmiersprache! Lua wurde 1993 von der Computer Graphics Technology Group der Päpstlichen Katholischen Universität von Rio de Janeiro in Brasilien entwickelt??? Jetzt arbeitet unsere Fritzbox damit! Ein Artikel von AVM https://avm.de/fileadmin/user_upload/Gl ... ion_ID.pdf brachte Licht in das Dunkel der SessionID. Sehr hilfreich war auch https://avm.de/fileadmin/user_upload/Gl ... erface.pdf
Da geht es um Home Automation der Fritzbox (Steckdose schalten, Heizkörperregler usw. ). Ich habe mir gestern so ein Ding besorgt und heute geproggt. Wie ich dann auf die Wahlhilfe gekommen bin kann ich hier nicht alles schreiben, nur soweit, wenn man sich die HTML Seiten von der Fritzbox ansieht, findet man immer wieder Pfade mit .“lua“. Die Syntax ist dann nicht einfach, aber wie man sieht ist das Programm recht kurz. Ich habe mich von der Box nicht abgemeldet, irgendwann macht die Box das von alleine. Wenn jemand das herausbekommt, kann er es ja rein stellen. Die Tel. Nummer kann man ja abfragen oder einlesen, die Nummer des Telefoniegerätes muss angepasst werden, aber komischerweise geht es auch mit einer falschen Nummer, wenn nur ein Gerät angemeldet ist.

Code: Alles auswählen

InitNetwork()
Global FBIP.s, uiPass.s, gSeite.s, SessionID.s, user.s, telnr.s, Apparat.s
Global Zeilenumbuch.s = Chr(13)+Chr(10)

;die 3Zeilen entsprechend anpassen
FBIP = "fritz.box"
uiPass = "XXXXXXXXX" ;Password, anpassen
user = "admin"       ;user, anpassen
telnr = "YYYYYYYYYY" ; Tel. Nummer; anpassen
Apparat ="**611"     ; anpassen

Procedure SeiteLaden(Seite.s)
  gSeite = ""
  If ReceiveHTTPFile("http://" + FBIP + Seite,"C:\Users\hans_2\Downloads\test.html")
    Debug FBIP+Seite
    If ReadFile(0, "C:\Users\*****\Downloads\test.html")   ;-------------------------anpassen, hier kann mann nachverfolgen,
      While Eof(0) = 0                                     ;-------------------------was passiert, wenn man das Programm Schritt
        gSeite = gSeite + ReadString(0)                    ;-------------------------laufen laesst
      Wend
      CloseFile(0)
    Else
      MessageRequester("Fehler", "Fehler beim Lesen der Daten!")
    EndIf
  Else
    MessageRequester("Fehler", "Fehler beim Laden der Seite" + Zeilenumbuch + Seite)
  EndIf
EndProcedure

Procedure.s FindeDaten(Suche.s, Stelle = 1, eSuche.s = "")
  aSuche.s = "<" + Suche + ">"
  If eSuche = "" : eSuche.s = "</" + Suche + ">" : EndIf
  PzWertA.s = StringField(gSeite, Stelle + 1, aSuche)
  Debug StringField(PzWertA, 1, eSuche)
  ProcedureReturn StringField(PzWertA, 1, eSuche)
EndProcedure

Procedure.s fbSID()
  UseMD5Fingerprint()

  SeiteLaden("/login_sid.lua")
  *Buffer = AllocateMemory(200)
  PzWertC.s = FindeDaten("Challenge")
  PzWertA.s = PzWertC + "-" + uiPass
  For a = 1 To Len(PzWertA)
    PokeC(*Buffer + a + a - 2, Asc(Mid(PzWertA,a,1)))
    PokeC(*Buffer + a + a - 1, 0)
  Next
  Debug PzWertA
  PzWertB.s = Fingerprint(*Buffer, Len(PzWertA) + Len(PzWertA),#PB_Cipher_MD5)
  FreeMemory(*Buffer)
  SeiteLaden("/login_sid.lua?response=" + PzWertC + "-" + PzWertB + "&username=" + user)
  ProcedureReturn FindeDaten("SID")
EndProcedure

SessionID = fbSID()
Debug SessionID

SeiteLaden("/fon_num/dial_foncalls.lua?dial="+telnr+"&orig_port="+Apparat+"&sid="+SessionID) ;das geht
gnaps
Beiträge: 151
Registriert: 02.09.2008 13:02

Re: FritzBox Wahlhilfe

Beitrag von gnaps »

Hallo gpphjs,

suuuuuuuuper,

hat bei mir funktioniert, steige aber bei deinem Code nicht durch, dennoch danke für Deine Mühe.
Jetzt habe ich noch eine Frage.

Was muss ich der FritzBox senden, damit die Anwahl gestoppt werden kann.

Ich habe es ohne Nummer und ohne "**611" aber da legt die Box nicht auf.
PureBasic Vollversion V 5.71 für Windows - Windows 10 (64)
gnaps
Beiträge: 151
Registriert: 02.09.2008 13:02

Re: FritzBox Wahlhilfe

Beitrag von gnaps »

Hi,

habs raus, wenn ich für die Nummer "--" und für den Apperat "--" sende, dann legt die FirtzBox auf.

Jetzt habe ich aber noch ein Problem, ich habe 3x DECT TElefon **610,**611,**612
auch wenn ich **612 sende dann klingeln alle Telefone.

Was ist nun falsch?

Gruß
gnaps
PureBasic Vollversion V 5.71 für Windows - Windows 10 (64)
gpphjs
Beiträge: 11
Registriert: 07.07.2006 13:35
Wohnort: 18374 Seeheilbad Zingst

Re: FritzBox Wahlhilfe

Beitrag von gpphjs »

Hallo gnaps, tut mir leid, ich habe selber gemerkt, dass da was faul ist. Ich hatte weiter oben ja schon geschrieben, dass ich mein WLAN mit dem PC automatisch vor dem Runter fahren abstellen will. Ich habe alles versucht und bin dann auf die Möglichkeit #96*0* mit der Fritzbox zu wählen. Das Ergebnis ist ein Programm, dass Dir vielleicht hilft, mir aber nicht, weil es so nicht geht.
Zum Programm: Die Antwort der Fritzbox wird nach jedem Aufruf von SeiteLaden(Seite.s) auf test.html geschrieben. Die Antwort ist aber nicht immer Html, sondern auch xml oder lua? Mit Wordpad kann man das aber gut formatiert lesen. Um dahinter zu kommen muss man die schritte einzeln durchführen, also
1. SeiteLaden("/login_sid.lua") laufen lassen
2. test.html Datei ansehen und gegebenenfalls unter anderen Namen speichern
3. SessionID = fbSID() laufen lassen
4. jetzt ist die test.html überschrieben und man kann schön sehen wie das mit der SessionID läuft
Der Link https://avm.de/fileadmin/user_upload/Gl ... ion_ID.pdf erklärt den Rest
Man kann die Sting-Operationen auch direkt im RAM machen, aber diese Methode ist genauso einfach und die Datei test.html ist sehr hilfreich.
Wenn Du SeiteLaden("/fon_num/dial_foncalls.lua?sid="+SessionID) eingibst, bekommst Du einen Sack voll Programmcode, den ich auch nicht durchschaue. Ich habe erfolgreich den „lua“-Befehl „dial=*****2&“vermutet und ausprobiert.“orig_port=**611&“ habe ich genommen, weil die Box mit „orig_port=...“ antwortet, aber die Eingabe ist bestimmt nicht richtig, denn mit der Option „port=...& läuft es auch und bei “orig_port=**611&“ wird der Port in der Box auch noch verändert.
Ich habe AVM angeschrieben, ob ich eine Antwort bekomme? Jedenfalls mach ich erst mal Pause, wenn Du nicht weißt warum, dann durchforste doch die test.html nach Eingabe von SeiteLaden("/fon_num/dial_foncalls.lua?sid="+SessionID)
Antworten