プロバイダーとのネゴシエーションによって接続が失われることがあり、ADSLモデムはこの事実に気付かず、何もしませんでした。 私は他の方法を探さなければなりませんでした。
タスク :PPPoEセッションの再インストールを強制するために、接続が失われたときにADSLモデムをプログラムで再起動します。
以下のソリューションは、DリンクDSL 2640U ADSLモデムでテストされていますが、他のADSLモデムモデルに簡単に適応できると思います。
そのため、ソリューションは、プロバイダーのpingサイトの接続を5分ごとにチェックするphpスクリプトです。
pingがない場合は、ADSLモデムにリブートコマンドを送信します。
Windows XPを使用している場合、5分ごとにスクリプトを実行することは非常に問題です。 したがって、System Shedulerとして、無料のSplinterware
System Schedulerが使用されました。
簡単にするために、
denwerがコンピューターにインストールされ、すべてのファイルがZにあると仮定します。\ home \ inet-keeper \ www \
解決策:上記のディレクトリには、
1)System Schedulerから5分ごとに実行されるinet-keeper.batファイル
inet-keeper.batファイルは、同じ名前のphpスクリプトを起動します。
z:\usr\bin\php -n -f inet-keeper.php >> inet-keeper.log
2)inet-keeper.phpファイル
inet-keeper.phpファイルの内容:
<?php
set_time_limit(60*5);
$res = exec("ping google.com -n 10", $output, $var);
$output = date('r');
$output .= " ## Ping result: $var"; // 0- 1-Error
$output .= " ## $res";
if ($var || substr_count($res, '= 0ms') == 3) // In case like Minimum = 0ms, Maximum = 0ms, Average = 0ms
{
$error = true;
$output .= " ## Error detected!";
$output .= "\nRebooting modem...\n";
reboot_modem();
}
$output .= "\n";
if ($error) // or true)
echo $output;
function reboot_modem()
{
$log = send_request("getlog");
file_put_contents("logs\\" . date('YM-d_H-i-s') . ".html" ,$log);
send_request("reboot");
}
function send_request($r) {
$login = "admin";
$password = "admin";
$auth = base64_encode($login . ":" . $password);
$fp = fsockopen('192.168.1.1', 80, $errno, $errstr, 60);
if ($fp)
{
switch ($r) {
case "reboot":
$out = "GET /rebootinfo.cgi HTTP/1.0\r\n";
break;
case "getlog":
$out = "GET /logview.cmd HTTP/1.0\r\n";
break;
default:
return;
}
$out .= "Host: 192.168.1.1\r\n";
$out .= "Authorization: Basic $auth\r\n";
$out .= "Connection: Close\r\n\r\n";
//
fwrite($fp, $out);
$html = "";
while (!feof($fp)){
$part=fgets($fp);
$html.=$part;
}
fclose($fp);
}
return $html;
}
?>
プロバイダーのサイト(上記の例ではgoogle.com)がpingを停止すると、スクリプトはモデムを再起動し、
192.168.1.1 / rebootinfo.cgiページを開きます
モデムには認証が必要なため、send_request関数にはユーザー名とパスワードを指定する行があります
$login = "admin";
$password = "admin";
モデムがリロードされると、
1)inet-keeper.logファイルにそれについて書きます
2)logサブディレクトリ、モデムのシステムログページの内容(私の場合、ページ
192.168.1.1/logview.cmdの内容)