|
|
|
Wake-on-LAN с помощта на PHP Как да събудим компютъра си по мрежата? | Неделя, 16 Септември 2007 Wake-on-LAN е компютърен мрежови стандарт, който позволява спрян компютър да бъде стартиран отдалечено по мрежата. Необходими са няколко предварителни изисквания, за да се активира услугата Wake-on-LAN. На първо място е необходимо вашето дъно (motherboard) да поддържа Wake-on-LAN, което за съвременните дъна е налице. На второ място трябва да се активира в BIOS възможността за събуждане по мрежата. Това става обикновено в сектор "Power Management". В най-добрия случай с това се изчерпва предварителните настройки по активиране на услугата. Съществуват разбира се и много особености, които може да спънат вашето начинание. Повече за тях може да разберете на http://en.wikipedia.org/wiki/Wake-on-LAN или на връзките отбелязани в края на статията. Оттук нататък остава да се справим с настройките на PHP и самия PHP скрипт, който позволява отдалеченото събуждане на вашата машина.
PHP скриптът описан по долу е копиран от php.net, използван е HTML код от друга страница и накрая са направени съвсем малки модификации от мен. Идеята ми е да дам цялостен пример, който работи при мен, а не да измислям вече измисленото.
Предварително условие, за да работи скрипта е PHP да бъде компилирано с подръжката на sockets библиотеката, т.е. --enable-sockets опцията при конфигуранети на PHP трябва да е зададена (при UNIX базираните ОС). При Windows е достатъчно разкоментирането на необходимия за това dll файл-библиотела в php.ini.
Процесът по отдалеченото стартиране на машина, с активиран Wake-on-LAN, се състои в изпращане на "магически пакет" до съответния компютър или до broadcast адреса на мрежата/подмрежата, в която се намира машината. Компютърът "слуша" с помощта на своята мрежова карта за този пакет и след необходимата му валидация се стартира. Повече за съдържанието на този пакет може да прочетете на връзките в края на статията.
Програмката написана на PHP се състои от два файла, един html (index.html) и един php (wol_wan.php) файл. Може да я изтеглите от тук.
index.html:
Цитат | <html>
<head> <title>Remote Wake-on-LAN</title>
<script language="JavaScript"> <!--
/////////////////////////////////////////////////////////////////////////////////////
//function: changeContent(item, array, ids) //author: Sören Boysen, http://www.boysen.be //purpose: looks for item in dim1 of 2D array and changes innerHTML of given ids // (these should all be one string, seperated simply by a comma (,) ) to // values of array at item. For each information in the dim2 array, an // attribute type can be specified by adding "|" and a unique attribute // type to it. Depending on the attribute type, different code can be // executed by the switch case in the function. If no attribute type is // specified, it defaults to the innerHTML property of the object.
function changeContent(item, array, ids) { var idsArray = ids.split(",");
var item_num = 0; var found_item = 0; while ( (item_num < array.length) && (found_item == 0) ) { if(array[item_num][0] == item) { found_item = 1; } else { item_num+=1; } }
var id_num = 0; while (id_num < idsArray.length) { // if no attribute type has been given, change value if(array[item_num][id_num].indexOf("|") == -1) { document.getElementById(idsArray[id_num]).value = array[item_num][id_num]; } else { // find out attribute type var type_arr = array[item_num][id_num].split("|"); // split value and attribute type at | var myType = type_arr[1]; // save attribute type in var myType var myValue = type_arr[0]; // save the actual information in var myValue
// execute code according to attribute type switch(myType) { case "name": document.getElementById(idsArray[id_num]).innerHTML = myValue; break; } } id_num+=1; } }
function woi(name) { changeContent(name, pcs, 'name,mac,ip,port'); }
var pcs = new Array(new Array( "localhost.example.com", "XX:XX:XX:XX:XX:XX", "localhost.example.com", "9" ) );
--> </script>
</head>
<body> <div align="center">
<h1>Remote Wake-on-LAN</h1>
<form name="myForm" action="wol_wan.php" method="post"> <table> <tr> <td style="width:500px; height:200px; background-color:#DDDDDD" align="center" valign="top"> <b>Custom settings</b>
<table> <tr> <td>MAC address:</td> <td><input size="40" name="mac" id="mac" value="XX:XX:XX:XX:XX:XX"></td> </tr> <tr> <td>Hostname:</td> <td><input size="40" name="ip" id="ip" value="localhost.example.com"></td> </tr> <tr> <td>Port:</td> <td><input size="40" name="port" id="port" value="9"></td> </tr> <tr> <td> </td> <td><input type="submit" value="Wake Up!"></td> </tr> </table> </td> <td style="width:300px; background-color:#DDDDDD" valign="top"> <div align="center"><b>Choose a PC</b></div> <ul style="list-style:none;"> <li><a href="#" id="name" onClick="woi(this.innerHTML)">localhost.example.com</a></li> </ul> </td> </tr> </table> </form>
</div> </body> </html> |
wol_wan.php:
Цитат | <?php
function wake($ip, $mac, $port) { echo "<center><h1>Remote Wake-on-LAN</h1></center>"; echo "<table cellpadding=\"5\" cellspacing=\"10\" border=\"2\">"; echo "<tr><td bgcolor=\"silver\"><b>IP:</b></td><td>".$ip."</td></tr>"; echo "<tr><td bgcolor=\"silver\"><b>MAC:</b></td><td>".$mac."</td></tr>"; echo "<tr><td bgcolor=\"silver\"><b>PORT:</b></td><td>".$port."</td></tr>"; echo "</table>";
echo " ";
echo "<table cellpadding=\"5\" cellspacing=\"10\" border=\"2\">"; echo "<tr><td bgcolor=\"silver\"><b>STATUS:</b></td></tr>"; echo "<tr><td>";
$nic = fsockopen("udp://" . $ip, $port); if($nic) { $mac_byte = explode(':', $mac); $packet = ""; for($i = 0; $i < 6; $i++) $packet .= chr(0xFF); for($j = 0; $j < 16; $j++) for($k = 0; $k < 6; $k++) $packet .= chr(hexdec($mac_byte[$k])); $ret = fwrite($nic, $packet); fclose($nic); if($ret) { echo "<font color=\"green\">Magic Packet sent successfully to $ip and $mac on port $port!</font>"; return true; } } else { echo "<font color=\"red\">Magic packet failed!</font>"; return false; }
echo "</td></tr>"; echo "</table>"; }
// Port number where the computer is listening. Usually, any number between 1-50000 will do. Normally people choose 7 or 9. if (isset($_POST['port'])) $port = $_POST['port']; else $port = "9";
// MAC Address of the listening computer's network device if (isset($_POST['mac'])) $mac = $_POST['mac']; else $mac = "XX:XX:XX:XX:XX:XX";
// IP address of the listening computer. Input the domain name if you are using a hostname (like when under Dynamic DNS/IP) if (isset($_POST['ip'])) $ip = gethostbyname($_POST['ip']); else $ip = gethostbyname("localhost.example.com");
wake($ip, $mac, $port)
?> |
Необходимо е да зададете вашите стойности за MAC address, Hostname и Port, за да заработи програмката за вас. Може спокойно да модифицирате PHP скрипта за вашите специфични нужди.
Полезни връзки по темата:
Публикувано в Софтуер | Редактирана на 13 Септември 2020 |
|
|
|
<< Назад
|
|
|
|