Автобиография
Програми
Web Blog B
 
O Y A N   B O Y C H E
V Скинове & Fonts
Книга за Гости Игри
Лични Снимки Михаел Шумахер
Моите Приятели       Връзки
Меню
   
Инфо
 
Вашето IP:
 18.222.125.171
 
Дата и час:
26 Април 2024
17:41:44
 
Последна актуализация:
04 Януари 2024
 
Вие сте посетител №:
04.2024г. 2367
(2024г.) (0)

Посетители - ботове:
04.2024г. 2367
(2024г.) (12039)

 
 

Valid XHTML 1.0 Transitional

 
Новини
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


<< Назад
© Боян Бойчев