WLan Status aus Fritzbox lesen

Hallo zusammen,

natürlich kann ich mein WLAN über die Skripte von RWN aus- und einschalten. Da ich das WLAN aber hin und wieder auch über das Telefon oder die FRITZ-Html-Oberfläche schalte, hat es mich gestört, dass das keine Auswirkung auf die Anzeige in IPS hat. Deshalb habe ich ein Skript zusammengefummelt, das den Status des WLAN aus der Box ausliest. Durch zyklisches Pollen des Skriptes kann der aktuelle Zustand angezeigt werden. Vielleicht kann’s ja jemand gebrauchen…

<?
$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
$password    = '*****';
include "logging.php";

$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($login);

if($session_status_simplexml->iswriteaccess == 1)
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, "login:command/response={$response}&getpage=../html/de/menus/menu2.html");
    preg_match('/name="sid" value="([0-9a-f]*)"/', curl_exec($ch), $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}
curl_close($ch);
$log = file_get_contents("http://fritz.box/system/syslog.lua?tab=internet&sid=".$SID);
$such="wlan:settings/ap_enabled";
$v=substr(strstr($log,$such),0,28);
$status=substr($v,-1);
IF ($status==1)
{
	SetValue(57813 /*[Telefon u. Internet\FritzBox\WLAN Status Box]*/,TRUE);
	SetValue(11181 /*[L A N \WLAN]*/,TRUE);
}
ELSE
{
	SetValue(57813 /*[Telefon u. Internet\FritzBox\WLAN Status Box]*/,FALSE);
	SetValue(11181 /*[L A N \WLAN]*/,FALSE);
}
?>

Have fun!

Walter

Hallo Walter,

bei meiner FritzBox 7270 mit dem Fritz OS 5.5 lief Dein Skript so leider nicht.
Ich habe mir aber Deine Grundidee zu nutze gemacht und folgendes verändert (nach der allseits bekannten Anmeldeprozedur…):

		{
		$log = file_get_contents("http://".$IP."/system/syslog.lua?&sid=".$SID);
		$result = (bool)(trim(substr(strstr($log,'["WLAN"] ='),10,5)));
		}

Joachim

Nachtrag: Irgendetwas funktioniert da noch nicht korrekt! Da muss ich noch mal ran…

Hi,

habe gestern mal mit

$log = file_get_contents("http://fritz.box/home/home.lua?tab=home&sid=".$SID)

experimentiert. Dort sind ein Haufen Einstellungen zu finden, die man auch zur Visualisierung in IPS nutzen kann. Unter anderem auch die Wlan Stati. Schau mal, ob das in Deiner Version evtl. auch funktioniert.

Gruß
Walter

Hallo Walter,

wie heißt es so schön bei der Feuerwehr: „Ich erkunde und melde mich dann zurück!“…:wink:

Vielen Dank für den Dankanstoss!

Joachim

Hallo Zusammen,
gibt es inzwischen eine Lösung für das Auslesen des Status? Ich versuche mic hauch gerade daran und komme nicht weiter.

Gruß
Steffen

Hallo Steffen,

von mir leider noch nicht - leider habe ich derzeit diverse andere „Baustellen“…

Joachim

Hallo Zusammen,
da ich nun angefuchst war, habe ich mich an die Problemlösung gemacht und meine ersten eigenen Script Schnipsel zusammengeschrieben.

Das Script liest den aktuellen Status des WLANs aus und unterscheidet zwischen 2,4 GHz, 5 GHz und dem Gast WLAN.


<?

$fritzbox_Password = 'xxxxxxxxxxxxxxxxx';

$ch = curl_init('http://fritz.box/login_sid.lua');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($login);
if ($session_status_simplexml->SID != '0000000000000000')
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $fritzbox_Password, "UCS-2LE", "UTF-8"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, "response={$response}&page=/login_sid.lua");
    $sendlogin = curl_exec($ch);
   $session_status_simplexml = simplexml_load_string($sendlogin);
   if ($session_status_simplexml->SID != '0000000000000000')
       {
       $SID = $session_status_simplexml->SID;
       }
   else
       {
       echo "Fehler: Login fehlgeschlagen";
       return;
       }
}
curl_close($ch);

$StatusPage = file_get_contents('http://fritz.box/wlan/wlan_settings.lua?sid='.$SID);

/*["wlan:settings/ap_enabled"] = "0",
  ["wlan:settings/ap_enabled_scnd"] = "0",
  ["wlan:settings/guest_ap_enabled"] = "0",*/

$wlan_5GHz = (bool)(trim(substr(strstr($StatusPage,'["wlan:settings/ap_enabled_scnd"] ='),37,1)));
$wlan_24GHz = (bool)(trim(substr(strstr($StatusPage,'["wlan:settings/ap_enabled"] ='),32,1)));
$wlan_Gast = (bool)(trim(substr(strstr($StatusPage,'["wlan:settings/guest_ap_enabled"] ='),38,1)));

SetValueBoolean(19390 /*[Technik\Fritzbox\WLAN 5 GHz]*/ , $wlan_5GHz);
SetValueBoolean(29676 /*[Technik\Fritzbox\WLAN 2.4 GHz]*/ ,$wlan_24GHz);
SetValueBoolean(28466 /*[Technik\Fritzbox\Gast WLAN]*/ ,$wlan_Gast);

?>

Viel Spaß damit.

Gruß
Steffen

Hallo TheEldar,

das Script funktioniert mit meiner Fritzbox 7490 richtig gut. Das einzige was nicht ausgelesen werden kann ist der Status der Guest WLAN´s.

Hast Du Dein Script mit dem akuellen FritzOS auch am laufen?

VG

Thorsten

Hallo zusammen,

FB 7490 OS 06.20

hätte Interesse, das WLAN einer o.g. FB zu schalten.

Hat das schon jemand implementiert?

Fritzbox 7490 6.20

Wlan Gast Zugang schalten

<?
include "fritzbox.php";
$ch = curl_init("http://192.168.178.1/wlan/guest_access.lua?sid={$SID}");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  $rc1=curl_setopt($ch, CURLOPT_POSTFIELDS, "autoupdate=on". (true == "on" ? "&activate_guest_access=on&guest_ssid=FRITZ%21Box+Gastzugang&sec_mode=4&wpa_key=123456789876543210&push_service=on&group_access=on&down_time_activ=on&down_time_value=30" : "") ."&sid=" . $SID. "&btnSave=");
   $rc2=curl_exec($ch);
   curl_close($ch);

?>

Hallo JensNRW,

danke für den Code.

Wie schalte ich den Gastzugang wieder aus?

Und wie schalte ich vorher das WLan generell ein? und wieder aus?

Hallo Wolfgang

ich trigger das Skript bei Bewegung im Treppenhaus !

Der Gastzugang wird automatisch (wenn kein Client verbunden) nach 30 Minuten wieder Deaktiviert.

down_time_value=30" 

Mein WLan ist immer an,Weil mein IPS Server ,halt über Wlan verbunden ist.

Hallo,

ich wollte mir auch den WLAN Status einrichten, hat auch super geklappt. Beim Gastzugang tue ich mich jedoch sehr schwer. Ich erhalte immer den Fehler in Bezug auf das Script Zeile 2.
Was ist die fritzbox.php?
Ist dies das Script zum Auslesen vom WLAN oder welches ist das? Weil so ist es bei mir ja nicht vorhanden.

Vielen Dank!
Gruß, Tom

EDIT: ich glaube ich habe doch noch einen Fehler im Auslesen des Status laut diesem Script hier:
http://www.ip-symcon.de/forum/threads/20949-WLan-Status-aus-Fritzbox-lesen?p=191348#post191348

Error in Script 30417.ips.php on Line 32
Line 32: $StatusPage = file_get_contents(‚http://fritz.box/wlan/wlan_settings.lua?sid=‘.$SID);

Ich bitte auch hierzu um Hilfe!
Vielen Dank,
Tom

Hallo Eisern,

denke die fritzbox.php ist das LoginScript.

Das 2. Script läuft bei mir durch. Was passiert denn wenn Du http://fritz.box/wlan/wlan_settings.lua über den Browser aufrufst?

Hallo Wolfgang,

zuerst ein gesundes, neues Jahr allen!

Dann danke für deine Rückmeldung.
Wenn ich die Seite aufrufe erscheint bei mir die LoginSeite auf der ich das Passwort setzen muss. Danach komme ich auf die Seite WLAN/Funknetz

Ich hatte mich schon mit meinen geringen Fähigkeiten gewundert dass das PW nicht im Script enthalten ist, wie in den anderen Scripts der Anruferliste zum Beispiel.
Kann ich mir daher einfach das Script so anlegen und was muss da rein?

$fritzbox_Adresse = 'fritz.box'
$fritzbox_Password = 'abcd123'

Oder wie könnte das Passwort in das Script für den Gastzugang eingearbeitet werden? Hierfür reichen meine Kenntnisse absolut nicht aus.

Vielen Dank.
Gruß, Tom

Hallo Eisern,

das mit der URL stimmt so weit.

in dem Script http://www.ip-symcon.de/forum/thread…348#post191348 reicht es wenn Du
$fritzbox_Password = ‚xxxxxxxxxxxxxxxxx‘;
anpasst. Dann läufts bei mir ohne Fehler durch. Da ist die Loginroutine schon drin. Mehr hab ich aber nicht getestet.

In Deinem „kurzen“ Script ist die LoginRoutine in die „fritzbox.php“ (kann bei jedem anders heissen) ausgelagert. Das macht Sinn, da, wenn Du was daran änderst, Du nicht alle Scripte anpassen musst, sondern nur eins.

Meine Login.php sieht so aus:

<?

$ch = curl_init('http://' . $fritzbox1 . '/login_sid.lua');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);

$session_status_simplexml = simplexml_load_string($login);


if ($session_status_simplexml->SID != '0000000000000000')
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $FPPass, "UCS-2LE", "UTF-8"));

   curl_setopt($ch, CURLOPT_POSTFIELDS, "response={$response}&page=/login_sid.lua");
    $sendlogin = curl_exec($ch);
//   curl_close($ch);
   $session_status_simplexml = simplexml_load_string($sendlogin);

   if ($session_status_simplexml->SID != '0000000000000000')
   {
   $SID = $session_status_simplexml->SID;
//   echo "Login erfolgreich
";
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen
";
      return;
    }
}
curl_close($ch);

?>

Wobei ich die variablen $fritzbox1 mit der Fritzbox IP und $FPPass mit dem Passwort in der __autoload.php gespeichert habe. Kannst aber auch in dem Loginscript definieren.

Hallo Wolfgang,

vielen Dank für die ausführliche Information.
Ich werde mich am WE mal damit beschäftigen.

Grüße aus Berlin,
Tom

Hallo Wolfgang,

vielen Dank für Deine Hilfe, aber ehrlich gesagt steige ich da nicht durch.

In dem von Die verlinkten Beitrag ist mir das ja klar das ich das Passwort da ändern muss, es ging mir aber um den Beitrag
WLan Status aus Fritzbox lesen
Das mit dem Auslesen klappt ja alles. Der WLAN Gastzugang interessiert mich noch.

Hier wird ja mit „include“ eines weiteren Scripts gearbeitet.
Könntest Du mir zum Verständnis kurz darstellen wie

a) das include verändert werden müsste wenn die Daten hier direkt angegeben werden, also nicht auf ein weiteres Script verwiesen wird

b) ein einfaches fritzbox.php Anmeldescipt aussieht?

Ich denke Deine Variante ist schon sowas wie die ChampionLeaque welche ich noch nicht verstehe.

Vielen Dank!
Gruß, Tom

EDIT:
Hab mal was probiert und was aus den anderen Scripten der Fritzbox entnommen.

<?
$fritzbox_Password = 'PASSWORT';

$ch = curl_init("http://fritz.box/wlan/guest_access.lua?sid={$SID}");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  $rc1=curl_setopt($ch, CURLOPT_POSTFIELDS, "autoupdate=on". (true == "on" ? "&activate_guest_access=on&guest_ssid=FRITZ%21Box+Gastzugang&sec_mode=4&wpa_key=123456789876543210&push_service=on&group_access=on&down_time_activ=on&down_time_value=30" : "") ."&sid=" . $SID. "&btnSave=");
   $rc2=curl_exec($ch);
   curl_close($ch);

?>

Reicht das so?

Hallo Eisern,

ChampionLeaque bin ich nicht, höchstens RegionalLiga. Was ich gepostet hab ist alles nicht auf meinem Mist gewachsen, sondern kommt alles hier aus dem Forum.

Aber OK.

Erstell ein neues Script. kopier folgenden Inhalt rein:

<?
$fritzbox  = fritz.box;
$fritzboxPW = "dein passwort";

$ch = curl_init('http://' . $fritzbox . '/login_sid.lua');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);

$session_status_simplexml = simplexml_load_string($login);


if ($session_status_simplexml->SID != '0000000000000000')
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' .$fritzboxPW, "UCS-2LE", "UTF-8"));

   curl_setopt($ch, CURLOPT_POSTFIELDS, "response={$response}&page=/login_sid.lua");
    $sendlogin = curl_exec($ch);
//   curl_close($ch);
   $session_status_simplexml = simplexml_load_string($sendlogin);

   if ($session_status_simplexml->SID != '0000000000000000')
   {
   $SID = $session_status_simplexml->SID;
//   echo "Login erfolgreich
";
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen
";
      return;
    }
}
curl_close($ch);

?>

Dann benennst Du das Script um in FBLogin.php. Im Scriptfenster 2. Button von links.

Dann ändertst Du dein Script ab auf:

 <?
include "FBLogin.php";

$ch = curl_init("http://".$fritzbox."/wlan/guest_access.lua?sid={$SID}");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  $rc1=curl_setopt($ch, CURLOPT_POSTFIELDS, "autoupdate=on". (true == "on" ? "&activate_guest_access=on&guest_ssid=FRITZ%21Box+Gastzugang&sec_mode=4&wpa_key=123456789876543210&push_service=on&group_access=on&down_time_activ=on&down_time_value=30" : "") ."&sid=" . $SID. "&btnSave=");
   $rc2=curl_exec($ch);
   curl_close($ch);
// -----------------------------------------------------------------------------
// aktuellen status abfragen
$StatusPage = file_get_contents('http://'.$fritzbox.'/wlan/guest_access.lua?sid='.$SID);
//echo $StatusPage."
";
$gastStatus = substr(strstr($StatusPage,'["wlan:settings/guest_ap_enabled"] ='),36,4);
$gastStatus = (int)str_replace('"','',$gastStatus);
echo "Gastzugang Status ".$gastStatus."
";
SetValue(47135, $gastStatus); // Variable anpassen!
?>

Aber: keine falschen Erwartungen. WLan muss vorher eingeschaltet sein. Das Script schaltet dann nur das Gast-WLan ein. Mit den Optionen:

  • Protokoll der An- und Abmeldungen der Geräte per E-Mail versenden (FRITZ!Box Push Service)
  • Internetanwendungen beschränken: Nur Surfen und Mailen erlaubt
  • automatisch deaktivieren nach 30 Minuten
    Es Schaltet das Gast-WLan nicht aus.
    Der Status nach Ausführung des Scripts wird in die IPS-Variable 47135 (anpassen! oder die Zeile auskommentieren) geschrieben.