Я использую маршрутизатор FritzBox (я не знаю, распространен ли он за пределами Германии - если нет, вот ссылка на мой конкретный маршрутизатор: https://avm.de/produkte/fritzbox/fritzbox-7590/), который имеет встроенную функцию SmartHome для собственной очереди, которая использует DECT.
Для интеграции и управления этими устройствами Smart Home (особенно Smart Plug) существует API (AHA-API). Через интернет-статью (источник: https://www.heise.de/select/ct/2016/7/1459414791794586) Я нашел скрипт, который помогает мне включать и выключать его, включая его в другой скрипт, который теперь работает благодаря ответам на предыдущее сообщение.
В статье говорится, что я должен установить php5 и два расширения mbstring и SimpleXML. Сценарий ниже должен найти SID моего маршрутизатора и использовать его для дальнейшего использования. Но каждый раз, когда я запускаю скрипт и хочу повторить SID, я ничего не получаю. Есть только пустая строка:
pi@raspberrypi:~/AVM $ sudo php SIDauslesen.php
pi@raspberrypi:~/AVM $
Если я включу этот скрипт в другой скрипт php, я получу ошибку. Кто-нибудь знает, почему он не отражает SID и как это исправить?
P.S. Вот мой код:
<?php
//Login
$username="username"; //username
$password="password"; //password
$loginurl="http://fritz.box/login_sid.lua"; //Host, change if needed
//Login-Function
function get_sid ($loginurl,$username,$password) {
//Send initial Request to Fritzbox
$http_response = @file_get_contents($loginurl);
//Parse answer XML
$xml = @simplexml_load_string($http_response);
//check if there is an XMl object with Challange-tag
if (!$xml || !$xml->Challenge ) {
die ("Error: unexpected answer or communication error!\n");
}
//extract Challange and SID Tags of XML
$challenge=(string)$xml->Challenge;
$sid=(string)$xml->SID;
if (preg_match("/^[0]+$/",$sid) && $challenge ) {
$sid="";
//create Password string
$pass=$challenge."-".$password;
//UTF-16LE encoding of Password was succesful
$pass=mb_convert_encoding($pass, "UTF-16LE");
//md5hash
$md5 = md5($pass);
//create Response String
$challenge_response = $challenge."-".$md5;
//send Response to Fritzbox
$url=$loginurl."?username=".$username."&response=".$challenge_response;
$http_response = file_get_contents($url);
//parse Antwort XML
$xml = simplexml_load_string($http_response);
$sid=(string)$xml->SID;
if ((strlen($sid)>0) && !preg_match("/^[0]+$/",$sid)) {
//is not null, bingo!
return $sid;
}
}else {
//use exisiting SID if $sid is a hex string
if ((strlen($sid)>0) && (preg_match("/^[0-9a-f]+$/",$sid))) return $sid;
}
return null;
}
?>