Kommunikation mit Fritzbox 7170

Begonnen von Tom0711, 21 März 2017, 10:07:39

Vorheriges Thema - Nächstes Thema

tupol

Zitat von: Tom0711 am 01 April 2017, 21:16:24

Gibts ne Möglichkeit, die RAW-Kommunikation mitzuschneiden? Bzw. sich interaktiv mit dem TR064-Anschluss zu verbinden. Auf welchem Port horcht die Box denn? Wo gibts denn die Protokollspezifikation?
Bei Dir scheitert leider schon das Anmelden. Das Module nutzt dazu die Routine aus "FritzBoxUtils.pm"
Eventuell kannst Du da ein paar "log ..." von Hand einfügen und mal nachsehen, was Du von der Fritzbox tatsächlich zurückbekommst.Derzeit wird immer die SID 1 zurückgeben. Das macht aber irgendwie keinen Sinn.

Die Spezi gibt's bei AVM  (siehe auch die fhemwiki) bzw. im Internet.
FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwickler von: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

Tom0711

Ja, komplettes update.

Gestern abend angeschubstes "update" wurde mit "nothing to be done" quittiert.
Dann sollte alles aktuell sein, richtig?

Alles weitere muss ich vermutlich bis zum Wochenende aufschieben.

Gruß

Tom0711

Also:

Ich habe folgende Änderungen in "FritzBoxUtils.pm" vorgenommen:


FB_doCheckPW($$$)
{
 
  my ($host, $user, $pw) = @_;
  my $data = GetFileFromURL("http://$host/login_sid.lua", undef, undef, 1);
  Log3 undef,3,"GetFileFromURL(\"http://\$host/login_sid.lua\", undef, undef, 1):\n $data";
  return undef if(!$data);

  my $chl;
  $chl = $1 if($data =~ /<Challenge>(\w+)<\/Challenge>/i);
  my $chlAnsw .= "$chl-$pw";
  $chlAnsw =~ s/(.)/$1.chr(0)/eg; # works probably only with ascii
  $chlAnsw = "$chl-".lc(md5_hex($chlAnsw));

  if($data =~ m/iswriteaccess/) {      # Old version
    my @d = ( "login:command/response=$chlAnsw",
              "getpage=../html/de/internet/connect_status.txt" );
    $data = join("&", map {join("=", map {urlEncode($_)} split("=",$_,2))} @d);
    Log3 undef,3,"GetFileFromURL(\"http://\$host/cgi-bin/webcm\", undef, $data, 1):\n";
    $data = GetFileFromURL("http://$host/cgi-bin/webcm", undef, $data, 1);
    Log3 undef,3,"$data";
    my $isOk = ($data =~ m/checkStatus/);
    return $isOk;

  } else {                            # FritzOS >= 5.50
    my @d = ( "response=$chlAnsw", "page=/login_sid.lua" );
    $data = join("&", map {join("=", map {urlEncode($_)} split("=",$_,2))} @d);
    my $url = "http://$host/login_sid.lua";
    $url .= "?username=$user" if($user);
    Log3 undef,3,"GetFileFromURL($url, undef, $data, 1):\n";

    $data = GetFileFromURL($url, undef, $data, 1);
    Log3 undef,3,"$data";
    my $sid = $1 if($data =~ /<SID>(\w+)<\/SID>/i);
    $sid = undef if($sid =~ m/^0*$/);
    return $sid;
  }
}



folgendermaßen sieht der Log aus:

2017.04.15 23:26:16 3: GetFileFromURL("http://$host/login_sid.lua", undef, undef, 1):
<?xml version="1.0" encoding="utf-8"?>
<SessionInfo>
<iswriteaccess>0</iswriteaccess>
<SID>0000000000000000</SID>
<Challenge>f9a19be7</Challenge>
</SessionInfo>

2017.04.15 23:26:16 3: GetFileFromURL("http://$host/cgi-bin/webcm", undef, login%3acommand%2fresponse=f9a19be7%2d215144992465efc54df8e05570eda475&getpage=%2e%2e%2fhtml%2fde%2finternet%2fconnect%5fstatus%2etxt, 1):

2017.04.15 23:26:16 3: {
"checkStatus": "0"
}

2017.04.15 23:26:17 2: FRITZBOX Fritzbox: Readout_Run_Web.1327 Error: no session


hilft das irgendwie weiter?

tupol

#18
Nein. Leider kenne ich mich mit der alten 7170 und dem Login-Mechanismus nicht aus. Ich habe keine wirkliche Ahnung, wie man hier an die SID kommt.

Vielleicht kann Rudi hier noch ein paar klärende Worte oder Links einwerfen?

Edit: Sicherheitshalber eine Frage. Du hast bei Deinem Beispiel ein Passwort in FHEM und in der Fritzbox gesetzt. Oder?
FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwickler von: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

Tom0711

Kurz und knapp:

Ja, habe ich. Ich kann bei der Box übrigens keine Benutzer/Passwort-Kombination einrichten.

Ab welcher Fritzbox sollte das ganze denn sicher funktionieren?

Gruß, Thomas

tupol


Bei Boxen mit firmware >=5.5. Kleiner sollte auch gehen, wenn man denn die SID bekommt.
FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwickler von: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

Tom0711

#21
So,

ich habe mal ein bisschen gesucht. Im Folgenden Dokument ist der Login-Prozess beschrieben:

https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AVM_Technical_Note_-_Session_ID.pdf

folglich besagt, die Session-ID 0 und der Wert von iswriteaccess erstmal, dass ein Login erforderlich ist. Ich werde mir das bei Gelegenheit anschauen, ob die Implementierung im FritzBoxUtils.pm zum beschriebenen Verfahren passt. Auf den ersten Blick siehts schon so aus, aber scheinbar geht ja etwas schief. Mal sehen, ob was bei rauskommt. Zusätzlich zum vorliegenden Problem muss ich nämlich generell mit Perl kämpfen. Grausame Sprache (wenn mans nicht kann).......

Thomas

EDIT: Sehe gerade, dass meine Fritzbox wohl zu alt für diese Implementierung ist. Da ich FW < 5.50 habe, müsste ich wohl die  login_sid.xml abrufen und alles etwas modifizieren. Vielleicht klappts ja. Falls ja, stelle ich natürlich alles gerne zur Verfügung. Ob ich das so sauber hinbekomme, dass die bisherige Funktionalität ncht eingeschränkt wird, bleibt abzuwarten ;)

Tom0711

So, ein bisschen probiert, jetzt geht es  8)

Mir scheint, als wäre der Code für Firmwares < Fritz!OS 5.50 nie fertig implementiert worden.

so funktionierts:

my @d = ( "login:command/response=$chlAnsw",
              "getpage=../html/login_sid.xml" );
    $data = join("&", map {join("=", map {urlEncode($_)} split("=",$_,2))} @d);
    Log3 undef,3,"GetFileFromURL(\"http://$host/cgi-bin/webcm\", undef, $data, 1):\n";
    $data = GetFileFromURL("http://$host/cgi-bin/webcm", undef, $data, 1);
    Log3 undef,3,"$data";
    my $sid = $1 if($data =~ /<SID>(\w+)<\/SID>/i);
    $sid = undef if($sid =~ m/^0*$/);
    return $sid;


im "alten Code" wurde die login-url nicht angefragt und $sid gar nicht zurückgeliefert.


my @d = ( "login:command/response=$chlAnsw",
              "getpage=../html/de/internet/connect_status.txt" );
    $data = join("&", map {join("=", map {urlEncode($_)} split("=",$_,2))} @d);
    Log3 undef,3,"GetFileFromURL(\"http://\$host/cgi-bin/webcm\", undef, $data, 1):\n";
    $data = GetFileFromURL("http://$host/cgi-bin/webcm", undef, $data, 1);
    Log3 undef,3,"$data";
    my $isOk = ($data =~ m/checkStatus/);
    return $isOk;


Ist es möglich, den Code (nach Prüfung durch nen Profi) in den offiziellen code zu übernehmen? Dann müsste ich nicht aufpassen, dass bei nem update nichts überschrieben wird.

Jetzt brauch ich nur noch mein Kabelgebundenes Wandtablet zum WLAN wieder anschalten ;)

Gruß und danke an alle, Thomas

tupol

#23

Warum war die sid nicht in deinem vorherigem post?

2017.04.15 23:26:16 3: {
"checkStatus": "0"
}

FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwickler von: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

Tom0711

#24
Ich nehme an, wegen:

my @d = ( "login:command/response=$chlAnsw",
              "getpage=../html/de/internet/connect_status.txt"


Hier wird also gar nicht login_sid.xml aufgerufen. Ob das über connect_status.txt gehen sollte, weiß ich nicht.
Dann wird ja auch kein <SID>-tag zurückgemeldet, sondern eben checkStatus, sieht man ja im Log.

Thomas

Tom0711

Wen müsste ich für die Änderung in FritzBoxUtils.pm denn ansprechen?
Rudolf König?

tupol

FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwickler von: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

AET_FHEM

Hallo,

ich habe zwei Fritzboxen im Netzwerk unter anderem will ich mit der 7170 kommunizieren das hab ich auch soweit geschafft
box_fwVersion 29.04.88

aber ich hab in den Readings immer
Alarm 1 er
Alarm 2 er
.....

Mein Log bringt
Argument "er" isn't numeric in array element at ./FHEM/72_FRITZBOX.pm line 1929

=> meine andere 7362 hatte auch den selben fehler bei der konnte ich aber eine Labor Version installieren seit dem läuft diese aber bei der 7170 hab ich leider keine Labor Version gefunden, wie macht ihr das ???

AET_FHEM


tupol

Das muss ich im Modul ändern. Bin noch nicht dazu gekommen.
FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwickler von: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2